From 1c25e9adf09d36a34f01aa92d5bd4729331b3a0b Mon Sep 17 00:00:00 2001 From: nalquas Date: Mon, 19 Jul 2021 20:37:56 +0200 Subject: [PATCH 001/379] Added --version command line argument --- src/studio/studio.c | 6 ++++++ src/studio/studio.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/studio/studio.c b/src/studio/studio.c index 95911a88b..f37cea474 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -2059,6 +2059,12 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) setbuf(stdout, NULL); StartArgs args = parseArgs(argc, argv); + + if (args.version) + { + printf("%s\n", TIC_VERSION); + exit(0); + } impl.samplerate = samplerate; diff --git a/src/studio/studio.h b/src/studio/studio.h index e0c91e825..c7d3164c8 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -77,6 +77,7 @@ macro(fs, STRING, "=", "path to the file system folder") \ macro(scale, INTEGER, "=", "main window scale") \ macro(cmd, STRING, "=", "run commands in the console") \ + macro(version, BOOLEAN, "", "print program version") \ CRT_CMD_PARAM(macro) #define SHOW_TOOLTIP(FORMAT, ...) \ @@ -93,6 +94,7 @@ typedef struct bool nosound; bool cli; bool fullscreen; + bool version; s32 scale; char *fs; char *cart; From a52755cd746bdab6eb647134bd8f71d6ac475db8 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 20 Jul 2021 14:32:52 +0300 Subject: [PATCH 002/379] #1489: fixed multiple errors on ctrl+r --- src/studio/studio.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index f37cea474..ff2bc37a2 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1081,10 +1081,7 @@ void setStudioMode(EditorMode mode) EditorMode prev = impl.mode; if(prev == TIC_RUN_MODE) - { tic_core_pause(impl.studio.tic); - memset(&impl.studio.tic->ram.input, 0, sizeof(tic80_input)); - } if(mode != TIC_RUN_MODE) tic_api_reset(impl.studio.tic); From 7e1d69c9bb4229a4fc723b3bf4dfbaf7082d0192 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 20 Jul 2021 16:14:55 +0300 Subject: [PATCH 003/379] #1492: fixed png cart saving --- src/studio/studio.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index ff2bc37a2..4bcb02477 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1756,6 +1756,8 @@ static void renderStudio() tic_core_tick_start(impl.studio.tic); } + processShortcuts(); + switch(impl.mode) { case TIC_START_MODE: impl.start->tick(impl.start); break; @@ -1900,8 +1902,7 @@ static void studioTick() checkChanges(); tic_net_start(impl.net); #endif - - processShortcuts(); + processMouseStates(); processGamepadMapping(); From 5e1f93aa7c92294ccbacf9d2c9dfecd98b3f2379 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 20 Jul 2021 18:15:24 +0300 Subject: [PATCH 004/379] #1493: fixed icon on android --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 471 -> 446 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 384 -> 357 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 554 -> 503 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 719 -> 642 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 953 -> 789 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/build/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 53252841b8b4e3846adc297f33a00a8c031991e6..bab275f2071236b8e10df8ce39b2a65b79180039 100644 GIT binary patch delta 407 zcmV;I0cif$1HJ>0F@JbTL_t(|obB5&PQx%1#_<+0<^Y@k^#Y*I?By&>NT@Sn<7+em?p4X}`OAVv|hfF0NSg{&&TzZ2Q>EXV-22T`9er z@%Zto*q`k@91;Q+k{0Gs#pl+)lPX=>cm4VA3axwRGkm*b91k?qH!wCXtPJ=xGdB0x z)Q7*{x)%NU_)RE&(w)tp7dWx8@Nn>)ZFZ}*TNnN1@p->|xvpEsx2CW0>{Cc^IMCow z#w!)^+9zx4$vmg?+b2~{QU=;(pfDk}`NYjnMwW6B+@`tlzkfj#H!w0XGl2{QDFN&L zx;5hEt@_MYTf?7lfMrsyFW6ZdzTf$*Q@7o3tQN^O z0_t8+#oJ}7d~M2|Z)G*vHR0l84cll_gfagTe~DWM4f8+N_$ diff --git a/build/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/build/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 627cfc7cdf7bc68aa41e60c0acea2cd1f3af2c9c..1d92621b0b74268b72a1603fdecfdfc876c109de 100644 GIT binary patch delta 317 zcmV-D0mA-(1LXpcF@GOPL_t(&f$f+*4#F@Dg&&Bq2jB!%F97PyUe3aVgqRU4XDK@~ z5*GkYzyUf_CQEJ9G)dD?MfNvUvfJ2x&5r{Jf*=T-nVB4_s-nj_Y$)wmk|eQuX&xk$ zKeDj!X;pr;IgT2@<91TVG5!@zqF2CX4%7fplwopx?biT+_kZ)=ib>{xj?d*V%D~Ir zxz|pspGgUR3N%&?FN#uYQumwQc^bU}-U*~xjx@^$+kO2-fvJ%MrY8CXoc95h#u;Xi zouHM+)}P>~K&Vq`N9C>h0)7gpT(@5UdSy)Z4tRBB-U?7*a_LV21S3nR1LEy~~U@A$0W@udK P00000NkvXXu0mjfnEH@k delta 344 zcmV-e0jK`u0)PXMF@HKqL_t(&f$f?>3c@fDMH}g|2k->q1r*or^(?LgaV>5=OWnH` zynuQF50JIG5Qb^#l#Wf4e8^j+?GWZOpH7q1SZg!JCyNWybh9W58jrlCG7#_r@=UPJ zY`OQG%8%RSz%O}jjdp^s0K5QWt)()p%J6y~+c}M&_bY!y7Jo`_p_s^}2d~r4TN2~V zQ5DadFMI{y1&9`^HIzYFm7T&G8!mhW;01^ll9)^vG_ExoC-K^O;46>>geD0HO%f0q zcme80rfo(;G%pT(1>gmU7K&kk-(o*n;D^t$C-4H)Z=v)0P2(;$)5f=uwicsAZ6R(0 zZjUbUu1H&pF;Stm5GRIa7e0fYzze8Y$mfo$54_r3-|(5qEA|t+g?}z0000S84 zu6XZD?aS}mUqAWr{IznON~PO5X0c-o32Y3j4f$t$`Tgt0FQLeD@8i2p9pAeClHoz9 z)>-|G*4Lr}Ui+3!+sin?kbyi5*J^lX6c<)bmU$o1of$Q6-F>Kf9)>gq1Lg*x zv+6-+gRTFtb-|^rQ}11?Q;G(;mW?6Xj_u30_=~o`{;c}V`m4%{I|ZcY;pc|!yK{@? zSf@>ycE7p$$TYCp!^azLq#w7l-CmRZPB2;mWHgUF^P+p#`n+VX-<4AU39R`gQIPSw z>G_s_XUqF^Aub5@td9>6`JZmQyre&(^;d2F3qwPY)2k}VOaAn&eeHkc-DhQpdlX=y beC3Aynsxs3S6UqU$N&VMu6{1-oD!Mdw*U2kx%cc!ZR@vue!cF%}28J29*~C-ahlfyu_x#WAE} z&fB|&es>%s+7i{hcCw$~Toj`qXlgr0RrHcp>6B@k9p+1Qatrt!V2s%;l4(0FZU5Y_ zJeBi`#B&bs+w|r1=5Hp9Kx5&+U=sh@a)a~5FV{N1uH|3%YV*yvWo!GAuO9dPc51hx zf)bOG5{UTplIQn|S=;u-{>v$qiLLtcdG(jDm;bNT6s>#64v(E%b(Sgvagt=xGxzm~(d=HJKNFTZ(f z+eiDSpM#qOG;`PNLt$Yrc;CKymoj_RU%S}Lujiu6XVw0!+W6zwsjhwNw#BdB{bsMnORVK@c(V;qncaOhRVO^V|COUPYF%vk*iaC@ERTr7f9SB{lcI z5m+fi{n=$3rr-V>w)>q|e);VcPf;B4v%Ke7rQMZ3H81ZqY>l$tx-;zc?%arpCni9{ z85la}3|pt(TQ%#P--<8h-^*;ex6Rt-HK!34z#R?n7zQyO*neU>bk+a9T4d@k5Z}|) K&t;ucLK6Te7yjP> literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$a>cF%}28J29*~C-ahlfvMBe#WAE} z&fB{ib445_8Up2uDp&&;7cmML?p)c*aZ<@`$-1LYj(C_bggjs}+t%rMW8%J#hR^PG zyI1eN=P&$c*GJiHxw|Dk7;NfDl}U?vQepFMU8ULMW{Y?xB|(AC1`ie&B?TeIi5wkI zJ|$h6@Zsw1eq+7EeedJ#dv&BMmj}1?mO-Rl98};sif(MnEq_r`x_WcypFba}%FnKs zzwf5E)!O4ruZ!GVBs0O9cFrkXxO?{N$mv$m=kM45yT1KH`^4n;Sd2BwonTS%WZM26 zyKG+`_qDu~$ByPipmCSkIydjB_?cFI_QA!wnqj-=N2b|Mm+e4y9n?QW3!RqDje9%e zL)LfWM^lb(e2e5ys7Wce6h6KR>s~#>;*ZT6-4EA1;b8`~<7Cl&k3XN@)s>&sY@fFJ z?s=Ep&W8m3Kb?$hM-Pk0ya^UYQ=}!|o&Ds}-V!X+fBdfL^WWDKxj-?1?BY##6bg@6 z@_!F|>^lKfMoD4PLdQpU&wfq5&)yvN`=huuN;HBEvCO&s&ET<<@_rGU)0*v>{$F-3 z`}5z~eRgFDJPu*8z9IMaiCvn9j|odlF8jOw{MPIg4~s*5utb4yQXO;i=K!h4F($^q P6w2V~>gTe~DWM4f-7ga5 diff --git a/build/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/build/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index edeb6883fd40f5c18d21221d3ebe36e86249cd43..7a8d1fbf9aca34548b2affbc1d68d88cf1cc1064 100644 GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcaljKx9jP7LeL$-HD>U^?&V;uumf z=k48%xgw4X4uQ=a>lw5hOc<2Z%(n_CDkiyj>8h!_En-~2#C1dBGQ*vSThZs&{jYvG zckkl8f2A_r%*#tzfo5U@Id3n%VbnQoRCW4oZBO(6sINV9{FZz7CJXnc^E0FgF=R3+ z_%bZvY%pP*pvG`%-Wj)y%=GSMgn@iojbiQ2w{Jwv$k8i)Y-{LpVPdkP;Gtks;Yk$wY=F{)bzi&F<*t$I5 z-goc67k8H5{LPZaaES%g^eu4otnaFVdQ&MBb@0MY^~ Ap#T5? delta 570 zcmV-A0>%B62Dt~2Fn<69XF*Lt006O%3;baP00009a7bBm000&x000&x0ZCFM@Bjb< zPDw;TRCr$P-LZ;QR}_HZJGQq>lP3@x8^J+HXCI#>m7vzfHdP)V*vrAlNaJjR6`GmhS?+e)8{_*n`>6 zcl9pNYEF}o0UQ_G{VvemdymF+o~`YoZ0-8DwhOfS{y39>0X&nZ0TnL>tJF}IC|HhWCrON-4odFsN-x0?DViyQ@ zOp~1f85XqZU7&}LUyKP3hxcz@j%f|MK(LSilYs#l7t^~yv+mw|G^TBseJ{;wwfnPr zw`Z0Ulb`_{6E3d581q?9r_-1kW_MTIpM7xxla2u!7}(+PA9aqT*r~To5C8xG07*qo IM6N<$f}=+cxc~qF From 4fdbdec51a44b221160a1098be688f556f41400c Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 20 Jul 2021 18:48:13 +0300 Subject: [PATCH 005/379] #1490: fixed export game for win7 --- .github/workflows/build.yml | 27 +++++++++++++++++++++++++-- src/studio/screens/console.c | 6 ++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 79407d680..b488fd57c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: shell: cmd run: | cd build - cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% .. + cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. cmake --build . --config %BUILD_TYPE% --parallel - name: Deploy @@ -30,6 +30,12 @@ jobs: name: 'tic80-winxp-sdl' path: build/bin/tic80.exe + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: 'tic80-winxp-sdl-stub' + path: build/bin/tic80*.exe + # === Windows SDL2 === windows-sdl: runs-on: windows-latest @@ -493,10 +499,16 @@ jobs: # === Export === export: - needs: [windows-sdl, linux-sdl, rpi, macos-sdl, wasm] + needs: [winxp-sdl, windows-sdl, linux-sdl, rpi, macos-sdl, wasm] runs-on: ubuntu-latest steps: + - name: Download Windows XP artifact + uses: actions/download-artifact@v2 + with: + name: tic80-winxp-sdl + path: winxpdir + - name: Download Windows artifact uses: actions/download-artifact@v2 with: @@ -528,6 +540,7 @@ jobs: - name: Rename run: | + cp winxpdir/* winxp cp windir/* win cp linuxdir/* linux cp macdir/* mac @@ -540,6 +553,7 @@ jobs: with: name: 'tic80-export' path: | + winxp win linux mac @@ -555,6 +569,12 @@ jobs: script: [lua, moon, fennel, js, wren, squirrel] steps: + - name: Download Windows XP artifact + uses: actions/download-artifact@v2 + with: + name: tic80-winxp-sdl-stub + path: winxpdir + - name: Download Windows artifact uses: actions/download-artifact@v2 with: @@ -586,6 +606,7 @@ jobs: - name: Rename run: | + cp winxpdir/tic80${{ matrix.script }}.exe winxp${{ matrix.script }} cp windir/tic80${{ matrix.script }}.exe win${{ matrix.script }} cp linuxdir/tic80${{ matrix.script }} linux${{ matrix.script }} cp rpidir/tic80${{ matrix.script }} rpi${{ matrix.script }} @@ -599,6 +620,7 @@ jobs: with: name: 'tic80-export' path: | + winxp${{ matrix.script }} win${{ matrix.script }} linux${{ matrix.script }} rpi${{ matrix.script }} @@ -617,6 +639,7 @@ jobs: name: | tic80-rpi tic80-macos-sdl + tic80-winxp-sdl-stub tic80-windows-sdl-stub tic80-linux-sdl-stub tic80-rpi-stub diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index e0de08b6c..1b4564157 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -97,6 +97,7 @@ #define EXPORT_CMD_LIST(macro) \ macro(win) \ + macro(winxp) \ macro(linux) \ macro(rpi) \ macro(mac) \ @@ -1969,6 +1970,11 @@ static void onExport_win(Console* console, const char* param, const char* filena exportNativeGame(console, getFilename(filename, ".exe"), param, params); } +static void onExport_winxp(Console* console, const char* param, const char* filename, ExportParams params) +{ + exportNativeGame(console, getFilename(filename, ".exe"), param, params); +} + static void onExport_linux(Console* console, const char* param, const char* filename, ExportParams params) { exportNativeGame(console, filename, param, params); From 64baf44ed9a0fd406201de52e4fe496704369828 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 21 Jul 2021 18:10:19 +0300 Subject: [PATCH 006/379] #1499: fixed Android crash --- build/android/app/build.gradle | 2 +- src/studio/config.c | 2 -- src/system/sdl/main.c | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 6b9b7589a..ffc32fa5d 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -23,7 +23,7 @@ android { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } cmake { - arguments "-DBUILD_PRO=Off" + arguments "-DBUILD_PRO=Off", "-DCMAKE_BUILD_TYPE=MinSizeRel" } // cmake { // arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static" diff --git a/src/studio/config.c b/src/studio/config.c index 942ede0dc..9f22d1b1c 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -243,9 +243,7 @@ static void update(Config* config, const u8* buffer, s32 size) static void setDefault(Config* config) { - config->cart = malloc(sizeof(tic_cartridge)); memset(&config->data, 0, sizeof(StudioConfig)); - config->data.cart = config->cart; { diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index c04547fc2..9848a72ff 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -51,7 +51,6 @@ #if defined(__TIC_ANDROID__) #include -#define TOUCH_INPUT_SUPPORT #endif #if defined(TOUCH_INPUT_SUPPORT) From 84c4259e69a3b203027ea9ff5b70f5111f9d1b2a Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 22 Jul 2021 10:17:32 +0300 Subject: [PATCH 007/379] #1510: fixed big circles drawing --- src/core/draw.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/core/draw.c b/src/core/draw.c index de6b30b80..d2ac56929 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -532,12 +532,27 @@ static void drawSidesBuffer(tic_mem* memory, s32 y0, s32 y1, u8 color) } } +static void drawCirc(tic_mem* memory, s32 xm, s32 ym, s32 radius, u8 color, PixelFunc pix) +{ + s32 r = radius; + s32 x = -r, y = 0, err = 2 - 2 * r; + do { + pix(memory, xm - x, ym + y, color); + pix(memory, xm - y, ym - x, color); + pix(memory, xm + x, ym - y, color); + pix(memory, xm + y, ym + x, color); + r = err; + if (r <= y) err += ++y * 2 + 1; + if (r > x || err > y) err += ++x * 2 + 1; + } while (x < 0); +} + void tic_api_circ(tic_mem* memory, s32 x, s32 y, s32 r, u8 color) { if(r < 0) return; initSidesBuffer(); - drawEllipse(memory, x - r, y - r, x + r, y + r, 0, setElliSide); + drawCirc(memory, x, y, r, 0, setElliSide); drawSidesBuffer(memory, y - r, y + r + 1, color); } @@ -545,7 +560,7 @@ void tic_api_circb(tic_mem* memory, s32 x, s32 y, s32 r, u8 color) { if(r < 0) return; - drawEllipse(memory, x - r, y - r, x + r, y + r, mapColor(memory, color), setElliPixel); + drawCirc(memory, x, y, r, mapColor(memory, color), setElliPixel); } void tic_api_elli(tic_mem* memory, s32 x, s32 y, s32 a, s32 b, u8 color) From 5ead2af1b500ba28e0949249a788cb2f8fe9b6d3 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 22 Jul 2021 14:14:30 +0300 Subject: [PATCH 008/379] #1510: big circles fix by @ddelemeny --- src/core/draw.c | 91 ++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 51 deletions(-) diff --git a/src/core/draw.c b/src/core/draw.c index d2ac56929..0d3397cd7 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -477,34 +477,46 @@ static void setSideTexPixel(s32 x, s32 y, float u, float v) } } -static void drawEllipse(tic_mem* memory, s32 x0, s32 y0, s32 x1, s32 y1, u8 color, PixelFunc pix) +static void drawEllipse(tic_mem* memory, s64 x0, s64 y0, s64 a, s64 b, u8 color, PixelFunc pix) { - s32 a = abs(x1-x0), b = abs(y1-y0), b1 = b&1; /* values of diameter */ - s32 dx = 4*(1-a)*b*b, dy = 4*(b1+1)*a*a; /* error increment */ - s32 err = dx+dy+b1*a*a, e2; /* error of 1.step */ + if(a <= 0) return; + if(b <= 0) return; - if (x0 > x1) { x0 = x1; x1 += a; } /* if called with swapped pos32s */ - if (y0 > y1) y0 = y1; /* .. exchange them */ - y0 += (b+1)/2; y1 = y0-b1; /* starting pixel */ - a *= 8*a; b1 = 8*b*b; + s64 aa2 = a*a*2, bb2 = b*b*2; - do { - pix(memory, x1, y0, color); /* I. Quadrant */ - pix(memory, x0, y0, color); /* II. Quadrant */ - pix(memory, x0, y1, color); /* III. Quadrant */ - pix(memory, x1, y1, color); /* IV. Quadrant */ - e2 = 2*err; - if (e2 <= dy) { y0++; y1--; err += dy += a; } /* y step */ - if (e2 >= dx || 2*err > dy) { x0++; x1--; err += dx += b1; } /* x step */ - } while (x0 <= x1); - - while (y0-y1 < b) - { /* too early stop of flat ellipses a=1 */ - pix(memory, x0-1, y0, color); /* -> finish tip of ellipse */ - pix(memory, x1+1, y0++, color); - pix(memory, x0-1, y1, color); - pix(memory, x1+1, y1--, color); + s64 x = a, y = 0; + s64 dx = (1-2*a)*b*b, dy = a*a; + s64 sx = bb2*a, sy=0; + s64 e = 0; + + while (sx >= sy) + { + pix(memory, (s32)(x0+x), (s32)(y0+y), color); /* I. Quadrant */ + pix(memory, (s32)(x0+x), (s32)(y0-y), color); /* II. Quadrant */ + pix(memory, (s32)(x0-x), (s32)(y0+y), color); /* III. Quadrant */ + pix(memory, (s32)(x0-x), (s32)(y0-y), color); /* IV. Quadrant */ + y++; sy += aa2; e += dy; dy += aa2; + if(2*e+dx >0) { x--; sx -= bb2; e += dx; dx += bb2; } + } + } + + { + s64 x = 0, y = b; + s64 dx = b*b, dy = (1-2*b)*a*a; + s64 sx = 0, sy=aa2*b; + s64 e = 0; + + while (sy >= sx) + { + pix(memory, (s32)(x0+x), (s32)(y0+y), color); /* I. Quadrant */ + pix(memory, (s32)(x0+x), (s32)(y0-y), color); /* II. Quadrant */ + pix(memory, (s32)(x0-x), (s32)(y0+y), color); /* III. Quadrant */ + pix(memory, (s32)(x0-x), (s32)(y0-y), color); /* IV. Quadrant */ + + x++; sx += bb2; e += dx; dx += bb2; + if(2*e+dy >0) { y--; sy -= aa2; e += dy; dy += aa2; } + } } } @@ -532,51 +544,28 @@ static void drawSidesBuffer(tic_mem* memory, s32 y0, s32 y1, u8 color) } } -static void drawCirc(tic_mem* memory, s32 xm, s32 ym, s32 radius, u8 color, PixelFunc pix) -{ - s32 r = radius; - s32 x = -r, y = 0, err = 2 - 2 * r; - do { - pix(memory, xm - x, ym + y, color); - pix(memory, xm - y, ym - x, color); - pix(memory, xm + x, ym - y, color); - pix(memory, xm + y, ym + x, color); - r = err; - if (r <= y) err += ++y * 2 + 1; - if (r > x || err > y) err += ++x * 2 + 1; - } while (x < 0); -} - void tic_api_circ(tic_mem* memory, s32 x, s32 y, s32 r, u8 color) { - if(r < 0) return; - initSidesBuffer(); - drawCirc(memory, x, y, r, 0, setElliSide); + drawEllipse(memory, x, y, r, r, 0, setElliSide); drawSidesBuffer(memory, y - r, y + r + 1, color); } void tic_api_circb(tic_mem* memory, s32 x, s32 y, s32 r, u8 color) { - if(r < 0) return; - - drawCirc(memory, x, y, r, mapColor(memory, color), setElliPixel); + drawEllipse(memory, x, y, r, r, mapColor(memory, color), setElliPixel); } void tic_api_elli(tic_mem* memory, s32 x, s32 y, s32 a, s32 b, u8 color) { - if(a < 0 || b < 0) return; - initSidesBuffer(); - drawEllipse(memory, x - a, y - b, x + a, y + b, 0, setElliSide); + drawEllipse(memory, x , y, a, b, 0, setElliSide); drawSidesBuffer(memory, y - b, y + b + 1, color); } void tic_api_ellib(tic_mem* memory, s32 x, s32 y, s32 a, s32 b, u8 color) { - if(a < 0 || b < 0) return; - - drawEllipse(memory, x - a, y - b, x + a, y + b, mapColor(memory, color), setElliPixel); + drawEllipse(memory, x, y, a, b, mapColor(memory, color), setElliPixel); } static void ticLine(tic_mem* memory, s32 x0, s32 y0, s32 x1, s32 y1, u8 color, PixelFunc func) From e4c837293eca3ea0abd5223b47e5914a09fd5678 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 22 Jul 2021 15:18:17 +0300 Subject: [PATCH 009/379] #1494: don't watch the cart if only a section has been loaded --- src/studio/screens/console.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 1b4564157..21bcfac50 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -709,11 +709,12 @@ static void onLoadDemoCommandConfirmed(Console* console, ScriptLang script) free(data); } -static void onCartLoaded(Console* console, const char* name) +static void onCartLoaded(Console* console, const char* name, const char* section) { tic_api_reset(console->tic); - setCartName(console, name, tic_fs_path(console->fs, name)); + if(!section) + setCartName(console, name, tic_fs_path(console->fs, name)); studioRomLoaded(); @@ -774,7 +775,7 @@ static void loadByHashDone(const u8* buffer, s32 size, void* data) { tic_cart_load(cart, buffer, size); loadCartSection(console, cart, loadByHashData->section); - onCartLoaded(console, loadByHashData->name); + onCartLoaded(console, loadByHashData->name, loadByHashData->section); } if (loadByHashData->callback) @@ -904,7 +905,7 @@ static void onLoadCommandConfirmed(Console* console) { tic_cart_load(cart, data, size); loadCartSection(console, cart, section); - onCartLoaded(console, name); + onCartLoaded(console, name, section); } } else if(tic_tool_has_ext(param, PngExt) && tic_fs_exists(console->fs, param)) @@ -919,9 +920,9 @@ static void onLoadCommandConfirmed(Console* console) if(cart) SCOPE(free(cart)) { loadCartSection(console, cart, section); - onCartLoaded(console, param); + onCartLoaded(console, param, section); } - else printError(console, "\npng cart loading error"); + else printError(console, "\npng cart loading error"); } } else @@ -941,7 +942,7 @@ static void onLoadCommandConfirmed(Console* console) { tic_project_load(name, data, size, cart); loadCartSection(console, cart, section); - onCartLoaded(console, name); + onCartLoaded(console, name, section); } } else printError(console, "\nproject loading error"); @@ -982,9 +983,22 @@ static void onConfirm(bool yes, void* data) } static void confirmCommand(Console* console, const char** text, s32 rows, ConfirmCallback callback) -{ - CommandConfirmData data = {console, callback}; - showDialog(text, rows, onConfirm, MOVE(data)); +{ + if(console->args.cli) + { + for(s32 i = 0; i < rows; i++) + { + printError(console, text[i]); + printLine(console); + } + + commandDone(console); + } + else + { + CommandConfirmData data = {console, callback}; + showDialog(text, rows, onConfirm, MOVE(data)); + } } typedef void(*LoadDemoConfirmCallback)(Console* console, ScriptLang script); From bb121c8023e412919eb501ff7ecee5e8f115641b Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 22 Jul 2021 17:07:33 +0300 Subject: [PATCH 010/379] #1513: fixed tile cursor in the map editor --- src/studio/editors/map.c | 49 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index 9818d37d8..cfcb0421b 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -1051,35 +1051,34 @@ static void drawMapReg(Map* map) tic_mem* tic = map->tic; tic_rect rect = {MAP_X, MAP_Y, MAP_WIDTH, MAP_HEIGHT}; - if(!sheetVisible(map) && checkMousePos(&rect)) - { - if(tic_api_key(tic, tic_key_space)) - { - processScrolling(map, checkMouseDown(&rect, tic_mouse_left) || checkMouseDown(&rect, tic_mouse_right)); - } - else - { - static void(*const Handlers[])(Map*) = {processMouseDrawMode, processMouseDragMode, processMouseSelectMode, processMouseFillMode}; + bool handle = !sheetVisible(map) && checkMousePos(&rect); + bool space = tic_api_key(tic, tic_key_space); - Handlers[map->mode](map); + if(handle) + processScrolling(map, + ((space || map->mode == MAP_DRAG_MODE) && checkMouseDown(&rect, tic_mouse_left)) || + checkMouseDown(&rect, tic_mouse_right)); - if(map->mode != MAP_DRAG_MODE) - processScrolling(map, checkMouseDown(&rect, tic_mouse_right)); - } - } + { + s32 scrollX = map->scroll.x % TIC_SPRITESIZE; + s32 scrollY = map->scroll.y % TIC_SPRITESIZE; - s32 scrollX = map->scroll.x % TIC_SPRITESIZE; - s32 scrollY = map->scroll.y % TIC_SPRITESIZE; + map2ram(&tic->ram, map->src); - map2ram(&tic->ram, map->src); + initBlitMode(map); + tic_api_map(tic, map->scroll.x / TIC_SPRITESIZE, map->scroll.y / TIC_SPRITESIZE, + TIC_MAP_SCREEN_WIDTH + 1, TIC_MAP_SCREEN_HEIGHT + 1, -scrollX, -scrollY, 0, 0, 1, NULL, NULL); + resetBlitMode(map->tic); - initBlitMode(map); - tic_api_map(tic, map->scroll.x / TIC_SPRITESIZE, map->scroll.y / TIC_SPRITESIZE, - TIC_MAP_SCREEN_WIDTH + 1, TIC_MAP_SCREEN_HEIGHT + 1, -scrollX, -scrollY, 0, 0, 1, NULL, NULL); - resetBlitMode(map->tic); + if (map->canvas.grid || map->scroll.active) + drawGrid(map); + } - if(map->canvas.grid || map->scroll.active) - drawGrid(map); + if(handle && !space) + { + static void(*const Handlers[])(Map*) = {processMouseDrawMode, processMouseDragMode, processMouseSelectMode, processMouseFillMode}; + Handlers[map->mode](map); + } } static void undo(Map* map) @@ -1283,8 +1282,8 @@ static void overline(tic_mem* tic, void* data) { tic_rect rect = {MAP_X, MAP_Y, MAP_WIDTH, MAP_HEIGHT}; - if(!sheetVisible(map) && checkMousePos(&rect)) - { + if(!sheetVisible(map) && checkMousePos(&rect) && !tic_api_key(tic, tic_key_space)) + { switch(map->mode) { case MAP_DRAW_MODE: From 4290572fe92f4cde0aafe231beb66dc2384bccab Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 23 Jul 2021 12:53:26 +0300 Subject: [PATCH 011/379] #1517: fixed "Cart has changed" dialog --- src/studio/screens/console.c | 2 +- src/studio/studio.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 21bcfac50..5ef4b2239 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -997,7 +997,7 @@ static void confirmCommand(Console* console, const char** text, s32 rows, Confir else { CommandConfirmData data = {console, callback}; - showDialog(text, rows, onConfirm, MOVE(data)); + showDialog(text, rows, onConfirm, MOVE(data)); } } diff --git a/src/studio/studio.c b/src/studio/studio.c index 4bcb02477..57a9a2860 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1622,6 +1622,8 @@ static void reloadConfirm(bool yes, void* data) { if(yes) impl.console->updateProject(impl.console); + else + updateMDate(); } static void checkChanges() From 13b0ec9815522d9206bb78672c90dd79365b8aa2 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 27 Jul 2021 15:16:19 +0300 Subject: [PATCH 012/379] new version message fix --- src/studio/screens/console.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 5ef4b2239..e3aceda29 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -3348,10 +3348,11 @@ static void onHttpVesrsionGet(const net_get_data* data) (version.major == TIC_VERSION_MAJOR && version.minor == TIC_VERSION_MINOR && version.patch > TIC_VERSION_REVISION)) { char msg[TICNAME_MAX]; - sprintf(msg, " new version %i.%i.%i available\n", version.major, version.minor, version.patch); + sprintf(msg, " new version %i.%i.%i available", version.major, version.minor, version.patch); enum{Offset = (2 * STUDIO_TEXT_BUFFER_WIDTH)}; + memset(console->text + Offset, ' ', STUDIO_TEXT_BUFFER_WIDTH); strcpy(console->text + Offset, msg); memset(console->color + Offset, tic_color_red, strlen(msg)); } From 89c15a7bc9abfbd2382adf5b0c5b5d3124e44134 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 27 Jul 2021 15:25:27 +0300 Subject: [PATCH 013/379] #1515: PLAY FROM NOW plays whole track --- src/studio/editors/music.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/studio/editors/music.c b/src/studio/editors/music.c index c1fd84363..2dd93776e 100644 --- a/src/studio/editors/music.c +++ b/src/studio/editors/music.c @@ -516,13 +516,11 @@ static void setParam2(Music* music, u8 value) row->param2 = value; } -static void playFrameRow(Music* music) +static void playTrackRow(Music* music) { tic_mem* tic = music->tic; tic_api_music(tic, music->track, music->frame, music->tracker.edit.y, true, music->sustain, -1, -1); - - setMusicState(music, tic_music_play_frame); } static void playFrame(Music* music) @@ -1427,7 +1425,7 @@ static void processKeyboard(Music* music) { stopped ? (shift && music->tab == MUSIC_TRACKER_TAB - ? playFrameRow(music) + ? playTrackRow(music) : playFrame(music)) : stopTrack(music); } @@ -1818,7 +1816,7 @@ static void drawPlayButtons(Music* music) tic_icon_playnow, "PLAY FROM NOW ...", "... [shift+enter]", - playFrameRow, + playTrackRow, }, { From bb13d132e33caca979621876f391bfd126677d76 Mon Sep 17 00:00:00 2001 From: pancake Date: Wed, 28 Jul 2021 12:50:41 +0200 Subject: [PATCH 014/379] Handle emacs ^n ^p and ^e keys in the editor --- src/studio/editors/code.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index 0534d348d..16a832dc8 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -688,6 +688,15 @@ static void setCursorPosition(Code* code, s32 cx, s32 cy) updateCursorPosition(code, pointer); } +static void endLine(Code* code) +{ + while(*code->cursor.position) + { + code->cursor.position++; + } + updateColumn(code); +} + static void upLine(Code* code) { char* prevLine = getPrevLine(code); @@ -1534,6 +1543,9 @@ static void processKeyboard(Code* code) else if(keyWasPressed(tic_key_f)) setCodeMode(code, TEXT_FIND_MODE); else if(keyWasPressed(tic_key_g)) setCodeMode(code, TEXT_GOTO_MODE); else if(keyWasPressed(tic_key_o)) setCodeMode(code, TEXT_OUTLINE_MODE); + else if(keyWasPressed(tic_key_n)) downLine(code); + else if(keyWasPressed(tic_key_p)) upLine(code); + else if(keyWasPressed(tic_key_e)) endLine(code); else if(keyWasPressed(tic_key_slash)) commentLine(code); else if(keyWasPressed(tic_key_home)) goCodeHome(code); else if(keyWasPressed(tic_key_end)) goCodeEnd(code); From 320e1181e43334560689fadb161456f627f2bd39 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 28 Jul 2021 12:49:52 +0300 Subject: [PATCH 015/379] force macos 10.13 --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbc205da8..5c54a3035 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,10 @@ if(Git_FOUND) endif() endif() +if(APPLE) + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE) +endif() + project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") From 191a96393887987ac77c198204a98cc506ec2c52 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 29 Jul 2021 11:38:29 +0300 Subject: [PATCH 016/379] version 1.0-dev --- CMakeLists.txt | 4 ++-- build/android/app/build.gradle | 4 ++-- build/android/app/src/main/AndroidManifest.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c54a3035..8285905db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.3) -set(VERSION_MAJOR 0) -set(VERSION_MINOR 90) +set(VERSION_MAJOR 1) +set(VERSION_MINOR 0) set(VERSION_REVISION 0) set(VERSION_STATUS "-dev") string(TIMESTAMP VERSION_YEAR "%Y") diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index ffc32fa5d..062c28563 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -15,8 +15,8 @@ android { } minSdkVersion 16 targetSdkVersion 29 - versionCode 9000 - versionName "0.90.00" + versionCode 10000 + versionName "1.00.00" externalNativeBuild { ndkBuild { arguments "APP_PLATFORM=android-16" diff --git a/build/android/app/src/main/AndroidManifest.xml b/build/android/app/src/main/AndroidManifest.xml index 3bcdee46f..f41157775 100644 --- a/build/android/app/src/main/AndroidManifest.xml +++ b/build/android/app/src/main/AndroidManifest.xml @@ -4,8 +4,8 @@ --> From f9be2931db2f864d36f0fb7cdf6f34298cda4c2e Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 30 Jul 2021 13:05:56 +0300 Subject: [PATCH 017/379] #1494: added `--keepcmd` command line parameter --- src/studio/screens/console.c | 62 +++++++++++++++++++----------------- src/studio/screens/console.h | 7 ++++ src/studio/studio.c | 22 +++++++++---- src/studio/studio.h | 35 ++++++++------------ 4 files changed, 70 insertions(+), 56 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index e3aceda29..f573df376 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -182,7 +182,7 @@ static const char* LicenseText = static const struct StartupOption {const char* name; const char* help;} StartupOptions[] = { -#define CMD_PARAMS_DEF(name, type, post, help) {#name post, help}, +#define CMD_PARAMS_DEF(name, ctype, type, post, help) {#name post, help}, CMD_PARAMS_LIST(CMD_PARAMS_DEF) #undef CMD_PARAMS_DEF }; @@ -2321,9 +2321,7 @@ static void onRunCommand(Console* console) { commandDone(console); - tic_api_reset(console->tic); - - setStudioMode(TIC_RUN_MODE); + runProject(); } static void onResumeCommand(Console* console) @@ -3175,26 +3173,6 @@ static void processCommand(Console* console, const char* text) else commandDone(console); } -static void processCommands(Console* console) -{ - char* command = console->args.cmd; - static const char Sep[] = " & "; - char* next = strstr(command, Sep); - - if(next) - { - *next = '\0'; - next += STRLEN(Sep); - } - - console->args.cmd = next; - - if(!console->args.cli) - printFront(console, command); - - processCommand(console, command); -} - static void fillHistory(Console* console) { if(console->history.size) @@ -3623,9 +3601,7 @@ static void tick(Console* console) if(!console->args.skip) console->showGameMenu = true; - tic_api_reset(tic); - - setStudioMode(TIC_RUN_MODE); + runProject(); start->embed = false; studioRomLoaded(); @@ -3646,8 +3622,16 @@ static void tick(Console* console) if(console->active) { - if(console->args.cmd) - processCommands(console); + if(console->commands.current < console->commands.count) + { + const char* command = console->commands.items[console->commands.current]; + if(!console->args.cli) + printFront(console, command); + + processCommand(console, command); + + console->commands.current++; + } else if(getConfig()->cli) exitStudio(); } @@ -3753,6 +3737,25 @@ void initConsole(Console* console, tic_mem* tic, tic_fs* fs, tic_net* net, Confi .desc = console->desc, }; + // parse --cmd param + { + char* command = args.cmd; + while(command) + { + console->commands.items = realloc(console->commands.items, sizeof(char*) * (console->commands.count + 1)); + console->commands.items[console->commands.count++] = command; + + static const char Sep[] = " & "; + command = strstr(command, Sep); + + if(command) + { + *command = '\0'; + command += STRLEN(Sep); + } + } + } + qsort(Commands, COUNT_OF(Commands), sizeof Commands[0], cmdcmp); qsort(Api, COUNT_OF(Api), sizeof Api[0], apicmp); @@ -3797,6 +3800,7 @@ void freeConsole(Console* console) free(console->history.items); } + FREE(console->commands.items); free(console->desc); free(console); } diff --git a/src/studio/screens/console.h b/src/studio/screens/console.h index 61c093768..ef2cff3b5 100644 --- a/src/studio/screens/console.h +++ b/src/studio/screens/console.h @@ -93,6 +93,13 @@ struct Console bool active; bool showGameMenu; StartArgs args; + + struct + { + s32 count; + s32 current; + char** items; + } commands; CommandDesc* desc; diff --git a/src/studio/studio.c b/src/studio/studio.c index 57a9a2860..5112f82d1 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1346,13 +1346,23 @@ static inline bool isGameMenu() void runProject() { - tic_api_reset(impl.studio.tic); - - if(impl.mode == TIC_RUN_MODE) + if(impl.console->args.keepcmd + && impl.console->commands.count + && impl.console->commands.current >= impl.console->commands.count) + { + impl.console->commands.current = 0; + setStudioMode(TIC_CONSOLE_MODE); + } + else { - initRunMode(); + tic_api_reset(impl.studio.tic); + + if(impl.mode == TIC_RUN_MODE) + { + initRunMode(); + } + else setStudioMode(TIC_RUN_MODE); } - else setStudioMode(TIC_RUN_MODE); } #if defined(BUILD_EDITORS) @@ -2037,7 +2047,7 @@ static StartArgs parseArgs(s32 argc, char **argv) struct argparse_option options[] = { OPT_HELP(), -#define CMD_PARAMS_DEF(name, type, post, help) OPT_##type('\0', #name, &args.name, help), +#define CMD_PARAMS_DEF(name, ctype, type, post, help) OPT_##type('\0', #name, &args.name, help), CMD_PARAMS_LIST(CMD_PARAMS_DEF) #undef CMD_PARAMS_DEF OPT_END(), diff --git a/src/studio/studio.h b/src/studio/studio.h index c7d3164c8..f3ffb3f4b 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -64,20 +64,21 @@ #if defined(CRT_SHADER_SUPPORT) # define CRT_CMD_PARAM(macro) \ - macro(crt, BOOLEAN, "", "enable CRT monitor effect") + macro(crt, bool, BOOLEAN, "", "enable CRT monitor effect") #else # define CRT_CMD_PARAM(macro) #endif -#define CMD_PARAMS_LIST(macro) \ - macro(skip, BOOLEAN, "", "skip startup animation") \ - macro(nosound, BOOLEAN, "", "disable sound output") \ - macro(cli, BOOLEAN, "", "console only output") \ - macro(fullscreen, BOOLEAN, "", "enable fullscreen mode") \ - macro(fs, STRING, "=", "path to the file system folder") \ - macro(scale, INTEGER, "=", "main window scale") \ - macro(cmd, STRING, "=", "run commands in the console") \ - macro(version, BOOLEAN, "", "print program version") \ +#define CMD_PARAMS_LIST(macro) \ + macro(skip, bool, BOOLEAN, "", "skip startup animation") \ + macro(nosound, bool, BOOLEAN, "", "disable sound output") \ + macro(cli, bool, BOOLEAN, "", "console only output") \ + macro(fullscreen, bool, BOOLEAN, "", "enable fullscreen mode") \ + macro(fs, char*, STRING, "=", "path to the file system folder") \ + macro(scale, s32, INTEGER, "=", "main window scale") \ + macro(cmd, char*, STRING, "=", "run commands in the console") \ + macro(keepcmd, bool, BOOLEAN, "", "re-execute commands on every run") \ + macro(version, bool, BOOLEAN, "", "print program version") \ CRT_CMD_PARAM(macro) #define SHOW_TOOLTIP(FORMAT, ...) \ @@ -90,18 +91,10 @@ do{ \ typedef struct { - bool skip; - bool nosound; - bool cli; - bool fullscreen; - bool version; - s32 scale; - char *fs; char *cart; -#if defined(CRT_SHADER_SUPPORT) - bool crt; -#endif - char *cmd; +#define CMD_PARAMS_DEF(name, ctype, type, post, help) ctype name; + CMD_PARAMS_LIST(CMD_PARAMS_DEF) +#undef CMD_PARAMS_DEF } StartArgs; typedef enum From 30c1ca4d925886fb0080ea2a216394ecf94f44f5 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 30 Jul 2021 13:26:32 +0300 Subject: [PATCH 018/379] #1494: build fix --- src/studio/studio.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/studio/studio.c b/src/studio/studio.c index 5112f82d1..fdfb26a38 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1346,6 +1346,7 @@ static inline bool isGameMenu() void runProject() { +#if defined(BUILD_EDITORS) if(impl.console->args.keepcmd && impl.console->commands.count && impl.console->commands.current >= impl.console->commands.count) @@ -1354,6 +1355,7 @@ void runProject() setStudioMode(TIC_CONSOLE_MODE); } else +#endif { tic_api_reset(impl.studio.tic); From 1afcf31a99b349c1745a96428933f3eb512710c4 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 3 Aug 2021 11:15:10 +0300 Subject: [PATCH 019/379] #1534: added rpi4-baremetal build --- .github/workflows/build.yml | 55 ++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b488fd57c..5eb3d868a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -302,7 +302,7 @@ jobs: - name: Deploy uses: actions/upload-artifact@v2 with: - name: 'tic80-baremetal' + name: 'tic80-rpi-baremetal' path: | vendor/circle-stdlib/libs/circle/boot/config.txt vendor/circle-stdlib/libs/circle/boot/kernel.img @@ -311,6 +311,59 @@ jobs: vendor/circle-stdlib/libs/circle/boot/fixup.dat vendor/circle-stdlib/libs/circle/boot/LICENCE.broadcom +# === Raspberry PI 4 Bare Metal === + rpi4-baremetal: + runs-on: ubuntu-latest + container: nesbox/baremetalpi-tic80:latest + + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Prebuild + run: | + cd vendor/circle-stdlib + ./configure -r 4 + make -j$(nproc) + cd libs/circle/addon/vc4/sound/ + make -j$(nproc) + cd ../vchiq + make -j$(nproc) + cd ../../linux + make -j$(nproc) + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=baremetalpi/toolchain.cmake .. + make tic80studio -j$(nproc) + cd baremetalpi + make -j$(nproc) + cd ../../vendor/circle-stdlib/libs/circle/boot/ + make -j$(nproc) + + - name: Pack + run: | + cp build/baremetalpi/kernel7l.img vendor/circle-stdlib/libs/circle/boot/kernel.img + cp build/baremetalpi/boot/config.txt vendor/circle-stdlib/libs/circle/boot/config.txt + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: 'tic80-rpi4-baremetal' + path: | + vendor/circle-stdlib/libs/circle/boot/bcm2711-rpi-4-b.dtb + vendor/circle-stdlib/libs/circle/boot/bcm2711-rpi-cm4.dtb + vendor/circle-stdlib/libs/circle/boot/bootcode.bin + vendor/circle-stdlib/libs/circle/boot/config.txt + vendor/circle-stdlib/libs/circle/boot/COPYING.linux + vendor/circle-stdlib/libs/circle/boot/fixup4.dat + vendor/circle-stdlib/libs/circle/boot/kernel.img + vendor/circle-stdlib/libs/circle/boot/LICENCE.broadcom + vendor/circle-stdlib/libs/circle/boot/start4.elf + # === Nintendo 3DS build === nintendo-3ds: runs-on: ubuntu-latest From 973dd00a3227036addb073472f0ec49757664784 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 6 Aug 2021 14:05:18 +0300 Subject: [PATCH 020/379] #1305: added VRAM access from the OVR() + added BDR(row) callback --- src/api.h | 17 ++- src/api/js.c | 13 ++- src/api/lua.c | 30 ++++-- src/api/squirrel.c | 13 ++- src/api/wren.c | 26 ++++- src/core/core.c | 246 +++++++++++++++++++------------------------- src/core/core.h | 12 +-- src/core/draw.c | 27 +++-- src/studio/studio.c | 51 ++++----- 9 files changed, 233 insertions(+), 202 deletions(-) diff --git a/src/api.h b/src/api.h index 096305157..43c69ab27 100644 --- a/src/api.h +++ b/src/api.h @@ -49,6 +49,7 @@ typedef struct typedef struct tic_mem tic_mem; typedef void(*tic_tick)(tic_mem* memory); typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data); +typedef void(*tic_border)(tic_mem* memory, s32 row, void* data); typedef void(*tic_overline)(tic_mem* memory, void* data); typedef struct @@ -57,6 +58,13 @@ typedef struct s32 size; } tic_outline_item; +typedef struct +{ + tic_scanline scanline; + tic_overline overline; + tic_border border; +} tic_blit_callback; + typedef struct { const char* name; @@ -66,8 +74,7 @@ typedef struct void(*close)(tic_mem* memory); tic_tick tick; - tic_scanline scanline; - tic_overline overline; + tic_blit_callback callback; }; const tic_outline_item* (*getOutline)(const char* code, s32* size); @@ -120,12 +127,15 @@ enum #define TIC_FN "TIC" #define SCN_FN "SCN" #define OVR_FN "OVR" +#define BDR_FN "BDR" #define TIC_CALLBACK_LIST(macro) \ macro(TIC_FN, TIC_FN "()", "Main function. It's called at " DEF2STR(TIC80_FRAMERATE) \ "fps (" DEF2STR(TIC80_FRAMERATE) " times every second).") \ macro(SCN_FN, SCN_FN "(row)", "Allows you to execute code between the drawing of each scanline, " \ "for example, to manipulate the palette.") \ + macro(BDR_FN, BDR_FN "(row)", "Allows you to execute code between the drawing of each fullscreen scanline, " \ + "for example, to manipulate the palette.") \ macro(OVR_FN, OVR_FN "()", "Called after each frame;" \ "draw calls from this function ignore palette swap and screen offset.") @@ -689,7 +699,8 @@ void tic_core_tick_start(tic_mem* memory); void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); void tic_core_blit(tic_mem* tic, tic80_pixel_color_format fmt); -void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_scanline scanline, tic_overline overline, void* data); + +void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb, void* data); const tic_script_config* tic_core_script_config(tic_mem* memory); typedef struct diff --git a/src/api/js.c b/src/api/js.c index 9fd5b2bf6..c562e92ef 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -1005,6 +1005,11 @@ static void callJavascriptScanline(tic_mem* tic, s32 row, void* data) callJavascriptScanlineName(tic, row, data, "scanline"); } +static void callJavascriptBorder(tic_mem* tic, s32 row, void* data) +{ + callJavascriptScanlineName(tic, row, data, BDR_FN); +} + static void callJavascriptOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; @@ -1100,8 +1105,12 @@ static const tic_script_config JsSyntaxConfig = .init = initJavascript, .close = closeJavascript, .tick = callJavascriptTick, - .scanline = callJavascriptScanline, - .overline = callJavascriptOverline, + .callback = + { + .scanline = callJavascriptScanline, + .border = callJavascriptBorder, + .overline = callJavascriptOverline, + }, .getOutline = getJsOutline, .eval = evalJs, diff --git a/src/api/lua.c b/src/api/lua.c index 0b086031e..1d9d37029 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1502,6 +1502,11 @@ static void callLuaScanline(tic_mem* tic, s32 row, void* data) callLuaScanlineName(tic, row, data, "scanline"); } +static void callLuaBorder(tic_mem* tic, s32 row, void* data) +{ + callLuaScanlineName(tic, row, data, BDR_FN); +} + static void callLuaOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; @@ -1612,8 +1617,13 @@ static const tic_script_config LuaSyntaxConfig = .init = initLua, .close = closeLua, .tick = callLuaTick, - .scanline = callLuaScanline, - .overline = callLuaOverline, + + .callback = + { + .scanline = callLuaScanline, + .border = callLuaBorder, + .overline = callLuaOverline, + }, .getOutline = getLuaOutline, .eval = evalLua, @@ -1780,8 +1790,12 @@ static const tic_script_config MoonSyntaxConfig = .init = initMoonscript, .close = closeLua, .tick = callLuaTick, - .scanline = callLuaScanline, - .overline = callLuaOverline, + .callback = + { + .scanline = callLuaScanline, + .border = callLuaBorder, + .overline = callLuaOverline, + }, .getOutline = getMoonOutline, .eval = NULL, @@ -1957,8 +1971,12 @@ static const tic_script_config FennelSyntaxConfig = .init = initFennel, .close = closeLua, .tick = callLuaTick, - .scanline = callLuaScanline, - .overline = callLuaOverline, + .callback = + { + .scanline = callLuaScanline, + .border = callLuaBorder, + .overline = callLuaOverline, + }, .getOutline = getFennelOutline, .eval = evalFennel, diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 943bb571b..90f9bb4dd 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1614,6 +1614,11 @@ static void callSquirrelScanline(tic_mem* tic, s32 row, void* data) callSquirrelScanlineName(tic, row, data, "scanline"); } +static void callSquirrelBorder(tic_mem* tic, s32 row, void* data) +{ + callSquirrelScanlineName(tic, row, data, BDR_FN); +} + static void callSquirrelOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; @@ -1752,8 +1757,12 @@ static const tic_script_config SquirrelSyntaxConfig = .init = initSquirrel, .close = closeSquirrel, .tick = callSquirrelTick, - .scanline = callSquirrelScanline, - .overline = callSquirrelOverline, + .callback = + { + .scanline = callSquirrelScanline, + .border = callSquirrelBorder, + .overline = callSquirrelOverline, + }, .getOutline = getSquirrelOutline, .eval = evalSquirrel, diff --git a/src/api/wren.c b/src/api/wren.c index 8e9f5c3c4..f6b08f71d 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -36,6 +36,7 @@ static WrenHandle* game_class; static WrenHandle* new_handle; static WrenHandle* update_handle; static WrenHandle* scanline_handle; +static WrenHandle* border_handle; static WrenHandle* overline_handle; static bool loaded = false; @@ -165,6 +166,7 @@ class TIC {\n\ }\n\ " TIC_FN "(){}\n\ " SCN_FN "(row){}\n\ + " BDR_FN "(row){}\n\ " OVR_FN "(){}\n\ }\n"; @@ -206,6 +208,7 @@ static void closeWren(tic_mem* tic) wrenReleaseHandle(core->wren, new_handle); wrenReleaseHandle(core->wren, update_handle); wrenReleaseHandle(core->wren, scanline_handle); + wrenReleaseHandle(core->wren, border_handle); wrenReleaseHandle(core->wren, overline_handle); if (game_class != NULL) { @@ -1452,6 +1455,7 @@ static bool initWren(tic_mem* tic, const char* code) new_handle = wrenMakeCallHandle(vm, "new()"); update_handle = wrenMakeCallHandle(vm, TIC_FN "()"); scanline_handle = wrenMakeCallHandle(vm, SCN_FN "(_)"); + border_handle = wrenMakeCallHandle(vm, BDR_FN "(_)"); overline_handle = wrenMakeCallHandle(vm, OVR_FN "()"); // create game class @@ -1503,6 +1507,20 @@ static void callWrenScanline(tic_mem* tic, s32 row, void* data) } } +static void callWrenBorder(tic_mem* tic, s32 row, void* data) +{ + tic_core* core = (tic_core*)tic; + WrenVM* vm = core->wren; + + if(vm && game_class) + { + wrenEnsureSlots(vm, 2); + wrenSetSlotHandle(vm, 0, game_class); + wrenSetSlotDouble(vm, 1, row); + wrenCall(vm, border_handle); + } +} + static void callWrenOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; @@ -1597,8 +1615,12 @@ static const tic_script_config WrenSyntaxConfig = .init = initWren, .close = closeWren, .tick = callWrenTick, - .scanline = callWrenScanline, - .overline = callWrenOverline, + .callback = + { + .scanline = callWrenScanline, + .border = callWrenBorder, + .overline = callWrenOverline, + }, .getOutline = getWrenOutline, .eval = evalWren, diff --git a/src/core/core.c b/src/core/core.c index e418df858..b9d33a716 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -42,57 +42,20 @@ static_assert(sizeof(tic_map) < 1024 * 32, "tic_map"); static_assert(sizeof(tic_vram) == TIC_VRAM_SIZE, "tic_vram"); static_assert(sizeof(tic_ram) == TIC_RAM_SIZE, "tic_ram"); -static inline u32* getOvrAddr(tic_mem* tic, s32 x, s32 y) -{ - enum { Top = (TIC80_FULLHEIGHT - TIC80_HEIGHT) / 2 }; - enum { Left = (TIC80_FULLWIDTH - TIC80_WIDTH) / 2 }; - - return tic->screen + x + (y << TIC80_FULLWIDTH_BITS) + (Left + Top * TIC80_FULLWIDTH); -} - -static void setPixelOvr(tic_mem* tic, s32 x, s32 y, u8 color) -{ - tic_core* core = (tic_core*)tic; - - *getOvrAddr(tic, x, y) = *(core->state.ovr.raw + color); -} - -static u8 getPixelOvr(tic_mem* tic, s32 x, s32 y) -{ - tic_core* core = (tic_core*)tic; - - u32 color = *getOvrAddr(tic, x, y); - u32* pal = core->state.ovr.raw; - - for (s32 i = 0; i < TIC_PALETTE_SIZE; i++, pal++) - if (*pal == color) - return i; - - return 0; -} - -static void drawHLineOvr(tic_mem* tic, s32 x1, s32 x2, s32 y, u8 color) -{ - tic_core* core = (tic_core*)tic; - u32 final_color = *(core->state.ovr.raw + color); - for (s32 x = x1; x < x2; ++x) { - *getOvrAddr(tic, x, y) = final_color; - } -} - u8 tic_api_peek(tic_mem* memory, s32 address, s32 res) { - if (res == 0 - || address < 0 - || address >= (sizeof(tic_ram) * 8) / res) + if (address < 0) return 0; + const u8* ram = (u8*)&memory->ram; + enum{RamBits = sizeof(tic_ram) * BITS_IN_BYTE}; + switch(res) { - case 1: return tic_tool_peek1((u8*)&memory->ram, address); - case 2: return tic_tool_peek2((u8*)&memory->ram, address); - case 4: return tic_tool_peek4((u8*)&memory->ram, address); - case 8: return *((u8*)&memory->ram + address); + case 1: if(address < RamBits / 1) return tic_tool_peek1(ram, address); + case 2: if(address < RamBits / 2) return tic_tool_peek2(ram, address); + case 4: if(address < RamBits / 4) return tic_tool_peek4(ram, address); + case 8: if(address < RamBits / 8) return ram[address]; } return 0; @@ -100,36 +63,35 @@ u8 tic_api_peek(tic_mem* memory, s32 address, s32 res) void tic_api_poke(tic_mem* memory, s32 address, u8 value, s32 res) { - if (res == 0 - || address < 0 - || address >= (sizeof(tic_ram) * 8) / res) + if (address < 0) return; + tic_core* core = (tic_core*)memory; + u8* ram = (u8*)&memory->ram; + enum{RamBits = sizeof(tic_ram) * BITS_IN_BYTE}; + switch(res) { - case 1: tic_tool_poke1((u8*)&memory->ram, address, value); break; - case 2: tic_tool_poke2((u8*)&memory->ram, address, value); break; - case 4: tic_tool_poke4((u8*)&memory->ram, address, value); break; - case 8: *((u8*)&memory->ram + address) = value; break; + case 1: if(address < RamBits / 1) {tic_tool_poke1(ram, address, value); core->state.memmask[address >> 2] = 1;} break; + case 2: if(address < RamBits / 2) {tic_tool_poke2(ram, address, value); core->state.memmask[address >> 1] = 1;} break; + case 4: if(address < RamBits / 4) {tic_tool_poke4(ram, address, value); core->state.memmask[address >> 0] = 1;} break; + case 8: if(address < RamBits / 8) {ram[address] = value; *(u16*)&core->state.memmask[address << 1] = 0x0101;} break; } } u8 tic_api_peek4(tic_mem* memory, s32 address) { - if (address >= 0 && address < sizeof(tic_ram) * 2) - return tic_tool_peek4((u8*)&memory->ram, address); - - return 0; + return tic_api_peek(memory, address, 4); } void tic_api_poke4(tic_mem* memory, s32 address, u8 value) { - if (address >= 0 && address < sizeof(tic_ram) * 2) - tic_tool_poke4((u8*)&memory->ram, address, value); + tic_api_poke(memory, address, value, 4); } void tic_api_memcpy(tic_mem* memory, s32 dst, s32 src, s32 size) { + tic_core* core = (tic_core*)memory; s32 bound = sizeof(tic_ram) - size; if (size >= 0 @@ -141,11 +103,13 @@ void tic_api_memcpy(tic_mem* memory, s32 dst, s32 src, s32 size) { u8* base = (u8*)&memory->ram; memcpy(base + dst, base + src, size); + memcpy(core->state.memmask + (dst << 1), core->state.memmask + (src << 1), size << 1); } } void tic_api_memset(tic_mem* memory, s32 dst, u8 val, s32 size) { + tic_core* core = (tic_core*)memory; s32 bound = sizeof(tic_ram) - size; if (size >= 0 @@ -155,6 +119,7 @@ void tic_api_memset(tic_mem* memory, s32 dst, u8 val, s32 size) { u8* base = (u8*)&memory->ram; memset(base + dst, val, size); + memset(core->state.memmask + (dst << 1), 1, size << 1); } } @@ -230,34 +195,6 @@ s32 tic_api_tstamp(tic_mem* memory) return (s32)time(NULL); } -static void setPixelDma(tic_mem* tic, s32 x, s32 y, u8 color) -{ - tic_tool_poke4(tic->ram.vram.screen.data, y * TIC80_WIDTH + x, color); -} - -static u8 getPixelDma(tic_mem* tic, s32 x, s32 y) -{ - tic_core* core = (tic_core*)tic; - - return tic_tool_peek4(core->memory.ram.vram.screen.data, y * TIC80_WIDTH + x); -} - -static void drawHLineDma(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color) -{ - color = color << 4 | color; - if (xl >= xr) return; - if (xl & 1) { - tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xl, color); - xl++; - } - s32 count = (xr - xl) >> 1; - u8* screen = memory->ram.vram.screen.data + ((y * TIC80_WIDTH + xl) >> 1); - for (s32 i = 0; i < count; i++) *screen++ = color; - if (xr & 1) { - tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xr - 1, color); - } -} - static void resetPalette(tic_mem* memory) { static const u8 DefaultMapping[] = { 16, 50, 84, 118, 152, 186, 220, 254 }; @@ -350,14 +287,6 @@ static void soundClear(tic_mem* memory) tic_api_music(memory, -1, 0, 0, false, false, -1, -1); } -static void resetDma(tic_mem* memory) -{ - tic_core* core = (tic_core*)memory; - core->state.setpix = setPixelDma; - core->state.getpix = getPixelDma; - core->state.drawhline = drawHLineDma; -} - void tic_api_reset(tic_mem* memory) { resetPalette(memory); @@ -372,10 +301,7 @@ void tic_api_reset(tic_mem* memory) tic_core* core = (tic_core*)memory; core->state.initialized = false; - core->state.scanline = NULL; - core->state.ovr.callback = NULL; - - resetDma(memory); + ZEROMEM(core->state.callback); updateSaveid(memory); } @@ -443,9 +369,7 @@ void tic_core_tick(tic_mem* tic, tic_tick_data* data) if (done) { core->state.tick = config->tick; - core->state.scanline = config->scanline; - core->state.ovr.callback = config->overline; - + core->state.callback = config->callback; core->state.initialized = true; } else return; @@ -505,7 +429,6 @@ void tic_core_tick_start(tic_mem* memory) tic_core* core = (tic_core*)memory; core->state.synced = 0; - resetDma(memory); } void tic_core_tick_end(tic_mem* memory) @@ -517,10 +440,6 @@ void tic_core_tick_end(tic_mem* memory) core->state.keyboard.previous.data = input->keyboard.data; tic_core_sound_tick_end(memory); - - core->state.setpix = setPixelOvr; - core->state.getpix = getPixelOvr; - core->state.drawhline = drawHLineOvr; } // copied from SDL2 @@ -553,58 +472,93 @@ static inline void memset4(void* dst, u32 val, u32 dwords) #endif } -void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_scanline scanline, tic_overline overline, void* data) +void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb, void* data) { - // init OVR palette - { - tic_core* core = (tic_core*)tic; + tic_core* core = (tic_core*)tic; - const tic_palette* pal = EMPTY(core->state.ovr.palette.data) - ? &tic->ram.vram.palette - : &core->state.ovr.palette; + tic_palette ovrpal; - memcpy(core->state.ovr.raw, tic_tool_palette_blit(pal, fmt), sizeof core->state.ovr.raw); + if(clb.overline) + { + memcpy(&ovrpal, EMPTY(core->state.ovr.palette.data) + ? &tic->ram.vram.palette + : &core->state.ovr.palette + , sizeof ovrpal); } - if (scanline) - scanline(tic, 0, data); - - const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); - - u32* out = tic->screen; + { +#define UPDBRD() \ + if(clb.border) \ + { \ + clb.border(tic, row, data); \ + pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); \ + } - memset4(&out[0 * TIC80_FULLWIDTH], pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH * TIC80_MARGIN_TOP); + if (clb.scanline) + clb.scanline(tic, 0, data); - u32* rowPtr = out + (TIC80_MARGIN_TOP * TIC80_FULLWIDTH); - for (s32 r = 0; r < TIC80_HEIGHT; r++, rowPtr += TIC80_FULLWIDTH) - { - u32* colPtr = rowPtr + TIC80_MARGIN_LEFT; - memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_MARGIN_LEFT); + const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); - s32 pos = (r + tic->ram.vram.vars.offset.y + TIC80_HEIGHT) % TIC80_HEIGHT * TIC80_WIDTH >> 1; + s32 row = 0; + u32* rowPtr = tic->screen; - u32 x = (-tic->ram.vram.vars.offset.x + TIC80_WIDTH) % TIC80_WIDTH; - for (s32 c = 0; c < TIC80_WIDTH / 2; c++) + for(; row < TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) { - u8 val = ((u8*)tic->ram.vram.screen.data)[pos + c]; - *(colPtr + (x++ % TIC80_WIDTH)) = pal[val & 0xf]; - *(colPtr + (x++ % TIC80_WIDTH)) = pal[val >> 4]; + UPDBRD(); + memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH); } - memset4(rowPtr + (TIC80_FULLWIDTH - TIC80_MARGIN_RIGHT), pal[tic->ram.vram.vars.border], TIC80_MARGIN_RIGHT); + for (; row < TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row, rowPtr += TIC80_FULLWIDTH) + { + UPDBRD(); + + memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_MARGIN_LEFT); + memset4(rowPtr + (TIC80_FULLWIDTH - TIC80_MARGIN_RIGHT), pal[tic->ram.vram.vars.border], TIC80_MARGIN_RIGHT); + + for (s32 i = (row + tic->ram.vram.vars.offset.y + (TIC80_HEIGHT - TIC80_MARGIN_TOP)) % TIC80_HEIGHT * TIC80_WIDTH, + end = i + TIC80_WIDTH, x = (TIC80_WIDTH - tic->ram.vram.vars.offset.x) % TIC80_WIDTH; i < end; ++i, ++x) + rowPtr[TIC80_MARGIN_LEFT + x % TIC80_WIDTH] = pal[tic_tool_peek4(tic->ram.vram.screen.data, i)]; + + if (clb.scanline && (row < TIC80_HEIGHT + TIC80_MARGIN_TOP - 1)) + { + clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), data); + pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); + } + } - if (scanline && (r < TIC80_HEIGHT - 1)) + for(; row < TIC80_FULLHEIGHT; ++row, rowPtr += TIC80_FULLWIDTH) { - scanline(tic, r + 1, data); - pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); + UPDBRD(); + memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH); } + +#undef UPDBRD } - memset4(&out[(TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM) * TIC80_FULLWIDTH], pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH * TIC80_MARGIN_BOTTOM); + if (clb.overline) + { + ZEROMEM(core->state.memmask); + + tic_palette scnpal; + memcpy(&scnpal, &tic->ram.vram.palette, sizeof scnpal); + memcpy(&tic->ram.vram.palette, &ovrpal, sizeof ovrpal); + + { + clb.overline(tic, data); - if (overline) - overline(tic, data); + const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); + u32* out = tic->screen + TIC80_MARGIN_TOP * TIC80_FULLWIDTH + TIC80_MARGIN_LEFT; + u8* memmask = core->state.memmask; + for(s32 pos = 0; pos != TIC80_WIDTH * TIC80_HEIGHT; pos += TIC80_WIDTH, out += TIC80_MARGIN_LEFT + TIC80_MARGIN_RIGHT) + for (s32 i = pos, end = pos + TIC80_WIDTH; i != end; ++i, ++out) + if(*memmask++) + *out = pal[tic_tool_peek4(tic->ram.vram.screen.data, i)]; + } + + memcpy(&core->state.ovr.palette, &tic->ram.vram.palette, sizeof(tic_palette)); + memcpy(&tic->ram.vram.palette, &scnpal, sizeof scnpal); + } } static inline void scanline(tic_mem* memory, s32 row, void* data) @@ -612,7 +566,15 @@ static inline void scanline(tic_mem* memory, s32 row, void* data) tic_core* core = (tic_core*)memory; if (core->state.initialized) - core->state.scanline(memory, row, data); + core->state.callback.scanline(memory, row, data); +} + +static inline void border(tic_mem* memory, s32 row, void* data) +{ + tic_core* core = (tic_core*)memory; + + if (core->state.initialized) + core->state.callback.border(memory, row, data); } static inline void overline(tic_mem* memory, void* data) @@ -620,12 +582,12 @@ static inline void overline(tic_mem* memory, void* data) tic_core* core = (tic_core*)memory; if (core->state.initialized) - core->state.ovr.callback(memory, data); + core->state.callback.overline(memory, data); } void tic_core_blit(tic_mem* tic, tic80_pixel_color_format fmt) { - tic_core_blit_ex(tic, fmt, scanline, overline, NULL); + tic_core_blit_ex(tic, fmt, (tic_blit_callback){scanline, overline, border}, NULL); } tic_mem* tic_core_create(s32 samplerate) diff --git a/src/core/core.h b/src/core/core.h index 388451e26..7992d0a6f 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -144,21 +144,17 @@ typedef struct } music; tic_tick tick; - tic_scanline scanline; - + tic_blit_callback callback; + struct { - tic_overline callback; - u32 raw[TIC_PALETTE_SIZE]; tic_palette palette; } ovr; - void (*setpix)(tic_mem* memory, s32 x, s32 y, u8 color); - u8 (*getpix)(tic_mem* memory, s32 x, s32 y); - void (*drawhline)(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color); - u32 synced; + u8 memmask[sizeof(tic_ram) << 1]; + bool initialized; } tic_core_state_data; diff --git a/src/core/draw.c b/src/core/draw.c index 0d3397cd7..c8ebf3484 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -62,14 +62,12 @@ static void setPixel(tic_core* core, s32 x, s32 y, u8 color) { if (x < core->state.clip.l || y < core->state.clip.t || x >= core->state.clip.r || y >= core->state.clip.b) return; - core->state.setpix(&core->memory, x, y, color); + tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } static u8 getPixel(tic_core* core, s32 x, s32 y) { - if (x < 0 || y < 0 || x >= TIC80_WIDTH || y >= TIC80_HEIGHT) return 0; - - return core->state.getpix(&core->memory, x, y); + return tic_api_peek4((tic_mem*)core, y * TIC80_WIDTH + x); } #define EARLY_CLIP(x, y, width, height) \ @@ -86,8 +84,10 @@ static void drawHLine(tic_core* core, s32 x, s32 y, s32 width, u8 color) s32 xl = MAX(x, core->state.clip.l); s32 xr = MIN(x + width, core->state.clip.r); + s32 start = y * TIC80_WIDTH; - core->state.drawhline(&core->memory, xl, xr, y, color); + for(s32 i = start + xl, end = start + xr; i < end; ++i) + tic_api_poke4((tic_mem*)core, i, color); } static void drawVLine(tic_core* core, s32 x, s32 y, s32 height, u8 color) @@ -123,7 +123,7 @@ static void drawRectBorder(tic_core* core, s32 x, s32 y, s32 width, s32 height, for(s32 px=sx; px < ex; px++, xx++) \ { \ u8 color = mapping[tic_tilesheet_gettilepix(tile, (X), (Y))];\ - if(color != TRANSPARENT_COLOR) core->state.setpix(&core->memory, xx, y, color); \ + if(color != TRANSPARENT_COLOR) setPixel(core, xx, y, color); \ } \ } \ } while(0) @@ -359,14 +359,10 @@ void tic_api_cls(tic_mem* memory, u8 color) tic_core* core = (tic_core*)memory; if (memcmp(&core->state.clip, &EmptyClip, sizeof(tic_clip_data)) == 0) - { - color &= 0b00001111; - memset(memory->ram.vram.screen.data, color | (color << TIC_PALETTE_BPP), sizeof(memory->ram.vram.screen.data)); - } + tic_api_memset(memory, 0, (color & 0xf) | (color << TIC_PALETTE_BPP), sizeof(tic_screen)); else - { - tic_api_rect(memory, core->state.clip.l, core->state.clip.t, core->state.clip.r - core->state.clip.l, core->state.clip.b - core->state.clip.t, color); - } + tic_api_rect(memory, core->state.clip.l, core->state.clip.t, + core->state.clip.r - core->state.clip.l, core->state.clip.b - core->state.clip.t, color); } s32 tic_api_font(tic_mem* memory, const char* text, s32 x, s32 y, u8 chromakey, s32 w, s32 h, bool fixed, s32 scale, bool alt) @@ -540,7 +536,10 @@ static void drawSidesBuffer(tic_mem* memory, s32 y0, s32 y1, u8 color) { s32 xl = MAX(SidesBuffer.Left[y], core->state.clip.l); s32 xr = MIN(SidesBuffer.Right[y] + 1, core->state.clip.r); - core->state.drawhline(&core->memory, xl, xr, y, final_color); + s32 start = y * TIC80_WIDTH; + + for(s32 i = start + xl, end = start + xr; i < end; ++i) + tic_api_poke4(memory, i, color); } } diff --git a/src/studio/studio.c b/src/studio/studio.c index fdfb26a38..c47db3913 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -818,6 +818,29 @@ static void drawBankIcon(s32 x, s32 y) #endif #if defined(BUILD_EDITORS) + +static void drawPopup() +{ + if(impl.popup.counter > 0) + { + impl.popup.counter--; + + s32 anim = 0; + + enum{Dur = TIC80_FRAMERATE/2}; + + if(impl.popup.counter < Dur) + anim = -((Dur - impl.popup.counter) * (TIC_FONT_HEIGHT+1) / Dur); + else if(impl.popup.counter >= (POPUP_DUR - Dur)) + anim = (((POPUP_DUR - Dur) - impl.popup.counter) * (TIC_FONT_HEIGHT+1) / Dur); + + tic_api_rect(impl.studio.tic, 0, anim, TIC80_WIDTH, TIC_FONT_HEIGHT+1, tic_color_red); + tic_api_print(impl.studio.tic, impl.popup.message, + (s32)(TIC80_WIDTH - strlen(impl.popup.message)*TIC_FONT_WIDTH)/2, + anim + 1, tic_color_white, true, 1, false); + } +} + void drawToolbar(tic_mem* tic, bool bg) { if(bg) @@ -889,6 +912,9 @@ void drawToolbar(tic_mem* tic, bool bg) tic_api_print(tic, Names[mode], TextOffset, 1, tic_color_grey, false, 1, false); } } + + // !TODO: fix popup message drawing + drawPopup(); } void setStudioEvent(StudioEvent event) @@ -1672,6 +1698,7 @@ static void checkChanges() } } +// !TODO: fix REC icon drawing static void drawRecordLabel(u32* frame, s32 sx, s32 sy) { drawBitIcon(tic_icon_rec, sx, sy, tic_color_red); @@ -1708,27 +1735,6 @@ static void recordFrame(u32* pixels) } } -static void drawPopup() -{ - if(impl.popup.counter > 0) - { - impl.popup.counter--; - - s32 anim = 0; - - enum{Dur = TIC80_FRAMERATE/2}; - - if(impl.popup.counter < Dur) - anim = -((Dur - impl.popup.counter) * (TIC_FONT_HEIGHT+1) / Dur); - else if(impl.popup.counter >= (POPUP_DUR - Dur)) - anim = (((POPUP_DUR - Dur) - impl.popup.counter) * (TIC_FONT_HEIGHT+1) / Dur); - - tic_api_rect(impl.studio.tic, 0, anim, TIC80_WIDTH, TIC_FONT_HEIGHT+1, tic_color_red); - tic_api_print(impl.studio.tic, impl.popup.message, - (s32)(TIC80_WIDTH - strlen(impl.popup.message)*TIC_FONT_WIDTH)/2, - anim + 1, tic_color_white, true, 1, false); - } -} #endif static void renderStudio() @@ -1986,7 +1992,7 @@ static void studioTick() } data - ? tic_core_blit_ex(tic, tic->screen_format, scanline, overline, data) + ? tic_core_blit_ex(tic, tic->screen_format, (tic_blit_callback){scanline, overline}, data) : tic_core_blit(tic, tic->screen_format); #if defined(BUILD_EDITORS) @@ -1996,7 +2002,6 @@ static void studioTick() } #if defined(BUILD_EDITORS) - drawPopup(); tic_net_end(impl.net); #endif } From 274285465c96a32908a324291404cb75a0bd6e97 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 7 Aug 2021 15:03:04 -0400 Subject: [PATCH 021/379] sdl: Fix sign comparision warning --- src/system/sdl/player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system/sdl/player.c b/src/system/sdl/player.c index 8930fd3d2..34b8649ee 100644 --- a/src/system/sdl/player.c +++ b/src/system/sdl/player.c @@ -131,7 +131,7 @@ s32 runCart(void* cart, s32 size) SDL_SCANCODE_S, }; - for (s32 i = 0; i < SDL_arraysize(Keys); i++) + for (u32 i = 0; i < SDL_arraysize(Keys); i++) { if (keyboard[Keys[i]]) { From a8ecb192cc2060bf2e0c7a4d70e5468cd09eeeab Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 7 Aug 2021 15:20:36 -0400 Subject: [PATCH 022/379] Add TIC_UNUSED() to handle unused parameter warnings from -Wunused-parameter --- src/system/libretro/tic80_libretro.c | 23 ++++++++++++++++++----- src/tic.h | 2 ++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/system/libretro/tic80_libretro.c b/src/system/libretro/tic80_libretro.c index abbcf6b0b..92f18adc6 100644 --- a/src/system/libretro/tic80_libretro.c +++ b/src/system/libretro/tic80_libretro.c @@ -112,6 +112,7 @@ void tic80_libretro_error(const char* info) */ void tic80_libretro_trace(const char* text, u8 color) { + TIC_UNUSED(color); log_cb(RETRO_LOG_DEBUG, "[TIC-80] %s\n", text); } @@ -120,7 +121,7 @@ void tic80_libretro_trace(const char* text, u8 color) */ void tic80_libretro_fallback_log(enum retro_log_level level, const char *fmt, ...) { - (void)level; + TIC_UNUSED(level); va_list va; va_start(va, fmt); vfprintf(stderr, fmt, va); @@ -626,6 +627,9 @@ void tic80_libretro_update_mouse(tic80_mouse* mouse) tic80_libretro_update_mouse_wheels(mouse); break; #if TIC_MAXPLAYERS >= 1 + case POINTER_DEVICE_TOUCHSCREEN: + // Already handled above. + break; case POINTER_DEVICE_LEFT_ANALOG: // Get Mouse X and Y offsets mouseDeltaX = tic80_libretro_get_mouse_delta_analog(RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X); @@ -721,6 +725,7 @@ void tic80_libretro_update_mouse(tic80_mouse* mouse) */ void tic80_libretro_mousecursor(tic80_local* game, tic80_mouse* mouse, enum mouse_cursor_type cursortype) { + TIC_UNUSED(mouse); // Only draw the mouse cursor if it's active. if (state->mouseHideTimer == 0) { return; @@ -728,6 +733,9 @@ void tic80_libretro_mousecursor(tic80_local* game, tic80_mouse* mouse, enum mous // Determine which cursor to draw. switch (cursortype) { + case MOUSE_CURSOR_NONE: + // Nothing. + break; case MOUSE_CURSOR_DOT: tic_api_pix(game->memory, state->mouseX, state->mouseY, state->mouseCursorColor, false); break; @@ -1056,6 +1064,8 @@ RETRO_API unsigned retro_get_region(void) */ RETRO_API bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t num) { + TIC_UNUSED(num); + TIC_UNUSED(type); // Forward subsystem requests over to retro_load_game(). return retro_load_game(info); } @@ -1073,13 +1083,14 @@ size_t retro_serialize_size(void) */ RETRO_API bool retro_serialize(void *data, size_t size) { + TIC_UNUSED(size); if (state == NULL || state->tic == NULL || data == NULL) { return false; } tic80_local* tic80 = (tic80_local*)state->tic; u32* udata = (u32*)data; - for (int i = 0; i < TIC_PERSISTENT_SIZE; i++) { + for (u32 i = 0; i < TIC_PERSISTENT_SIZE; i++) { udata[i] = tic80->memory->ram.persistent.data[i]; } @@ -1097,7 +1108,7 @@ RETRO_API bool retro_unserialize(const void *data, size_t size) tic80_local* tic80 = (tic80_local*)state->tic; u32* uData = (u32*)data; - for (int i = 0; i < TIC_PERSISTENT_SIZE; i++) { + for (u32 i = 0; i < TIC_PERSISTENT_SIZE; i++) { tic80->memory->ram.persistent.data[i] = uData[i]; } @@ -1181,12 +1192,14 @@ RETRO_API void retro_cheat_reset(void) */ RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char *code) { + TIC_UNUSED(index); + TIC_UNUSED(enabled); if (!state || !state->tic) { return; } u32 codes[TIC_PERSISTENT_SIZE]; - int codeIndex = 0; + u32 codeIndex = 0; char *str = (char*)code; char *end = str; @@ -1201,7 +1214,7 @@ RETRO_API void retro_cheat_set(unsigned index, bool enabled, const char *code) // Finally, set each given code pair. tic80_local* tic80 = (tic80_local*)state->tic; - for (int i = 0; i < codeIndex; i = i + 2) { + for (u32 i = 0; i < codeIndex; i = i + 2) { tic80->memory->ram.persistent.data[codes[i]] = codes[i+1]; } } diff --git a/src/tic.h b/src/tic.h index d03aa8bca..cae7b148a 100644 --- a/src/tic.h +++ b/src/tic.h @@ -104,6 +104,8 @@ #define SFX_NOTES {"C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-"} #define TIC_FONT_CHARS 256 +#define TIC_UNUSED(x) (void)x + enum { NoteNone = 0, From 4d487ce712dfbbb4139729321b16f7cd3cbf774c Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Sat, 7 Aug 2021 17:09:59 -0700 Subject: [PATCH 023/379] Update Fennel to version 0.10.0. --- vendor/fennel/fennel.h | 23595 ++++++++++++++++++++----------------- vendor/fennel/fennel.lua | 1637 ++- 2 files changed, 14089 insertions(+), 11143 deletions(-) diff --git a/vendor/fennel/fennel.h b/vendor/fennel/fennel.h index 633e384df..6c4c1cd11 100644 --- a/vendor/fennel/fennel.h +++ b/vendor/fennel/fennel.h @@ -175,6 +175,196 @@ unsigned char loadfennel_lua[] = { 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, + 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x2e, 0x2a, 0x5b, 0x25, + 0x73, 0x29, 0x28, 0x5d, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x33, + 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, + 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x61, 0x6c, + 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, + 0x76, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, + 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x5b, 0x6b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x6b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x23, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3c, 0x20, + 0x32, 0x30, 0x30, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x6b, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6b, + 0x30, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x30, 0x2c, 0x20, 0x23, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x30, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6b, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, + 0x2e, 0x20, 0x6b, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, + 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, + 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, + 0x5e, 0x28, 0x5b, 0x5e, 0x3a, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x2e, 0x2a, + 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x5e, 0x28, + 0x5b, 0x5e, 0x2e, 0x5d, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x2e, 0x2a, 0x29, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x68, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, + 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x5b, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x62, 0x6c, + 0x5b, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, + 0x67, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x74, 0x61, 0x69, 0x6c, + 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x74, + 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, + 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x30, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, + 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x22, 0x3a, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x30, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, + 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x2c, + 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x7b, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x2c, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, + 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, + 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x47, 0x7d, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, + 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, @@ -338,676 +528,954 @@ unsigned char loadfennel_lua[] = { 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, - 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, + 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, + 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x33, 0x66, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x66, 0x65, + 0x72, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x6e, + 0x27, 0x74, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, + 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, + 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x79, - 0x6d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d, - 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x66, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, 0x20, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x66, 0x6d, 0x73, 0x67, 0x20, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, 0x72, 0x73, 0x65, 0x22, 0x2c, - 0x20, 0x28, 0x5f, 0x33, 0x66, 0x6d, 0x73, 0x67, 0x20, 0x6f, 0x72, 0x20, - 0x5f, 0x33, 0x66, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, + 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x2e, + 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x6f, 0x6b, 0x22, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x22, 0x66, + 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x20, 0x22, 0x45, 0x72, 0x61, 0x73, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, + 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, + 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, + 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, + 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x29, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, + 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x2c, + 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, + 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, + 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, + 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x5f, 0x47, 0x25, + 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, + 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, + 0x34, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, - 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, - 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, - 0x6e, 0x76, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, - 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x6f, - 0x6b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2c, 0x20, - 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x45, 0x72, 0x61, 0x73, 0x65, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2d, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, + 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x61, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, + 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x25, + 0x2e, 0x5d, 0x2b, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, + 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x30, 0x20, 0x69, 0x6e, + 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x61, 0x74, 0x68, + 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x30, 0x3a, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x22, 0x25, 0x2f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x67, 0x74, 0x5b, 0x5f, + 0x31, 0x5f, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x67, 0x74, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x22, 0x5e, 0x72, 0x65, 0x70, 0x6c, 0x25, 0x2d, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x25, 0x2d, 0x28, 0x2e, 0x2a, 0x29, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x5b, 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, - 0x20, 0x6f, 0x72, 0x20, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x5f, 0x64, 0x6f, 0x63, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x28, 0x22, 0x2e, 0x2a, + 0x22, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, + 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, + 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, + 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, + 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x64, + 0x6f, 0x63, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x61, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x64, 0x6f, 0x63, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, + 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x22, 0x61, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x22, 0x5d, 0x2c, 0x20, + 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x64, 0x6f, + 0x63, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, + 0x6f, 0x63, 0x73, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x28, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x67, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, + 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, + 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x6f, 0x70, - 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2c, 0x28, 0x5b, - 0x5e, 0x25, 0x73, 0x2f, 0x5d, 0x2b, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, - 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, - 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, - 0x20, 0x7e, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x22, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, - 0x74, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x72, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x65, - 0x78, 0x74, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x2e, 0x2a, 0x5b, - 0x25, 0x73, 0x29, 0x28, 0x5d, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, - 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x30, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, - 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, - 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, - 0x5f, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x30, 0x20, 0x3d, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6b, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x30, 0x20, - 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x73, 0x68, + 0x6f, 0x77, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, + 0x6f, 0x63, 0x73, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, + 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, + 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x73, 0x68, 0x6f, + 0x77, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x66, + 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x72, + 0x65, 0x70, 0x6c, 0x25, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x25, 0x2d, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, + 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, + 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6d, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x20, 0x3c, 0x20, 0x32, 0x30, 0x30, 0x30, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x30, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, - 0x3d, 0x3d, 0x20, 0x6b, 0x30, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x30, 0x2c, - 0x20, 0x23, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, - 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x6b, - 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, - 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x28, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x25, 0x2e, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x64, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, - 0x61, 0x64, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x69, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x30, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x5e, 0x28, 0x5b, 0x5e, 0x2e, 0x5d, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x2e, - 0x2a, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, - 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, - 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x5b, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, - 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, - 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, - 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6f, 0x72, - 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, - 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, - 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x45, - 0x4e, 0x56, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x47, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, - 0x72, 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, - 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, - 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, - 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, - 0x47, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x61, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, - 0x66, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, - 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, - 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, - 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, - 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, - 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, - 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x70, 0x20, - 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, - 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, - 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, + 0x2c, 0x28, 0x5b, 0x5e, 0x25, 0x73, 0x2f, 0x5d, 0x2b, 0x29, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, + 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0x20, 0x7e, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2c, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, + 0x20, 0x7e, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, + 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, + 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, + 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, + 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, + 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, + 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x73, 0x61, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x20, + 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, + 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6b, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, - 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x63, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x5f, 0x31, 0x5f, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x33, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, 0x76, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x72, 0x28, 0x5f, 0x33, 0x5f, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x76, 0x2e, 0x5f, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, - 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, - 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, + 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, + 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, 0x20, + 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x70, 0x20, 0x6f, + 0x72, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, + 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x70, 0x70, 0x28, 0x76, - 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x72, 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, + 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x5f, 0x31, 0x5f, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, - 0x6b, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, - 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x29, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, - 0x72, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x6f, 0x6b, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, + 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, 0x76, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x72, 0x28, 0x5f, 0x33, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x76, 0x2e, 0x5f, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x70, 0x70, 0x28, 0x76, 0x61, + 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x72, 0x63, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, + 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x29, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x22, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, + 0x6b, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x30, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, - 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x35, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x72, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x2c, - 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x5f, - 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x35, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, 0x5f, 0x33, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x34, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x78, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x2c, + 0x20, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, + 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, 0x62, 0x20, + 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, 0x69, + 0x74, 0x4c, 0x69, 0x62, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x5f, 0x30, + 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x35, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, - 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, - 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, + 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, - 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x73, - 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x5f, 0x34, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, - 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, - 0x63, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x61, 0x76, - 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, - 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, - 0x61, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x28, 0x65, - 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x73, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, + 0x34, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x61, 0x76, 0x65, + 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x30, - 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x61, + 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x37, 0x5f, 0x30, + 0x2c, 0x20, 0x5f, 0x38, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, + 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, + 0x2c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x37, 0x5f, - 0x30, 0x2c, 0x20, 0x5f, 0x38, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, - 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, - 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x2c, 0x20, 0x65, 0x6e, 0x76, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x5f, - 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x38, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x5f, 0x30, + 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x38, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, - 0x67, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, + 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4c, 0x75, 0x61, 0x20, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, - 0x20, 0x73, 0x72, 0x63, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x38, - 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4c, 0x75, 0x61, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, + 0x73, 0x72, 0x63, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x38, 0x5f, + 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x5f, 0x37, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, - 0x5f, 0x38, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x5f, 0x37, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x39, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x5f, + 0x38, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x39, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x30, 0x5f, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, + 0x6c, 0x28, 0x5f, 0x39, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x30, 0x5f, - 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x5f, 0x39, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x5f, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x0a, 0x65, 0x6e, - 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x35, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x3d, - 0x20, 0x32, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3d, - 0x20, 0x31, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, - 0x20, 0x33, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, - 0x34, 0x2c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, - 0x37, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x3d, 0x20, 0x36, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, - 0x72, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x5f, 0x30, 0x5f, 0x30, - 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x31, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x62, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x20, 0x62, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x61, 0x20, - 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x5b, 0x74, 0x61, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5b, 0x74, 0x62, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x64, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x74, 0x62, 0x29, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x35, + 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x3d, 0x20, + 0x32, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x33, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x34, + 0x2c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x37, + 0x2c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x36, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x72, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x2c, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, + 0x5f, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x62, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5b, + 0x74, 0x61, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5b, 0x74, 0x62, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, + 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x74, 0x62, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x74, 0x61, + 0x20, 0x3c, 0x20, 0x64, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x74, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x74, - 0x61, 0x20, 0x3c, 0x20, 0x64, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x74, - 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x64, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x74, 0x61, 0x20, 0x3c, 0x20, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, 0x5f, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, - 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x64, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x74, 0x61, 0x20, 0x3c, 0x20, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x67, 0x61, 0x70, 0x28, 0x6b, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6b, + 0x76, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x6b, 0x76, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, - 0x7e, 0x3d, 0x20, 0x69, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x6f, - 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x2b, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x7b, 0x6b, 0x2c, - 0x20, 0x76, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, - 0x6f, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x29, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x32, + 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x65, 0x73, 0x74, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x5f, + 0x35, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x69, + 0x29, 0x20, 0x3e, 0x20, 0x67, 0x61, 0x70, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x69, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x61, 0x70, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x69, 0x6c, 0x6c, 0x5f, 0x67, 0x61, 0x70, 0x73, 0x28, 0x6b, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x35, 0x31, 0x32, 0x20, 0x3c, 0x20, + 0x6a, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x20, 0x3c, + 0x20, 0x6a, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x7b, + 0x6b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, 0x5f, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x7b, 0x6b, 0x2c, 0x20, 0x76, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, + 0x6b, 0x76, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x61, + 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x67, 0x61, 0x70, 0x28, + 0x6b, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x67, 0x61, 0x70, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x3e, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x73, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x67, 0x61, 0x70, 0x22, 0x5d, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x5f, 0x67, 0x61, 0x70, + 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6b, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, @@ -1018,7 +1486,7 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x76, 0x2c, 0x20, - 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, @@ -1073,68 +1541,69 @@ unsigned char loadfennel_lua[] = { 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x74, 0x2c, - 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x20, 0x3d, - 0x20, 0x28, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x5b, - 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x5b, 0x6b, 0x5d, 0x20, 0x6f, - 0x72, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x28, 0x6b, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x29, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x5b, 0x76, 0x5d, 0x20, 0x6f, - 0x72, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x28, 0x76, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x29, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, - 0x65, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, + 0x20, 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6b, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, + 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, + 0x28, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, + 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6b, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, - 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x31, 0x20, 0x3c, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x69, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, - 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, - 0x3d, 0x20, 0x28, 0x23, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x69, 0x64, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, + 0x6b, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x76, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, + 0x76, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x28, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x6b, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, + 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, + 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x7b, 0x7d, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x31, 0x20, 0x3c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x69, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, + 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, + 0x20, 0x28, 0x23, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x69, 0x64, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6f, + 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, @@ -1272,516 +1741,606 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x36, 0x5f, 0x30, - 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x37, 0x5f, - 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x36, 0x5f, 0x30, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x37, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x36, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x20, 0x3d, + 0x20, 0x5f, 0x37, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, + 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x5f, 0x5b, 0x32, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x38, 0x5f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, - 0x2e, 0x70, 0x70, 0x28, 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x30, 0x20, 0x3d, 0x20, - 0x70, 0x70, 0x2e, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x30, 0x20, 0x2b, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x28, 0x6b, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, - 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6b, 0x30, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x76, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x6b, 0x30, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x76, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, - 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, - 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x61, 0x6c, 0x20, 0x5f, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x6b, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x73, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x28, 0x6b, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6b, 0x30, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x76, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x5f, 0x20, 0x3d, 0x20, + 0x28, 0x6b, 0x30, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, + 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x28, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x2c, 0x20, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x2c, 0x20, - 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, - 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, 0x3d, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, - 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, 0x2e, - 0x2e, 0x2e, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, - 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x40, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x3d, - 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x30, 0x20, 0x3d, 0x20, - 0x28, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, - 0x74, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, - 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x6e, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x40, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, - 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x30, - 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, - 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x73, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x30, 0x2c, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x6b, 0x76, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, 0x3d, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x69, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5b, 0x2e, 0x2e, + 0x2e, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, + 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, + 0x33, 0x66, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x28, + 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, + 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x22, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x5b, - 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x5f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x70, - 0x70, 0x2e, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, - 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, - 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x76, 0x30, - 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x76, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, - 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, - 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x35, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, + 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, + 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, + 0x20, 0x76, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x76, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, + 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, + 0x20, 0x5f, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, - 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x30, 0x2c, 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, - 0x79, 0x2d, 0x61, 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x22, 0x5b, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x2c, + 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, + 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, + 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, + 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x7d, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, + 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, + 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, + 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, + 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, 0x32, + 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, 0x6c, + 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6f, + 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x23, 0x6f, 0x6e, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x3e, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x2c, 0x20, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, + 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x74, + 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x3e, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, + 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, + 0x2e, 0x2e, 0x2e, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x7d, 0x22, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x2e, 0x2e, + 0x2e, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x5f, 0x32, + 0x34, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6e, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x5f, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, - 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, - 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x5e, 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, - 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6f, 0x6e, - 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, - 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x23, - 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x3e, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, - 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x29, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, - 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, - 0x28, 0x22, 0x20, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, - 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x74, 0x2c, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x20, 0x3e, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, - 0x79, 0x2d, 0x61, 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x5b, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x70, 0x70, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3f, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x22, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, - 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x5f, - 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, - 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x5f, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, - 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x6d, - 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x74, 0x2c, - 0x20, 0x70, 0x70, 0x2e, 0x70, 0x70, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x5f, 0x5f, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x6d, 0x65, 0x74, + 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x5b, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, - 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x5f, 0x30, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, + 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3f, 0x22, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x34, + 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, - 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x5f, 0x5f, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x6d, 0x65, - 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, + 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x32, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x65, 0x74, + 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, - 0x22, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3f, - 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, 0x5f, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x5b, + 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, + 0x7b, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, + 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, - 0x34, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, + 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, + 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x76, 0x65, 0x28, + 0x78, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, - 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x5f, - 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x65, - 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, - 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, - 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, 0x30, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x29, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x2d, 0x61, 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x3f, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, - 0x3d, 0x20, 0x22, 0x5b, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, - 0x20, 0x3d, 0x20, 0x22, 0x7b, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, - 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, - 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x5f, 0x34, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, + 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, - 0x20, 0x70, 0x70, 0x5f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, - 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x73, 0x65, 0x71, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, - 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x30, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, - 0x22, 0x2c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x20, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x28, 0x78, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x2c, + 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6c, + 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, + 0x28, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, + 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5e, 0x5f, 0x21, 0x24, 0x25, 0x26, 0x2a, + 0x2b, 0x2e, 0x2f, 0x40, 0x7c, 0x3c, 0x3d, 0x3e, 0x5d, 0x2b, 0x24, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3a, 0x66, 0x69, 0x6e, - 0x64, 0x28, 0x22, 0x5e, 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5c, 0x5c, 0x5e, - 0x5f, 0x21, 0x24, 0x25, 0x26, 0x2a, 0x2b, 0x2e, 0x2f, 0x40, 0x3a, 0x7c, - 0x3c, 0x3d, 0x3e, 0x5d, 0x2b, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, - 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, - 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x38, 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, + 0x20, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x73, 0x63, 0x73, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, + 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, 0x6e, 0x65, 0x77, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x23, 0x73, 0x74, 0x72, 0x20, 0x3c, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x2d, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, + 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, + 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x34, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x32, + 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x5c, 0x25, 0x30, 0x33, + 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5f, + 0x32, 0x34, 0x32, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x73, 0x63, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x5b, 0x22, 0x5c, + 0x22, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, + 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x31, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x32, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, + 0x5b, 0x22, 0x5c, 0x31, 0x33, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, + 0x5c, 0x72, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x37, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, + 0x38, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, + 0x20, 0x5b, 0x22, 0x5c, 0x39, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, + 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x5c, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x5b, 0x22, + 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x7d, 0x2c, + 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x5f, 0x34, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, + 0x5b, 0x25, 0x63, 0x5c, 0x5c, 0x5c, 0x22, 0x5d, 0x22, 0x2c, 0x20, 0x65, + 0x73, 0x63, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, + 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, + 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, 0x6e, 0x65, 0x77, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x38, + 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x73, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x2d, 0x67, 0x61, 0x70, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x31, 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x70, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x61, 0x70, 0x70, - 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, - 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x28, 0x74, - 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x3d, - 0x20, 0x7b, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, - 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, - 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, - 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, - 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6f, 0x76, - 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, 0x70, - 0x2e, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6b, - 0x65, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, - 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, - 0x72, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, - 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x28, 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x28, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x65, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, + 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, + 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x78, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x33, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, + 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x78, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, + 0x2e, 0x70, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, + 0x2e, 0x70, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x28, + 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x70, 0x65, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x35, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2e, 0x5f, + 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x35, 0x5f, 0x28, 0x29, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x78, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x30, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, - 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, - 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, - 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x78, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6c, + 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x76, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x28, + 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x30, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x36, 0x5f, 0x28, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x76, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x30, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x2c, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x22, 0x23, 0x3c, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x29, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, 0x78, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, 0x2e, 0x70, 0x70, + 0x67, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x23, 0x3c, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x78, 0x30, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, 0x78, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, @@ -1887,574 +2446,706 @@ unsigned char loadfennel_lua[] = { 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x6e, - 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, - 0x70, 0x28, 0x28, 0x65, 0x6e, 0x76, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, - 0x29, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, + 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x5f, + 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6b, 0x2c, 0x20, 0x76, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x31, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, + 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, + 0x6b, 0x5f, 0x30, 0x5f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x30, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x65, 0x6e, 0x76, + 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x6d, + 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, - 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, - 0x20, 0x28, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, - 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, - 0x2c, 0x20, 0x22, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, - 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x5f, - 0x47, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x47, 0x2e, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, 0x66, - 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x74, 0x22, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x30, 0x20, + 0x3d, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, + 0x47, 0x2c, 0x20, 0x22, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x5f, 0x47, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x47, 0x2e, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, + 0x66, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x74, + 0x22, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x28, 0x74, 0x67, 0x74, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x67, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, + 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x22, 0x23, 0x3c, 0x75, 0x6e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x3e, 0x22, 0x29, 0x29, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x24, 0x22, 0x2c, 0x20, 0x22, + 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, + 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x74, 0x67, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, + 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, + 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, + 0x74, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x22, 0x23, 0x3c, 0x75, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x3e, 0x22, 0x7d, 0x29, 0x2c, 0x20, 0x22, 0x20, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x61, 0x72, + 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x28, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x29, 0x5c, 0x6e, + 0x20, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x5c, 0x6e, 0x20, + 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, + 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, + 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, + 0x73, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, + 0x73, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x62, 0x6f, + 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x33, + 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x67, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, - 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, - 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x22, 0x23, 0x3c, 0x75, 0x6e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x65, 0x64, 0x3e, 0x22, 0x29, 0x29, 0x3a, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, - 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, - 0x20, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x74, 0x67, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x29, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, 0x5f, - 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, - 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, - 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x22, 0x23, 0x3c, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x3e, 0x22, 0x7d, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x61, 0x72, 0x67, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x28, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x29, 0x5c, 0x6e, 0x20, - 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, - 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, - 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, - 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5b, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, - 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, - 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, - 0x20, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, - 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, - 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, - 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, - 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x75, 0x62, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, - 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x20, 0x3d, 0x20, - 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3c, 0x20, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6e, - 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x30, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x2c, 0x20, - 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x28, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x29, 0x2c, 0x20, 0x74, - 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x3d, - 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x3d, 0x3d, - 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, - 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x30, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x64, 0x6f, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, + 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x20, + 0x3d, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, + 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, + 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3c, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x30, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, + 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, + 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x29, 0x2c, + 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, + 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, + 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x30, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x2c, 0x20, - 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, - 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x28, 0x73, 0x75, 0x62, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x30, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, + 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x28, 0x73, 0x75, + 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x30, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, + 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, + 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x30, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, + 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x72, + 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, + 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x79, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, + 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x79, 0x6d, 0x73, + 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x74, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6f, 0x72, - 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, - 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, + 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, + 0x64, 0x79, 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, + 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, 0x72, 0x67, + 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, + 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x3d, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, + 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x74, 0x61, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, - 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x72, 0x65, 0x5f, - 0x73, 0x79, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x65, - 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x79, 0x6d, - 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x73, 0x79, - 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x79, 0x6d, 0x73, 0x2c, 0x20, - 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, - 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, - 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, - 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x22, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, - 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x64, 0x6f, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6e, 0x69, 0x6c, 0x2c, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, - 0x61, 0x72, 0x67, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, - 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x64, 0x6f, 0x22, - 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, - 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x3b, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, - 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, - 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x7d, 0x29, 0x0a, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, + 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x64, 0x6f, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6e, 0x69, + 0x6c, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, + 0x22, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x64, + 0x6f, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, + 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x73, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x2c, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, + 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x31, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, + 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6a, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x73, 0x75, 0x62, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x2c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, - 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x5b, 0x6a, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x20, 0x4d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, - 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x78, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, - 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x78, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, - 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, - 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x28, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, - 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, - 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, - 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, - 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x2c, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, - 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x7d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x5f, - 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x3a, 0x66, - 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5c, - 0x5c, 0x5e, 0x5f, 0x21, 0x24, 0x25, 0x26, 0x2a, 0x2b, 0x2e, 0x2f, 0x40, - 0x3a, 0x7c, 0x3c, 0x3d, 0x3e, 0x5d, 0x2b, 0x24, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, - 0x71, 0x22, 0x2c, 0x20, 0x78, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, - 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, - 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, - 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x22, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x22, 0x29, 0x3a, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x61, 0x72, - 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x5c, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, - 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x28, - 0x22, 0x7b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x7d, 0x22, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x22, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x74, - 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x28, 0x22, - 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, - 0x73, 0x2b, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x3a, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x22, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, - 0x5c, 0x5c, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, - 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x29, 0x3a, 0x67, - 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, - 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, - 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, - 0x20, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x5c, - 0x22, 0x25, 0x73, 0x5c, 0x22, 0x29, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x70, - 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x73, 0x65, 0x74, 0x61, 0x6c, - 0x6c, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x29, 0x20, 0x65, 0x6e, - 0x64, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x66, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, - 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, 0x5d, 0x20, - 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, + 0x2c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x4d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x69, + 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x2c, 0x20, + 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x78, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, + 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, + 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, + 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, + 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, - 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x28, 0x66, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2c, 0x20, 0x33, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x2c, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x22, - 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x5f, 0x73, 0x79, - 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6e, 0x5f, - 0x73, 0x79, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x5b, 0x31, - 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x66, 0x6e, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, + 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, + 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, + 0x20, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, + 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, 0x30, + 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x7d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x22, 0x5e, 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5c, 0x5c, 0x5e, 0x5f, 0x21, + 0x24, 0x25, 0x26, 0x2a, 0x2b, 0x2e, 0x2f, 0x40, 0x3a, 0x7c, 0x3c, 0x3d, + 0x3e, 0x5d, 0x2b, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x78, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, + 0x78, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x5c, 0x5c, + 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x22, + 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x2c, + 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x22, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x22, 0x29, 0x3a, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x30, + 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x5c, 0x22, 0x66, 0x6e, 0x6c, + 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5c, 0x22, 0x22, 0x2c, + 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, + 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x7d, 0x22, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x22, 0x66, 0x6e, 0x6c, 0x2f, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x22, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, + 0x28, 0x22, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x25, 0x73, 0x2b, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x22, + 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x29, + 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x2c, 0x20, + 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x5c, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x29, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, + 0x22, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x73, 0x65, 0x74, + 0x61, 0x6c, 0x6c, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x29, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x22, + 0x2c, 0x20, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, + 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, + 0x5d, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, + 0x7d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, + 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, + 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2c, 0x20, 0x33, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x32, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x66, 0x6e, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x61, 0x72, 0x67, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, + 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, + 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, + 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, + 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, + 0x25, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5f, 0x30, 0x5f, 0x2c, 0x20, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x66, 0x6e, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, + 0x70, 0x72, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, + 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x66, 0x6e, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, + 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x66, 0x6e, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, + 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x28, + 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, + 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6e, 0x5f, 0x73, 0x79, + 0x6d, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x73, @@ -2549,766 +3240,807 @@ unsigned char loadfennel_lua[] = { 0x69, 0x6e, 0x67, 0x28, 0x61, 0x72, 0x67, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x61, 0x72, - 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, - 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x28, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, - 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, - 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, - 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, + 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x23, - 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, - 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, - 0x7e, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, - 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x3d, - 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x5f, 0x66, 0x6e, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, - 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, - 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x25, 0x73, 0x29, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x66, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x22, - 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, - 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, - 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, 0x67, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x66, 0x6e, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, - 0x70, 0x72, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x66, 0x6e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, - 0x61, 0x6d, 0x65, 0x3f, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x72, 0x67, 0x73, - 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x3f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, - 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x5c, 0x6e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x63, - 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, - 0x20, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5c, 0x6e, 0x61, 0x6e, 0x64, 0x20, - 0x6c, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x69, 0x6c, - 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x3d, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x28, - 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, - 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x20, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x5b, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x61, 0x73, - 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, - 0x66, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x7e, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, - 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, - 0x22, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, - 0x75, 0x70, 0x20, 0x64, 0x6f, 0x63, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, - 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, - 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x22, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x25, - 0x71, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x66, 0x6e, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x30, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x61, 0x72, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x28, 0x27, 0x25, 0x73, 0x27, 0x29, 0x2e, 0x64, 0x6f, 0x63, 0x28, - 0x25, 0x73, 0x2c, 0x20, 0x27, 0x25, 0x73, 0x27, 0x29, 0x29, 0x22, 0x29, - 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, - 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x64, - 0x6f, 0x63, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x74, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x31, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, - 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, - 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, - 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, - 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x6c, 0x65, - 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, - 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x22, 0x2e, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6e, - 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x5d, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, - 0x73, 0x29, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5b, 0x7b, 0x5c, - 0x22, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, - 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, - 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x2e, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x64, - 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, - 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, 0x20, - 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x6f, 0x6f, 0x6b, 0x20, 0x75, 0x70, - 0x20, 0x6b, 0x65, 0x79, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x62, 0x6c, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6d, - 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x64, - 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, - 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, - 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, - 0x2e, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, - 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x6f, 0x75, 0x6e, 0x64, - 0x65, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, - 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x65, - 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x73, 0x65, 0x74, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, 0x72, - 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, - 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x5f, 0x32, 0x31, - 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, + 0x73, 0x5f, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x61, + 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x66, 0x6e, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x22, 0x2c, 0x20, 0x22, + 0x61, 0x72, 0x67, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x20, 0x4d, + 0x61, 0x79, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, + 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x5c, 0x6e, 0x57, 0x68, + 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x72, 0x6f, 0x6e, 0x67, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5c, 0x6e, + 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6c, 0x61, + 0x6d, 0x62, 0x64, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, - 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, - 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x66, 0x6f, 0x72, 0x63, 0x69, - 0x62, 0x6c, 0x79, 0x21, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, - 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x5f, 0x32, 0x31, - 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, - 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x28, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x29, + 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x31, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x5f, + 0x30, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, + 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, + 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, + 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, + 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x31, 0x5f, 0x30, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x5f, 0x31, 0x5f, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x6e, + 0x69, 0x6c, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, + 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x27, 0x74, + 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x75, 0x70, 0x20, 0x64, 0x6f, 0x63, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, + 0x3d, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x28, 0x25, 0x71, 0x29, 0x22, 0x29, 0x3a, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, + 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x25, 0x73, 0x27, + 0x29, 0x2e, 0x64, 0x6f, 0x63, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x27, 0x25, + 0x73, 0x27, 0x29, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x64, 0x6f, 0x63, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, + 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, + 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x6f, 0x74, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x31, 0x20, 0x3c, + 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, + 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x20, + 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, + 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, + 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, + 0x22, 0x5d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, + 0x28, 0x22, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x28, + 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x22, 0x5b, 0x7b, 0x5c, 0x22, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, + 0x73, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x29, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, + 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x22, 0x2e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, + 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x6f, 0x6f, + 0x6b, 0x20, 0x75, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x31, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x62, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, + 0x49, 0x66, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x2e, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, + 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, - 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x64, - 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, - 0x6e, 0x65, 0x77, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x20, 0x69, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x76, 0x61, 0x72, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, - 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x73, - 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x76, 0x61, 0x72, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x76, 0x61, - 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, - 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, 0x6e, - 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, - 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, - 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, - 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x28, 0x23, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x25, 0x20, 0x32, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, - 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, + 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, + 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, - 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x20, 0x3d, - 0x20, 0x31, 0x2c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, - 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x70, 0x72, 0x65, 0x5f, 0x73, - 0x79, 0x6d, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, - 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x6c, 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, + 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x22, 0x73, 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x73, 0x65, 0x74, + 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, + 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, + 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x4f, 0x6e, + 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x6f, 0x6e, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x76, 0x61, 0x72, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, + 0x79, 0x5f, 0x32, 0x31, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x33, 0x2c, - 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, - 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, 0x74, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x76, 0x61, 0x6c, - 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x20, - 0x76, 0x61, 0x6c, 0x4e, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, - 0x73, 0x65, 0x64, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x74, 0x73, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, + 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x73, 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x66, + 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x21, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, + 0x79, 0x5f, 0x32, 0x31, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, 0x29, - 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, - 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x33, 0x2c, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, + 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, + 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, + 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, + 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x6f, 0x70, 0x2d, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x69, 0x6d, 0x6d, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, + 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, + 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x76, 0x61, 0x72, 0x22, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x76, 0x61, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, + 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x73, + 0x74, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, + 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x28, 0x28, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, + 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x70, + 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x23, 0x61, 0x73, - 0x74, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, 0x6f, 0x74, - 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6d, 0x74, 0x73, 0x74, - 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x3a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x7b, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, - 0x74, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x20, 0x65, - 0x6e, 0x64, 0x20, 0x28, 0x25, 0x73, 0x29, 0x5b, 0x25, 0x73, 0x5d, 0x20, - 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, - 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, - 0x5d, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, - 0x2c, 0x20, 0x22, 0x5d, 0x5b, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x74, 0x73, 0x65, 0x74, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6b, 0x65, 0x79, - 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, - 0x6b, 0x65, 0x79, 0x4e, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, - 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x20, - 0x43, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x5c, 0x6e, 0x6e, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, - 0x62, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, - 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, - 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, - 0x61, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x69, - 0x69, 0x66, 0x65, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, - 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, - 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, - 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, + 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, + 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, + 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x65, 0x74, 0x22, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, + 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x31, + 0x20, 0x76, 0x61, 0x6c, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x4e, 0x20, 0x76, 0x61, 0x6c, 0x4e, 0x5d, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x74, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x28, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, + 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, + 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x72, + 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x63, - 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, 0x20, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, - 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x69, 0x66, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, - 0x61, 0x70, 0x70, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, - 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6f, 0x70, 0x74, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x74, - 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, - 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, - 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x64, - 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, - 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x29, 0x24, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x7b, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x41, 0x4c, 0x53, 0x2e, 0x74, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, 0x2c, + 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x63, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, - 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, - 0x2d, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x64, 0x6f, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x64, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, - 0x3d, 0x20, 0x72, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x28, 0x69, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, - 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x32, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x63, 0x6f, - 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x2c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6c, - 0x73, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x23, 0x61, - 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x68, 0x61, 0x73, 0x5f, - 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x65, + 0x79, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x23, 0x61, 0x73, 0x74, 0x5d, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, + 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, + 0x65, 0x5f, 0x33, 0x66, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, + 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x20, 0x65, 0x6e, + 0x64, 0x20, 0x28, 0x25, 0x73, 0x29, 0x5b, 0x25, 0x73, 0x5d, 0x20, 0x3d, + 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, 0x73, + 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, + 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x22, 0x5d, 0x5b, 0x22, 0x29, 0x2c, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x74, 0x73, 0x65, + 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, 0x20, + 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, + 0x22, 0x2c, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x4e, 0x22, 0x2c, 0x20, 0x22, + 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x5c, + 0x6e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, + 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x69, 0x69, 0x66, 0x65, 0x22, 0x2c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x20, 0x3d, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x5b, - 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x73, 0x74, 0x72, 0x20, 0x3d, - 0x20, 0x22, 0x69, 0x66, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x73, 0x74, - 0x72, 0x20, 0x3d, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, - 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, - 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x66, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5b, 0x69, + 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x73, + 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x5f, 0x32, 0x61, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2c, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, + 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x22, 0x5d, 0x28, 0x64, 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, + 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, + 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, + 0x5d, 0x2c, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6f, + 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x7b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x28, 0x23, + 0x61, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x32, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x64, 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x28, + 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, + 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, + 0x20, 0x32, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x65, 0x78, + 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, + 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x25, + 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x28, + 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x28, 0x23, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x73, 0x74, 0x72, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x73, + 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x69, 0x66, 0x20, 0x25, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, + 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x20, + 0x3d, 0x3d, 0x20, 0x23, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, + 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x72, 0x61, @@ -3469,257 +4201,338 @@ unsigned char loadfennel_lua[] = { 0x75, 0x74, 0x68, 0x79, 0x2e, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x70, 0x73, - 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, - 0x4c, 0x53, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, - 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, - 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x20, 0x3d, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x23, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, - 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, - 0x22, 0x5d, 0x28, 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x22, 0x5d, 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, - 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5b, - 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, - 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, - 0x5d, 0x28, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, - 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x5f, - 0x76, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, - 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x74, - 0x65, 0x72, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, - 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, - 0x66, 0x6f, 0x72, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, - 0x20, 0x64, 0x6f, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x2c, - 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x76, 0x61, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, - 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x61, 0x72, - 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, - 0x2c, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, - 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x61, 0x70, 0x70, 0x6c, 0x79, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x5d, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, - 0x6b, 0x65, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x28, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x5d, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x75, 0x6e, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, - 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, - 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, - 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x5c, 0x6e, - 0x4d, 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, - 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2c, - 0x20, 0x62, 0x75, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, - 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, - 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, - 0x6e, 0x31, 0x20, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x32, 0x20, 0x3d, 0x20, - 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x31, 0x20, 0x7e, 0x3d, - 0x20, 0x6c, 0x65, 0x6e, 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x31, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, 0x6c, - 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, - 0x28, 0x22, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, - 0x6e, 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5b, 0x31, 0x5d, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x77, - 0x68, 0x69, 0x6c, 0x65, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x64, - 0x6f, 0x22, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x75, 0x62, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x28, 0x23, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x2c, 0x20, 0x28, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, - 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x5f, - 0x32, 0x61, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, - 0x2c, 0x20, 0x7b, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, - 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x2e, - 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, - 0x6f, 0x64, 0x79, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x61, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, - 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x74, 0x72, 0x75, 0x74, 0x68, 0x79, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x5f, - 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x28, 0x22, 0x69, 0x66, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x22, + 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x75, 0x61, 0x29, 0x29, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, + 0x2e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, - 0x5d, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, + 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, - 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, + 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, + 0x29, 0x29, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, + 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, + 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, + 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5b, 0x72, 0x61, 0x77, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, 0x72, + 0x61, 0x77, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x72, + 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x74, 0x65, 0x72, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x66, 0x6f, 0x72, + 0x20, 0x25, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x64, 0x6f, + 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x62, + 0x69, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x22, 0x2c, + 0x20, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x72, + 0x61, 0x77, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x5d, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x28, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, + 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x7b, + 0x22, 0x5b, 0x6b, 0x65, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x28, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x5d, 0x22, + 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, + 0x75, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, + 0x65, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x5c, 0x6e, 0x4d, 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x61, 0x6e, 0x79, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x31, 0x20, 0x3d, + 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x65, 0x6e, 0x32, 0x20, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6c, 0x65, 0x6e, 0x31, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, + 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x6c, + 0x65, 0x6e, 0x31, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x6c, 0x65, + 0x6e, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x20, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x73, 0x75, 0x62, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x28, 0x22, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x29, + 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, + 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, + 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, + 0x4c, 0x53, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x2e, 0x20, 0x45, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x6e, + 0x2d, 0x74, 0x72, 0x75, 0x74, 0x68, 0x79, 0x2e, 0x22, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, + 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, + 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, + 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, 0x20, 0x28, 0x22, + 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, + 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x28, 0x23, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x3c, + 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x5b, 0x34, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x23, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x33, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, @@ -3744,75 +4557,112 @@ unsigned char loadfennel_lua[] = { 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x33, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x28, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x73, 0x74, - 0x6f, 0x70, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3f, 0x5d, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4e, 0x75, 0x6d, - 0x65, 0x72, 0x69, 0x63, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x5c, 0x6e, 0x45, 0x76, - 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x65, 0x74, - 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x28, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x29, 0x2e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x32, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, - 0x20, 0x22, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x25, 0x73, 0x28, 0x25, 0x73, - 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x3a, - 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, - 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x6d, + 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, + 0x66, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x5f, + 0x32, 0x61, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, + 0x7b, 0x22, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x65, 0x70, + 0x3f, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x2e, 0x5c, 0x6e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x70, + 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x29, + 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, + 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x76, 0x61, 0x72, + 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x22, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x25, 0x73, 0x28, + 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x25, + 0x73, 0x3a, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, + 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, + 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x6e, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x33, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, + 0x73, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x28, 0x25, 0x73, + 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x30, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x6e, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, + 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, @@ -3824,180 +4674,144 @@ unsigned char loadfennel_lua[] = { 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x30, - 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x28, 0x25, 0x73, 0x29, 0x22, - 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x61, 0x72, 0x67, 0x73, 0x30, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, - 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, - 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x3d, 0x20, 0x22, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, + 0x5b, 0x6d, 0x5d, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x25, + 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, + 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, + 0x6c, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, + 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, + 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, + 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x32, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, + 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, - 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, - 0x22, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, - 0x67, 0x74, 0x2c, 0x20, 0x6d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, 0x5b, 0x6d, - 0x5d, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, - 0x65, 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x29, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, - 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x2c, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, - 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x32, 0x20, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x34, - 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, - 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, - 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, - 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x6d, 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, - 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x73, 0x79, 0x6d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x6f, 0x6e, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, + 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x34, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, + 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, - 0x4c, 0x53, 0x5b, 0x22, 0x3a, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x3a, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, - 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6f, - 0x6e, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x2e, 0x5c, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, - 0x27, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, - 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x3b, - 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x2c, 0x20, 0x75, - 0x73, 0x65, 0x5c, 0x6e, 0x28, 0x74, 0x62, 0x6c, 0x3a, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x61, 0x73, - 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x3a, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x2d, 0x2d, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x65, 0x6c, 0x73, 0x2c, 0x20, - 0x22, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, - 0x62, 0x65, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, + 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x3a, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x3a, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, + 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, + 0x2c, 0x20, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x5c, 0x6e, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x6e, 0x27, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x74, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x2c, + 0x20, 0x75, 0x73, 0x65, 0x5c, 0x6e, 0x28, 0x74, 0x62, 0x6c, 0x3a, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, + 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, + 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x6f, + 0x6e, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x28, 0x22, 0x2d, 0x2d, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x29, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x2c, @@ -4156,1367 +4970,1762 @@ unsigned char loadfennel_lua[] = { 0x24, 0x2e, 0x2e, 0x2e, 0x20, 0x4f, 0x52, 0x20, 0x24, 0x31, 0x2c, 0x20, 0x24, 0x32, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, - 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, - 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x28, 0x6c, 0x75, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, - 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, + 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, + 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x7a, 0x65, - 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x7e, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x6e, 0x20, 0x30, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, - 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, - 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, + 0x69, 0x74, 0x79, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, + 0x20, 0x30, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x7a, 0x65, 0x72, 0x6f, + 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x20, + 0x3d, 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, - 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, - 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, - 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x75, - 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, - 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, + 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x61, 0x72, - 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x23, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, - 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, - 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x41, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, - 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, - 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x70, + 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, - 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x27, 0x27, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, + 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x5e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, - 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x28, 0x6c, 0x75, 0x61, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, + 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, + 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x41, + 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, - 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2a, - 0x22, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2b, + 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x25, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2f, 0x22, - 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x29, 0x0a, + 0x22, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x27, 0x27, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2f, 0x2f, 0x22, 0x2c, 0x20, 0x6e, 0x69, - 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, - 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, - 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, 0x6e, 0x69, - 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x3c, 0x3c, 0x22, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x5e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, + 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, + 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2a, 0x22, 0x2c, 0x20, + 0x22, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x25, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, - 0x74, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, - 0x2c, 0x20, 0x22, 0x3e, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, - 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, - 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x62, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, - 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x26, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, - 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x30, - 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7c, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, - 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, - 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, - 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, - 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, - 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, - 0x74, 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, - 0x20, 0x62, 0x79, 0x20, 0x6e, 0x20, 0x62, 0x69, 0x74, 0x73, 0x3b, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, - 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, - 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, - 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, - 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, - 0x62, 0x79, 0x20, 0x6e, 0x20, 0x62, 0x69, 0x74, 0x73, 0x3b, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, - 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x2e, 0x22, 0x29, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2f, 0x22, 0x2c, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, + 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x2f, 0x2f, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x22, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, + 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, + 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, + 0x5b, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x61, 0x6e, + 0x64, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x61, + 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, + 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, + 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, + 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, + 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, + 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, + 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, + 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, + 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, + 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x30, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6e, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x28, 0x22, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, + 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, + 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x3d, 0x20, + 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, + 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, + 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, + 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, + 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x6c, 0x69, + 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, + 0x64, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, + 0x64, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, + 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, + 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6e, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x30, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x69, + 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, + 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, + 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x3c, + 0x3c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, 0x22, + 0x3e, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, + 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x26, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, + 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x62, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, + 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7c, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, + 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, + 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, + 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, + 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x20, + 0x62, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, + 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, + 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, + 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, 0x7b, + 0x22, 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, 0x62, 0x79, 0x20, + 0x6e, 0x20, 0x62, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, + 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, + 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, + 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, + 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x41, 0x4e, - 0x44, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x3b, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, - 0x33, 0x2b, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, + 0x22, 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, + 0x77, 0x69, 0x73, 0x65, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, + 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, + 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, + 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, - 0x32, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, - 0x65, 0x20, 0x4f, 0x52, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, - 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, + 0x32, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, + 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x4f, 0x52, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, + 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, + 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, + 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x62, + 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x31, 0x22, - 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, - 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x58, 0x4f, 0x52, 0x20, 0x6f, 0x66, - 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, - 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, - 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, - 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, - 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x75, - 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, - 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x6f, 0x6f, - 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, - 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, - 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6f, 0x72, - 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, - 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, - 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, - 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, - 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, - 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, - 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, - 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, - 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, - 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, - 0x70, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, - 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x20, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x68, 0x73, 0x5f, 0x61, - 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x33, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, - 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6c, 0x68, - 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, - 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, 0x20, - 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x72, 0x68, 0x73, 0x5f, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x5f, - 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, 0x25, 0x73, 0x20, - 0x25, 0x73, 0x20, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x2c, 0x20, - 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x72, 0x68, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, - 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, 0x25, 0x73, 0x20, - 0x22, 0x2c, 0x20, 0x28, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x32, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, - 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, - 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x23, 0x61, 0x72, - 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x29, 0x22, - 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, 0x5d, - 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, - 0x74, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x25, 0x73, 0x29, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x65, - 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, - 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, - 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x29, 0x2c, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, - 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x20, - 0x3d, 0x20, 0x28, 0x6c, 0x75, 0x61, 0x5f, 0x6f, 0x70, 0x20, 0x6f, 0x72, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x20, 0x23, 0x61, - 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, - 0x74, 0x77, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x33, 0x20, 0x3d, - 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, - 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, - 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, - 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, - 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x20, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, - 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, - 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, - 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3c, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3e, 0x3d, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x3c, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x3d, 0x3d, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x3d, 0x22, 0x2c, 0x20, - 0x22, 0x7e, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x72, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, - 0x7e, 0x3d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6e, 0x6f, 0x74, 0x3d, 0x22, 0x5d, 0x0a, + 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, + 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, + 0x20, 0x58, 0x4f, 0x52, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, + 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, + 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, + 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, + 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, + 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x30, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, + 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x32, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, + 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x6c, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x72, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x68, + 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x22, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x29, 0x22, + 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, + 0x68, 0x73, 0x29, 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x68, 0x73, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x22, 0x20, 0x25, 0x73, 0x20, 0x22, 0x2c, 0x20, 0x28, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x61, 0x6e, + 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, + 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x28, 0x23, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x2d, + 0x20, 0x31, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, + 0x20, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, + 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, 0x61, + 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x25, 0x73, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x25, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x29, + 0x22, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x22, 0x2c, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, + 0x22, 0x2c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, - 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6f, 0x70, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x75, 0x61, 0x5f, + 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, - 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x6f, 0x70, - 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x69, 0x6c, - 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, - 0x4c, 0x53, 0x5b, 0x6f, 0x70, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x66, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, - 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, - 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, - 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, - 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, - 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x62, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, - 0x73, 0x65, 0x20, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, - 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, - 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, - 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x20, - 0x22, 0x23, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x23, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x3d, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, + 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, - 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, - 0x6f, 0x2d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x5d, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x51, 0x75, 0x61, 0x73, 0x69, - 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, - 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, - 0x65, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x57, 0x41, 0x52, 0x4e, 0x49, - 0x4e, 0x47, 0x3a, 0x20, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, - 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x5c, - 0x6e, 0x49, 0x6e, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x46, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x5c, 0x6e, 0x2d, 0x2d, 0x6e, 0x6f, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x20, - 0x66, 0x6c, 0x61, 0x67, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6f, - 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, - 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, - 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, - 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x5f, 0x2c, 0x20, 0x6b, 0x65, 0x79, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x69, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x2e, - 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, - 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x5b, 0x6b, 0x65, 0x79, - 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, - 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x5b, 0x6b, 0x65, 0x79, 0x5d, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x6f, - 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x3a, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x65, - 0x6e, 0x76, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x75, 0x73, 0x65, 0x20, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x61, - 0x66, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6d, 0x74, 0x20, 0x7e, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x22, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x49, 0x6c, 0x6c, 0x65, - 0x67, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x21, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, - 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, - 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x7b, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x20, 0x3d, - 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, - 0x22, 0x62, 0x69, 0x74, 0x22, 0x29, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6d, 0x61, 0x74, 0x68, - 0x29, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, - 0x78, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, - 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, - 0x20, 0x72, 0x61, 0x77, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x72, 0x61, 0x77, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x72, 0x61, - 0x77, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, - 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, - 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, - 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x72, 0x61, - 0x77, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, - 0x74, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, - 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x2c, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, - 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, - 0x72, 0x6e, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, - 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, + 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, + 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, + 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x3c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3e, + 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3c, 0x3d, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3d, 0x22, 0x2c, 0x20, 0x22, + 0x3d, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, + 0x74, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x3d, 0x22, 0x2c, 0x20, 0x22, + 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x72, + 0x65, 0x61, 0x6c, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, - 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x5b, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x33, 0x5f, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6f, - 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x62, 0x61, - 0x73, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x5f, 0x28, - 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2c, 0x20, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, - 0x6c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, + 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, - 0x78, 0x70, 0x61, 0x6e, 0x64, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x35, - 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x45, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x5f, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, - 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, - 0x35, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x5b, 0x22, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, - 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x20, - 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x5f, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, - 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x36, 0x5f, 0x20, - 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x65, 0x74, 0x2d, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, - 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x5b, - 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, - 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x2c, - 0x20, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, - 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5f, 0x41, 0x53, 0x54, 0x20, 0x3d, 0x20, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x49, - 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x4f, 0x50, - 0x45, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x5f, 0x56, 0x41, 0x52, - 0x41, 0x52, 0x47, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x76, 0x61, 0x72, 0x67, 0x28, 0x29, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x2c, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, - 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, - 0x70, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x2c, 0x20, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2c, - 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, - 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, - 0x3d, 0x20, 0x5f, 0x36, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x66, - 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x22, 0x28, - 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, - 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x70, - 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x63, - 0x66, 0x67, 0x28, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x2f, 0x22, 0x29, - 0x2c, 0x20, 0x28, 0x63, 0x66, 0x67, 0x28, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x22, 0x3b, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x63, 0x66, 0x67, 0x28, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x64, 0x69, 0x72, 0x73, 0x65, - 0x70, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x2c, 0x20, - 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x3d, 0x20, 0x70, - 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x74, - 0x68, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, - 0x65, 0x70, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x73, 0x63, - 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, - 0x74, 0x72, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5d, 0x22, 0x2c, - 0x20, 0x22, 0x25, 0x25, 0x25, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x74, 0x68, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, - 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x20, 0x3d, 0x20, 0x65, 0x73, 0x63, - 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, 0x6b, 0x67, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, - 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x28, - 0x22, 0x28, 0x5b, 0x5e, 0x25, 0x73, 0x5d, 0x2a, 0x29, 0x25, 0x73, 0x22, - 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x70, 0x61, 0x74, - 0x68, 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x2c, 0x20, 0x70, 0x61, 0x74, - 0x68, 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x5f, 0x64, 0x6f, - 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x2c, 0x20, 0x70, 0x6b, 0x67, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x64, 0x69, 0x72, 0x73, - 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, - 0x20, 0x28, 0x28, 0x70, 0x61, 0x74, 0x68, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x22, 0x5d, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, - 0x73, 0x75, 0x62, 0x28, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, - 0x74, 0x28, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x29, 0x2c, 0x20, - 0x6e, 0x6f, 0x5f, 0x64, 0x6f, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x32, - 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, - 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, - 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x29, 0x2c, 0x20, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, - 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x70, 0x61, 0x74, - 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x72, - 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x28, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, - 0x2b, 0x20, 0x23, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x69, 0x6c, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x72, + 0x65, 0x61, 0x6c, 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x74, 0x61, 0x69, 0x6c, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6f, 0x70, 0x5d, 0x20, + 0x3d, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6e, + 0x6f, 0x74, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, + 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, + 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, + 0x75, 0x61, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, 0x6f, 0x74, 0x22, 0x2c, + 0x20, 0x22, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, 0x6f, + 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, + 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, + 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, + 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x23, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x20, + 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x22, 0x7e, 0x3d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6e, 0x6f, 0x74, 0x3d, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x22, 0x23, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, - 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x31, 0x29, 0x0a, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x6f, 0x2d, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, + 0x20, 0x22, 0x51, 0x75, 0x61, 0x73, 0x69, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, + 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, + 0x33, 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x47, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x76, + 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x7b, 0x22, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, 0x20, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x22, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x22, 0x2c, 0x20, + 0x22, 0x2d, 0x2d, 0x6e, 0x6f, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x20, 0x66, + 0x6c, 0x61, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x20, 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x45, 0x6e, 0x76, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x5c, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, 0x72, 0x6e, + 0x28, 0x5f, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, + 0x47, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x76, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, + 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, + 0x5f, 0x33, 0x66, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, + 0x33, 0x66, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, + 0x72, 0x72, 0x29, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x75, 0x73, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x22, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, + 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x6d, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x22, 0x22, 0x29, 0x29, + 0x2c, 0x20, 0x22, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x21, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x74, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, + 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, 0x33, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, + 0x20, 0x62, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, + 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x62, 0x69, 0x74, 0x22, 0x29, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, + 0x5f, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, + 0x79, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x29, 0x2c, 0x20, 0x6e, 0x65, 0x78, + 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, + 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x65, 0x71, 0x75, + 0x61, 0x6c, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, + 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, + 0x22, 0x29, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, + 0x70, 0x79, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x78, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, + 0x6c, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, + 0x76, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, + 0x64, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, 0x33, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x30, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x45, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x45, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, + 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, + 0x6e, 0x76, 0x22, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, + 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, - 0x6f, 0x70, 0x79, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, - 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, - 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, - 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, - 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, - 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x33, 0x5f, - 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x6e, 0x76, - 0x2c, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x6b, 0x20, 0x69, 0x6e, - 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x22, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x5f, + 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x28, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x5f, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, + 0x20, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, + 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x65, 0x74, 0x2d, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, + 0x5f, 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x2c, 0x20, + 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, + 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, + 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, + 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, + 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, + 0x5d, 0x2c, 0x20, 0x5f, 0x41, 0x53, 0x54, 0x20, 0x3d, 0x20, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x49, 0x53, 0x5f, + 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x20, + 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, + 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, + 0x47, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, + 0x72, 0x67, 0x28, 0x29, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x2c, 0x20, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x76, + 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x47, 0x20, 0x3d, + 0x20, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x7b, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, + 0x5f, 0x6d, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x66, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2c, 0x20, 0x22, 0x28, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, + 0x72, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, + 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, + 0x3d, 0x20, 0x28, 0x63, 0x66, 0x67, 0x28, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x2f, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x63, 0x66, 0x67, 0x28, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x63, + 0x66, 0x67, 0x28, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6b, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x64, + 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, + 0x65, 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2c, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, + 0x77, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x25, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, - 0x5f, 0x64, 0x6f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, - 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, - 0x5f, 0x33, 0x66, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x6d, 0x6f, - 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, - 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, - 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, - 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x20, - 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, 0x73, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x7d, 0x2c, 0x20, 0x6d, 0x6f, 0x64, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, - 0x6d, 0x65, 0x5d, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2e, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x64, 0x6f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, - 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x27, 0x5d, - 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, - 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, - 0x32, 0x61, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x62, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, - 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, - 0x6e, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0x2c, 0x20, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x20, - 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x20, 0x3d, + 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, + 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, + 0x74, 0x68, 0x73, 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x28, 0x5b, 0x5e, 0x25, 0x73, 0x5d, 0x2a, + 0x29, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x2c, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x6f, 0x5f, 0x64, 0x6f, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x2c, + 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x5f, 0x64, 0x6f, 0x74, 0x5f, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, - 0x5d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x61, 0x73, 0x74, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, - 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, - 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x5d, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, - 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, - 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, - 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, - 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x64, 0x6f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, - 0x6e, 0x76, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x22, - 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x69, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x5c, 0x6e, 0x4d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, - 0x6c, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x5c, 0x6e, 0x43, 0x6f, 0x6e, 0x73, - 0x69, 0x64, 0x65, 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x61, 0x73, 0x20, - 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x66, - 0x6c, 0x65, 0x78, 0x69, 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x61, 0x6d, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, + 0x61, 0x74, 0x28, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x29, 0x2c, + 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, + 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, + 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, + 0x61, 0x74, 0x68, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6e, 0x64, + 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x28, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x2b, 0x20, 0x23, 0x70, 0x61, 0x74, 0x68, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x28, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x65, 0x72, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x41, 0x73, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x5d, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, + 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x5f, 0x33, 0x5f, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x72, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x22, 0x5d, 0x28, 0x73, 0x72, 0x63, 0x29, 0x2c, 0x20, 0x70, - 0x61, 0x74, 0x68, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2c, 0x20, 0x76, 0x61, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, - 0x2c, 0x20, 0x23, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, - 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, - 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, - 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x5b, 0x69, 0x5d, - 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, - 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2c, 0x20, 0x6b, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x5b, 0x22, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x65, 0x6e, 0x76, + 0x20, 0x3d, 0x20, 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, + 0x52, 0x22, 0x7d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, + 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, - 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, - 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, - 0x64, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x6c, 0x6f, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, - 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x0a, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, + 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, 0x2e, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x2c, 0x20, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x3a, 0x72, + 0x65, 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x78, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x28, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, + 0x63, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x29, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6c, 0x75, 0x61, 0x5f, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, + 0x5b, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x31, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x33, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, + 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5f, - 0x30, 0x5f, 0x28, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x2e, 0x2e, - 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x5f, 0x30, - 0x5f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x2c, 0x20, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x22, - 0x2a, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x22, 0x5b, 0x5c, 0x31, 0x33, 0x5c, 0x6e, 0x5d, 0x2a, 0x24, 0x22, 0x2c, - 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, - 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x78, 0x70, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x28, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, - 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x64, - 0x65, 0x62, 0x75, 0x67, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, - 0x61, 0x63, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x28, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, - 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x29, 0x22, 0x29, 0x2c, - 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x28, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x5b, 0x25, 0x71, 0x5d, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x6f, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x3d, 0x20, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, - 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, - 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x74, - 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x74, - 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, - 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x33, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x64, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, 0x73, 0x72, - 0x63, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, - 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, + 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, + 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, + 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, + 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x29, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, + 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x5f, - 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, - 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x2c, 0x20, 0x66, - 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, - 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x6e, 0x6c, - 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, - 0x22, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, - 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, - 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x61, 0x73, 0x74, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, + 0x5d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, + 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, + 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, + 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, - 0x70, 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, - 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, - 0x5d, 0x29, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, - 0x20, 0x33, 0x34, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, - 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, - 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x62, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x20, - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, - 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, - 0x29, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x20, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, + 0x70, 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x22, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0x20, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, + 0x31, 0x5d, 0x29, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, + 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, + 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x2c, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, + 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x5c, 0x6e, + 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x5c, + 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x69, 0x62, 0x6c, 0x65, + 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6d, 0x69, + 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x28, 0x73, 0x72, + 0x63, 0x29, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x66, 0x6f, 0x72, 0x6d, + 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x66, + 0x6f, 0x72, 0x6d, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, + 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, + 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x66, 0x6f, 0x72, + 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x66, + 0x6e, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, + 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, + 0x74, 0x68, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, + 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x6f, 0x6b, 0x5f, 0x30, + 0x5f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, + 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3a, 0x72, + 0x65, 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5c, 0x31, 0x33, 0x5c, 0x6e, + 0x5d, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, + 0x5f, 0x28, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x5f, 0x32, 0x5f, + 0x2c, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, 0x2e, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x5c, 0x22, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, + 0x22, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x28, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x25, 0x71, 0x5d, 0x22, + 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x6f, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x20, + 0x3d, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6f, 0x72, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, + 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x22, 0x65, 0x6e, + 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x65, 0x6d, 0x70, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x69, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, + 0x72, 0x63, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, + 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, + 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, + 0x70, 0x72, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x22, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, + 0x61, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x6d, 0x6f, + 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x3a, 0x62, 0x79, + 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, - 0x6f, 0x64, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x6c, 0x75, - 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, - 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, + 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x6c, 0x64, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, + 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, + 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, - 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, - 0x6f, 0x64, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, 0x22, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x29, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, + 0x5d, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, + 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x20, 0x2d, 0x2d, 0x5b, 0x5b, 0x53, + 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, + 0x44, 0x45, 0x5d, 0x5d, 0x2d, 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, @@ -5525,118 +6734,124 @@ unsigned char loadfennel_lua[] = { 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x6f, 0x72, - 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, - 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x20, 0x69, 0x74, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x4c, 0x75, 0x61, - 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, - 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, + 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, + 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6d, + 0x62, 0x65, 0x64, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x5c, 0x6e, 0x4c, 0x75, 0x61, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, - 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, - 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, - 0x29, 0x29, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, - 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x73, 0x28, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x7b, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, - 0x65, 0x2d, 0x31, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, - 0x5d, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x3a, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x4e, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x2d, - 0x4e, 0x7d, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, - 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, - 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x22, 0x65, 0x76, 0x61, 0x6c, 0x2d, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x63, 0x6f, 0x70, 0x79, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x28, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, + 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, + 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, + 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x65, 0x76, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x6c, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, - 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, - 0x6c, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, - 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x65, 0x76, 0x61, 0x6c, 0x2d, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, - 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x69, 0x66, - 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x29, + 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x7b, 0x3a, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x31, 0x20, 0x28, 0x66, + 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x4e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x4e, 0x7d, 0x22, 0x7d, 0x2c, 0x20, + 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x65, 0x76, 0x61, + 0x6c, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x6f, 0x6c, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x65, 0x76, + 0x61, 0x6c, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, + 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x20, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x65, 0x61, 0x64, 0x20, 0x69, 0x66, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x20, @@ -5647,847 +6862,891 @@ unsigned char loadfennel_lua[] = { 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2c, 0x20, - 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, - 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, - 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, - 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, - 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, - 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x64, 0x65, 0x70, 0x74, - 0x68, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x61, 0x75, 0x74, 0x6f, - 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x2c, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, 0x3d, 0x20, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x66, 0x6e, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, + 0x73, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x5b, 0x22, + 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x5b, 0x22, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x77, 0x72, + 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, + 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x64, 0x6f, 0x63, + 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x7d, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, + 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, + 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, + 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, + 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, + 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x61, + 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x30, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, + 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x29, - 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2c, - 0x20, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, - 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, - 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, - 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x73, - 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, - 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, - 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, - 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x73, 0x79, - 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x75, 0x6e, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, + 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, + 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, + 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, + 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, + 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x72, 0x65, 0x66, 0x65, + 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, 0x2c, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, - 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, - 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x76, - 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6d, - 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, - 0x5f, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, - 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, - 0x6c, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, - 0x66, 0x28, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x5b, 0x31, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, - 0x5b, 0x31, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x28, 0x29, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x20, - 0x25, 0x73, 0x3a, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, - 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, + 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, + 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x7d, 0x29, 0x2c, + 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x30, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x61, + 0x72, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x30, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x7d, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x67, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x73, 0x67, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x76, - 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, - 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x0a, 0x20, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, - 0x73, 0x75, 0x62, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x5c, - 0x31, 0x31, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x76, 0x22, - 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x32, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x37, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, - 0x22, 0x5c, 0x38, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, - 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x39, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x6e, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, - 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x5c, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, - 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x29, 0x2c, - 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x29, 0x2c, 0x20, - 0x22, 0x5b, 0x5c, 0x31, 0x32, 0x38, 0x2d, 0x5c, 0x32, 0x35, 0x35, 0x5d, - 0x22, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x73, - 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, - 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x73, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, + 0x6c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, + 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, + 0x74, 0x62, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x28, + 0x29, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x5f, 0x25, 0x30, 0x32, 0x78, - 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, - 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5f, 0x5f, 0x66, 0x6e, 0x6c, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5e, - 0x25, 0x77, 0x5d, 0x22, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x5e, 0x5f, 0x5f, 0x66, - 0x6e, 0x6c, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, 0x28, - 0x2e, 0x2a, 0x29, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, - 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x5f, 0x32, 0x34, - 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x73, 0x75, 0x62, 0x28, - 0x32, 0x29, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x3a, 0x25, 0x73, + 0x3a, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x3a, + 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, + 0x2e, 0x69, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, + 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x73, + 0x67, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, + 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x7b, 0x5b, 0x22, 0x5c, 0x31, 0x31, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x32, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, + 0x5b, 0x22, 0x5c, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, + 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x38, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x39, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x2c, 0x20, + 0x5b, 0x22, 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x22, + 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x22, 0x5c, 0x5c, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x5f, 0x32, 0x34, 0x31, + 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x75, 0x62, + 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x5c, 0x31, 0x32, 0x38, 0x2d, + 0x5c, 0x32, 0x35, 0x35, 0x5d, 0x22, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, + 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, + 0x5f, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, + 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x72, 0x65, 0x73, 0x74, - 0x2c, 0x20, 0x22, 0x5f, 0x5b, 0x25, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x5b, - 0x25, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x5f, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5f, 0x5f, + 0x66, 0x6e, 0x6c, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5d, 0x22, 0x2c, 0x20, 0x5f, + 0x30, 0x5f, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, + 0x22, 0x5e, 0x5f, 0x5f, 0x66, 0x6e, 0x6c, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x5f, 0x28, 0x2e, 0x2a, 0x29, 0x24, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, + 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, + 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x3a, 0x73, 0x75, 0x62, 0x28, 0x32, 0x29, 0x2c, 0x20, 0x31, 0x36, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x72, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x5f, 0x5b, 0x25, 0x64, + 0x61, 0x2d, 0x66, 0x5d, 0x5b, 0x25, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x22, + 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x33, + 0x66, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2c, - 0x20, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x2e, - 0x2e, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x29, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x28, 0x61, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, - 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, - 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x75, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, - 0x6f, 0x72, 0x64, 0x73, 0x22, 0x5d, 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x20, - 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x22, 0x5e, 0x25, 0x64, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, - 0x3d, 0x20, 0x28, 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, - 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, - 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x5f, 0x25, - 0x30, 0x32, 0x78, 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x62, - 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x22, - 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x5b, - 0x5e, 0x25, 0x77, 0x5f, 0x5d, 0x22, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, + 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x5b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5d, 0x20, - 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, - 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x20, 0x3d, 0x20, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x6c, - 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x28, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, - 0x61, 0x77, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x65, 0x77, - 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, - 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x72, 0x65, - 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x5b, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x75, - 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x22, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x28, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, - 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x32, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, - 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, - 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, - 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x20, 0x3d, - 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x28, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x20, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x29, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x28, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x75, + 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x5d, + 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x64, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5f, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x5f, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x20, + 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x72, 0x61, 0x77, 0x2c, 0x20, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x5f, + 0x22, 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5f, 0x5d, 0x22, + 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, + 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x73, + 0x74, 0x72, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, + 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x72, 0x61, 0x77, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, + 0x20, 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, + 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, + 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, - 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x28, 0x28, 0x62, 0x61, 0x73, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x5f, 0x30, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, - 0x69, 0x6c, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5f, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x61, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, - 0x6d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, - 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x28, 0x28, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, - 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, - 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x3a, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x62, 0x61, - 0x73, 0x65, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, 0x20, - 0x2d, 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x61, 0x75, 0x74, - 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x62, 0x61, 0x73, - 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x61, 0x75, 0x74, 0x6f, - 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x62, 0x61, 0x73, 0x65, - 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x69, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, - 0x64, 0x65, 0x72, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x26, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, - 0x64, 0x20, 0x28, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, - 0x29, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x28, 0x22, 0x2d, 0x2d, - 0x20, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x26, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, 0x61, - 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, - 0x5d, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x25, 0x73, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, - 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x29, - 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, - 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x71, 0x75, 0x6f, - 0x74, 0x65, 0x64, 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x29, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x2c, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, + 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x69, 0x5d, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x22, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x22, 0x67, 0x65, + 0x6e, 0x73, 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, + 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x5b, 0x22, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6d, - 0x65, 0x74, 0x61, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x6e, 0x61, 0x6d, - 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x66, 0x6e, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x24, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, + 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x75, 0x66, 0x66, 0x69, + 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x28, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, - 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x24, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x24, - 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, - 0x28, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x68, 0x61, - 0x73, 0x68, 0x66, 0x6e, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x28, 0x28, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x3a, 0x22, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, + 0x20, 0x2d, 0x20, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x61, 0x75, 0x74, + 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, + 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x62, 0x61, 0x73, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x62, 0x61, 0x73, 0x65, 0x5d, 0x20, 0x6f, + 0x72, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, + 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6f, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, + 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x66, + 0x69, 0x6e, 0x64, 0x28, 0x22, 0x26, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, + 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x3a, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x28, 0x28, 0x22, 0x2d, 0x2d, 0x20, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x26, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x66, 0x75, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x29, 0x2c, + 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, + 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x29, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, + 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x2c, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x72, + 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, + 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, + 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, + 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, + 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, + 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x24, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x24, 0x31, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, + 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x24, 0x31, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, - 0x30, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, - 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x73, - 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, - 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x31, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, - 0x74, 0x61, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, - 0x74, 0x61, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, - 0x5b, 0x22, 0x75, 0x73, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, - 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, - 0x20, 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x72, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, + 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, + 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x68, 0x61, 0x73, 0x68, 0x66, + 0x6e, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, + 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x30, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x23, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x5b, 0x22, 0x75, + 0x73, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x69, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, + 0x61, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, + 0x20, 0x28, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x20, 0x3d, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, - 0x64, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, - 0x72, 0x28, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x65, 0x74, 0x79, 0x70, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x6f, 0x75, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, - 0x20, 0x6f, 0x75, 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3e, 0x3d, 0x20, 0x33, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x32, - 0x29, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x64, 0x6f, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, 0x2e, 0x6c, 0x65, 0x61, - 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x5b, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5d, 0x2e, 0x6c, 0x65, 0x61, - 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x64, 0x20, 0x3d, 0x20, - 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, - 0x20, 0x31, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x20, 0x2d, 0x20, 0x33, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, - 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x69, 0x5d, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6b, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6b, 0x69, 0x64, 0x5b, - 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x74, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6d, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x22, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, + 0x64, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x2c, 0x20, 0x65, 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x75, + 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6f, + 0x75, 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, - 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, - 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, - 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, - 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, - 0x28, 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x30, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x23, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3e, - 0x20, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, - 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, - 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, - 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6d, - 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x28, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, - 0x74, 0x74, 0x65, 0x6e, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, - 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x31, - 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, + 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x32, 0x29, 0x5d, + 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x6f, + 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x23, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x65, + 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, + 0x20, 0x33, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x6b, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6b, 0x69, 0x64, 0x5b, 0x69, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, + 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x28, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x75, 0x74, 0x5b, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x5d, 0x20, + 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, + 0x65, 0x61, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, + 0x65, 0x61, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x23, 0x73, 0x75, 0x62, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x28, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x30, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x31, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, @@ -6614,1448 +7873,1592 @@ unsigned char loadfennel_lua[] = { 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, - 0x29, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x6d, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, - 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x5f, 0x73, 0x72, 0x63, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, - 0x20, 0x72, 0x65, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x2c, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x6d, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, + 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, + 0x72, 0x63, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, + 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x40, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, + 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, + 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x6d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, + 0x74, 0x67, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, 0x6b, + 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, + 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, + 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x76, 0x5f, 0x6c, 0x65, 0x6e, + 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, - 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, - 0x61, 0x70, 0x5b, 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, - 0x20, 0x73, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x6d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x28, + 0x29, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x6b, 0x2f, 0x76, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, + 0x67, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, + 0x74, 0x67, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, 0x65, 0x6e, 0x2c, + 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, + 0x6b, 0x76, 0x73, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x6b, 0x76, + 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, + 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x7b, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x2c, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, + 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, + 0x7d, 0x2c, 0x20, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x6b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x73, 0x65, 0x6c, - 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, - 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, - 0x5d, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, - 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6b, - 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, - 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, - 0x67, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, - 0x74, 0x5d, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x32, 0x5f, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x67, - 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, - 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, - 0x22, 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x76, 0x5f, - 0x6c, 0x65, 0x6e, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x7e, 0x3d, 0x20, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, + 0x31, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x65, + 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, + 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, 0x23, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x73, 0x65, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, + 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x64, + 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, + 0x25, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, 0x29, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, + 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x65, 0x74, 0x61, - 0x6c, 0x6c, 0x28, 0x29, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x2f, 0x76, 0x20, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, - 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, - 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, - 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, - 0x74, 0x5d, 0x5b, 0x6b, 0x76, 0x73, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, - 0x20, 0x6b, 0x76, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, - 0x5f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, - 0x5f, 0x32, 0x5f, 0x7d, 0x2c, 0x20, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x31, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x2c, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, - 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x6a, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, - 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, - 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x73, - 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x7e, - 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x64, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x20, 0x3d, 0x20, 0x25, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, - 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x28, 0x28, 0x28, - 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x34, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x22, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x63, - 0x6f, 0x64, 0x65, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, - 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x6e, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3e, - 0x20, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, - 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, + 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x22, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, + 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x64, 0x69, + 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x28, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x6e, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x69, 0x20, 0x3d, 0x20, 0x28, 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, - 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, - 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, - 0x61, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x31, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, + 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x31, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, - 0x22, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x5b, 0x22, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, + 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x6e, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, + 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, + 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, + 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, + 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, + 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x25, 0x73, 0x22, + 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, - 0x3d, 0x20, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x74, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x69, 0x5d, 0x5d, 0x29, 0x2c, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x5b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, - 0x66, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, - 0x3d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x2c, 0x20, - 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, - 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, - 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x63, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, + 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x5f, + 0x32, 0x5f, 0x28, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, + 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, + 0x5f, 0x30, 0x5b, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, + 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x74, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x5d, 0x29, 0x2c, + 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, + 0x32, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x31, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x32, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, + 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2c, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, + 0x5d, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, + 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x5f, 0x32, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, + 0x32, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, + 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, - 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x28, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, - 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x28, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x6f, 0x6c, + 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, + 0x32, 0x61, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x64, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, + 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x65, + 0x78, 0x70, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, + 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x7b, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x32, 0x2e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, + 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, + 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, - 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x65, 0x78, 0x70, 0x72, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x20, - 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, + 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, + 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, + 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x2c, 0x20, + 0x28, 0x22, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, + 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, + 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x2c, + 0x20, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, + 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, + 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, + 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x73, 0x75, 0x62, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x72, 0x67, + 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, + 0x6a, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x73, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x32, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x72, 0x3f, 0x22, 0x5d, - 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, - 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x2e, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x32, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x6c, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, + 0x20, 0x3d, 0x20, 0x22, 0x28, 0x25, 0x73, 0x29, 0x28, 0x25, 0x73, 0x29, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x22, + 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x70, + 0x61, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x2c, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x63, 0x61, 0x6c, + 0x6c, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, - 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, - 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, - 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6c, - 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x22, - 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, - 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, - 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, - 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, - 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x28, - 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x20, - 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, - 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, - 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, - 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x73, 0x75, 0x62, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x2c, - 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x65, - 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x73, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x32, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, - 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, - 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x66, 0x61, 0x72, - 0x67, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, - 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, - 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x63, 0x61, 0x6c, 0x6c, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, - 0x31, 0x2c, 0x20, 0x28, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x29, 0x7d, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x23, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3a, 0x22, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x32, 0x2c, 0x20, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, - 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, - 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, - 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, - 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x72, 0x67, 0x22, - 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x61, 0x73, + 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, + 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6c, + 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, + 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, + 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, + 0x28, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x7d, + 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, + 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, + 0x77, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3a, 0x22, 0x2c, 0x20, 0x6e, 0x69, + 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, + 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x32, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, - 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, - 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, - 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, - 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, - 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, - 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, - 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, - 0x65, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x28, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, - 0x22, 0x2c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, - 0x6c, 0x61, 0x72, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x22, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, + 0x61, 0x72, 0x67, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, + 0x20, 0x22, 0x76, 0x61, 0x72, 0x67, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, + 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, + 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, + 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, + 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x65, 0x7d, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, + 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, - 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, + 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x61, 0x73, + 0x74, 0x29, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, + 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x61, 0x73, + 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x76, + 0x61, 0x6c, 0x7d, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, + 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, + 0x20, 0x6b, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, 0x3c, 0x20, + 0x31, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, 0x3e, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x6b, + 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, - 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x6c, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, - 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x76, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, - 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, + 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x7d, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x74, 0x68, - 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6b, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, - 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6b, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x6b, 0x20, 0x3c, 0x20, 0x31, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, - 0x6b, 0x20, 0x3e, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, - 0x28, 0x6b, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x30, + 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x73, 0x74, + 0x72, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x64, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x6b, 0x73, 0x74, + 0x72, 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x31, 0x5f, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x7b, 0x6b, 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6b, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5b, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x29, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x7b, 0x6b, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x72, 0x6e, 0x20, 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3c, 0x20, 0x62, + 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, + 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6b, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, + 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x6b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, - 0x76, 0x6d, 0x61, 0x70, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x61, 0x2c, 0x20, - 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x5b, 0x31, - 0x5d, 0x20, 0x3c, 0x20, 0x62, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x73, 0x6f, 0x72, 0x74, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x5f, - 0x31, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x6b, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x6b, 0x5b, 0x32, 0x5d, 0x5d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, - 0x6b, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6b, - 0x65, 0x79, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x22, 0x7b, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x7d, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x74, 0x30, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, - 0x64, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, - 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, - 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, + 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, + 0x22, 0x2c, 0x20, 0x6b, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6b, 0x65, + 0x79, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x22, 0x7b, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, + 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x7d, + 0x22, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x74, 0x30, 0x20, 0x3d, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, - 0x6d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, - 0x73, 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, + 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, 0x30, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, - 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, - 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, - 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, - 0x65, 0x61, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, + 0x74, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, + 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, - 0x28, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, - 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x28, 0x74, 0x6f, 0x2c, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, - 0x73, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, - 0x69, 0x73, 0x76, 0x61, 0x72, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x6e, 0x6f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x66, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x6e, 0x6f, 0x75, 0x6e, - 0x64, 0x65, 0x66, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, 0x20, - 0x3d, 0x20, 0x28, 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x73, - 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x64, - 0x73, 0x74, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x75, 0x70, - 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, - 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x72, 0x61, 0x77, 0x29, 0x29, 0x2c, 0x20, - 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, 0x2c, - 0x20, 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, - 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x28, 0x72, 0x61, 0x77, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x72, - 0x61, 0x77, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, - 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, - 0x65, 0x74, 0x61, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x3d, - 0x20, 0x31, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x63, 0x6f, 0x6e, - 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, - 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, - 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x76, - 0x61, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x72, 0x61, 0x77, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x30, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, + 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, 0x61, + 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6f, 0x72, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x66, - 0x29, 0x2c, 0x20, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, - 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, - 0x77, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, - 0x69, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, 0x20, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x5b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x77, 0x29, 0x5d, 0x20, 0x3d, - 0x20, 0x72, 0x61, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x72, 0x61, 0x77, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, + 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, + 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x28, 0x74, 0x6f, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, + 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, + 0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, + 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x69, + 0x73, 0x76, 0x61, 0x72, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x64, 0x73, 0x74, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x75, + 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x73, 0x30, 0x2e, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, + 0x72, 0x61, 0x77, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, + 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x72, 0x61, 0x77, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x72, 0x61, 0x77, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x29, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x25, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x6d, 0x65, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x76, 0x61, 0x72, 0x29, 0x2c, 0x20, + 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, + 0x61, 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, + 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, + 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x6e, 0x6f, 0x75, 0x6e, 0x64, 0x65, + 0x66, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, + 0x61, 0x77, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x6c, 0x69, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, + 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x77, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x5b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x77, 0x29, 0x5d, 0x20, + 0x3d, 0x20, 0x72, 0x61, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x72, 0x61, + 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x32, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x5b, 0x5f, 0x32, 0x34, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x5b, 0x5f, 0x32, 0x34, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, - 0x69, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x2c, - 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x65, 0x6e, - 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x23, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x69, 0x20, 0x3d, - 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x5b, 0x70, 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x70, 0x6c, - 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6c, - 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x28, 0x70, - 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x65, + 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x23, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x69, 0x20, + 0x3d, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5b, 0x70, 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x70, + 0x6c, 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, + 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x28, + 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x5b, 0x22, 0x6c, 0x65, 0x61, + 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, + 0x65, 0x61, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x69, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x5b, 0x22, 0x6c, 0x65, 0x61, 0x66, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, 0x65, - 0x61, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, - 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, - 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6c, 0x65, - 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x28, 0x7b, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, - 0x74, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6c, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, - 0x28, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, - 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, - 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x69, - 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x75, 0x65, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x3d, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, - 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, - 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x66, 0x72, - 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, + 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6c, 0x65, + 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x7b, 0x6c, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, + 0x65, 0x74, 0x74, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x31, 0x28, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x29, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, 0x5f, - 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x30, 0x20, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x6c, 0x65, 0x66, + 0x74, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x3d, + 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x65, + 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, + 0x79, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, - 0x73, 0x22, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x28, 0x22, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x5b, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x3a, - 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x26, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x76, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x26, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x73, - 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x7b, 0x28, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x28, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x29, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, - 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x28, 0x6b, - 0x20, 0x2b, 0x20, 0x32, 0x29, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, - 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, 0x6c, 0x65, - 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x28, 0x6b, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x2c, 0x20, 0x7b, 0x73, 0x75, 0x62, - 0x65, 0x78, 0x70, 0x72, 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, - 0x73, 0x79, 0x6d, 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, 0x7d, 0x2c, 0x20, 0x6c, 0x65, - 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, - 0x72, 0x65, 0x66, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x26, - 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, - 0x6b, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6c, 0x65, - 0x66, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, - 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x26, 0x61, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, - 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x7b, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, 0x7d, 0x2c, - 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x31, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x6e, + 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x30, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x3d, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, + 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, + 0x76, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x28, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x5b, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, + 0x29, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x26, 0x22, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x76, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x26, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x7b, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x28, 0x25, 0x73, + 0x2c, 0x20, 0x25, 0x73, 0x29, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, - 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x29, 0x0a, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, + 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, + 0x28, 0x6b, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x5d, 0x29, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, + 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, + 0x28, 0x6b, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x2c, 0x20, 0x7b, 0x73, + 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6b, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, 0x7d, 0x2c, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x6b, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, + 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x26, 0x61, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x22, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, + 0x6d, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, + 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, + 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, - 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x22, 0x2c, 0x20, 0x73, 0x2c, - 0x20, 0x6b, 0x65, 0x79, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x76, 0x2c, - 0x20, 0x7b, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x7d, 0x2c, 0x20, - 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, + 0x20, 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x22, 0x2c, 0x20, + 0x73, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, + 0x76, 0x2c, 0x20, 0x7b, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x7d, + 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, + 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, + 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, + 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x65, - 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x67, 0x65, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, - 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x65, 0x66, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x69, 0x5d, - 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x79, 0x6d, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x74, 0x6f, 0x70, - 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, - 0x6e, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x6c, 0x65, 0x66, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x79, 0x6d, - 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x29, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x69, - 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x20, 0x69, 0x6e, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x31, 0x28, 0x70, 0x61, 0x69, 0x72, 0x5b, 0x31, 0x5d, 0x2c, 0x20, - 0x7b, 0x70, 0x61, 0x69, 0x72, 0x5b, 0x32, 0x5d, 0x7d, 0x2c, 0x20, 0x6c, - 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, - 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, - 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, - 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, - 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, - 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, - 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, + 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, + 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, + 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, + 0x22, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x74, + 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x27, + 0x74, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x6c, + 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, + 0x79, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, + 0x5b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, + 0x28, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x70, 0x61, + 0x69, 0x72, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x7b, 0x70, 0x61, 0x69, 0x72, + 0x5b, 0x32, 0x5d, 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, - 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, - 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x75, - 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x75, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x29, - 0x2c, 0x20, 0x28, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x75, 0x70, - 0x31, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x70, - 0x31, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x31, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x6f, - 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x74, 0x6f, 0x2c, 0x20, 0x6e, 0x69, - 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x2c, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, - 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, - 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x22, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, + 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, + 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, + 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, + 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, + 0x66, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, + 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, + 0x73, 0x22, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, 0x65, 0x66, + 0x74, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x75, 0x70, 0x31, 0x5b, 0x32, 0x5d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x70, 0x31, 0x5b, 0x32, 0x5d, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x73, 0x74, 0x72, 0x6d, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, - 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, + 0x28, 0x74, 0x6f, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, + 0x22, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x22, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x74, 0x6f, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x73, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, + 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x25, 0x73, + 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, + 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x28, 0x73, 0x74, 0x72, 0x6d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, + 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, + 0x5d, 0x28, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x6d, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x28, 0x69, 0x20, 0x3c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, + 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x28, + 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x28, 0x5f, 0x30, 0x5f, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, - 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x30, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, + 0x5f, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, + 0x22, 0x5d, 0x28, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x73, 0x30, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, + 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x20, + 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, @@ -8069,403 +9472,313 @@ unsigned char loadfennel_lua[] = { 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x76, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, - 0x6d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x76, 0x61, - 0x6c, 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, - 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x76, 0x61, - 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x3c, 0x20, - 0x23, 0x76, 0x61, 0x6c, 0x73, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, - 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, - 0x23, 0x76, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, - 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, - 0x69, 0x6c, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, - 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, - 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x28, 0x5f, 0x30, 0x5f, 0x29, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, + 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, + 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x30, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x28, 0x69, 0x6e, + 0x66, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x43, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, 0x20, 0x5b, 0x43, 0x5d, + 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x66, + 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, + 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x43, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x20, 0x5b, + 0x43, 0x5d, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x3f, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, + 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, + 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x70, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, + 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, + 0x69, 0x6e, 0x65, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, + 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x30, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, - 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x43, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, + 0x70, 0x5b, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x65, + 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x31, 0x5d, + 0x29, 0x5d, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, + 0x72, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x2e, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x28, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, + 0x5b, 0x32, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x4c, 0x75, 0x61, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x22, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x66, 0x6f, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x3f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, - 0x20, 0x20, 0x5b, 0x43, 0x5d, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x22, - 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x43, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x22, 0x20, 0x20, 0x5b, 0x43, 0x5d, 0x3a, 0x20, 0x69, 0x6e, 0x20, - 0x3f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x72, 0x65, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, - 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x72, 0x65, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, - 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, - 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, - 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, + 0x20, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, 0x20, 0x69, 0x6e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x22, + 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x5f, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x20, - 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x28, 0x22, 0x40, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, - 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, - 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x2e, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x5f, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, - 0x6d, 0x61, 0x70, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, - 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, - 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, - 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x32, 0x5d, 0x20, 0x6f, 0x72, 0x20, - 0x2d, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x4c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x27, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x27, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x3f, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x29, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, - 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, - 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, - 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x5f, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x28, 0x74, 0x61, - 0x69, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x20, 0x28, 0x74, - 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x22, 0x20, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, - 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, - 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x20, 0x3d, 0x20, 0x28, - 0x6d, 0x73, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6d, 0x73, 0x67, 0x30, - 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x43, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, - 0x28, 0x22, 0x5e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x2d, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x28, 0x22, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6d, 0x73, 0x67, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x20, 0x22, 0x20, 0x20, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, + 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x6d, + 0x61, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x2c, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, + 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, + 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x73, 0x67, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x28, 0x6d, 0x73, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, + 0x5e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x73, 0x67, 0x30, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2d, 0x6f, 0x6e, 0x3f, 0x22, + 0x5d, 0x28, 0x22, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, - 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x3a, - 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x50, 0x61, 0x72, 0x73, 0x65, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, + 0x6d, 0x73, 0x67, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x6d, 0x73, + 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x22, 0x5e, 0x5b, 0x5e, 0x3a, 0x5d, 0x2a, 0x3a, 0x25, 0x64, + 0x2b, 0x3a, 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, - 0x73, 0x67, 0x30, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x5b, - 0x5e, 0x3a, 0x5d, 0x2a, 0x3a, 0x25, 0x64, 0x2b, 0x3a, 0x25, 0x73, 0x2b, - 0x22, 0x2c, 0x20, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, - 0x63, 0x6b, 0x3a, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, - 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x2e, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x22, 0x53, 0x6c, 0x6e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, - 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, - 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, - 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6d, 0x73, + 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x69, 0x6e, + 0x66, 0x6f, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x22, 0x53, + 0x6c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x20, + 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, + 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x28, 0x69, 0x6e, + 0x66, 0x6f, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x66, + 0x6b, 0x2c, 0x20, 0x66, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x66, 0x6b, 0x2c, 0x20, 0x66, 0x76, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, - 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x2c, - 0x20, 0x66, 0x76, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6b, 0x28, - 0x6b, 0x29, 0x2c, 0x20, 0x66, 0x76, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x28, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x74, 0x2c, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x72, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, - 0x73, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x0a, 0x20, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6b, 0x2c, 0x20, 0x66, 0x76, 0x28, 0x76, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x6b, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x66, 0x76, 0x28, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x74, 0x2c, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x20, + 0x3d, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, 0x65, + 0x6e, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, + 0x2e, 0x20, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, + 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, - 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, - 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x6a, 0x6f, - 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, - 0x76, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6b, - 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, - 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5b, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6b, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3d, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, - 0x74, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x78, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, 0x78, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, - 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x71, - 0x75, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, - 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, - 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, - 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x6f, - 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, - 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, - 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x23, 0x24, 0x22, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, - 0x64, 0x28, 0x22, 0x23, 0x5b, 0x3a, 0x2e, 0x5d, 0x22, 0x29, 0x29, 0x20, + 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6b, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, - 0x79, 0x6d, 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, - 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, - 0x29, 0x22, 0x2c, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x28, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x79, 0x6d, 0x28, - 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x7b, + 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, + 0x2e, 0x2e, 0x20, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5b, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x6b, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x3d, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3d, + 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x79, 0x6d, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, + 0x66, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x20, + 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x22, 0x23, 0x24, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x22, 0x23, 0x5b, 0x3a, 0x2e, 0x5d, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x79, 0x6d, + 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x61, 0x75, 0x74, + 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x79, 0x6d, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, + 0x6f, 0x72, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x22, 0x73, 0x79, 0x6d, 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x7b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, @@ -8496,515 +9809,555 @@ unsigned char loadfennel_lua[] = { 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, - 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6e, - 0x6f, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, - 0x25, 0x71, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x73, 0x74, - 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, - 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, 0x22, - 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, - 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x7d, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, + 0x6d, 0x61, 0x70, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x28, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, + 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, + 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, + 0x25, 0x73, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x7d, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, + 0x29, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, + 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, + 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, + 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x71, 0x2c, 0x20, + 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, 0x29, 0x29, 0x22, 0x29, - 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x66, - 0x6f, 0x72, 0x6d, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x2c, - 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, - 0x20, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x66, - 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, - 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, - 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x71, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, - 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x66, 0x6f, - 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, - 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, + 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x7b, 0x25, 0x73, 0x7d, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x6d, 0x69, 0x78, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, + 0x31, 0x5f, 0x2c, 0x20, 0x22, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x28, 0x29, 0x29, 0x29, 0x5b, 0x27, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x27, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, + 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x71, 0x2c, 0x20, + 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, + 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x22, - 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x25, 0x73, 0x7d, - 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, - 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x2c, - 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3d, 0x25, 0x73, + 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x25, 0x73, + 0x7d, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, - 0x22, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, - 0x29, 0x29, 0x29, 0x5b, 0x27, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x27, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, - 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, - 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, - 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x71, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, - 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x66, 0x6f, - 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, - 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, 0x6c, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x25, 0x73, 0x7d, 0x2c, 0x20, 0x7b, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, - 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, - 0x20, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, 0x72, - 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, - 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x2d, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, 0x64, - 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, - 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x6f, - 0x2d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, - 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, - 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, 0x6b, 0x65, 0x65, - 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, - 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2c, 0x20, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, - 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x20, 0x3d, - 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2c, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x65, 0x6d, 0x69, 0x74, - 0x20, 0x3d, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, - 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, - 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, - 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, - 0x63, 0x6b, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, - 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x66, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x2e, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x28, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, - 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, 0x74, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, - 0x22, 0x24, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x24, 0x2e, 0x2e, 0x2e, 0x20, - 0x69, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, - 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x24, 0x2e, 0x2e, 0x2e, - 0x20, 0x6f, 0x72, 0x20, 0x24, 0x2c, 0x20, 0x24, 0x31, 0x2c, 0x20, 0x24, - 0x32, 0x2c, 0x20, 0x24, 0x33, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, - 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x61, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x2c, - 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, - 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, 0x20, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, 0x69, - 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x2c, 0x20, - 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x61, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x20, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, 0x65, - 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x72, 0x65, - 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x74, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x79, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x5b, + 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, + 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x20, + 0x5b, 0x22, 0x64, 0x6f, 0x2d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2c, + 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, + 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, + 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5b, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, + 0x6f, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, + 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, + 0x65, 0x6d, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x2c, + 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x6e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x2c, 0x20, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x29, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x66, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, + 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x24, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x24, + 0x2e, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, + 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, + 0x68, 0x66, 0x6e, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x24, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x72, 0x20, 0x24, 0x2c, 0x20, 0x24, + 0x31, 0x2c, 0x20, 0x24, 0x32, 0x2c, 0x20, 0x24, 0x33, 0x2c, 0x20, 0x65, + 0x74, 0x63, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x61, 0x6e, 0x27, + 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x79, 0x6d, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x64, 0x69, 0x67, 0x69, + 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, + 0x69, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, + 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x6c, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, + 0x73, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x79, 0x6f, + 0x75, 0x27, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, - 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, - 0x22, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, - 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, - 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, 0x61, 0x6e, - 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x2a, 0x20, 0x74, 0x6f, 0x20, 0x63, - 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x68, - 0x65, 0x73, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x69, 0x6e, - 0x67, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x62, 0x72, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6d, 0x70, - 0x74, 0x79, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x6c, 0x61, 0x63, 0x69, - 0x6e, 0x67, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x68, - 0x65, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, - 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, - 0x62, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, - 0x75, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, - 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x2c, 0x20, 0x22, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, + 0x67, 0x69, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x72, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, + 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, + 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x2a, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x68, 0x65, 0x73, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x22, + 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, + 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x69, 0x66, + 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x6e, + 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x22, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x22, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x66, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x20, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, - 0x73, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, - 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, - 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6b, 0x65, 0x79, 0x22, - 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, + 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6b, 0x65, 0x79, + 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x22, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6f, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x69, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x5f, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6b, + 0x65, 0x79, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x2c, 0x20, + 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, + 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x74, 0x79, 0x70, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x6f, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, + 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, + 0x69, 0x6e, 0x67, 0x20, 0x26, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x28, + 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x74, 0x79, - 0x70, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, - 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x75, - 0x73, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, - 0x74, 0x73, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, - 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, - 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, - 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, - 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x7d, 0x2c, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x20, + 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, + 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x65, 0x74, + 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, - 0x20, 0x26, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, - 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x7d, + 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, + 0x22, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x28, 0x2e, 0x2a, 0x29, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, - 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, - 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x20, 0x28, 0x2e, 0x2a, - 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x75, 0x73, 0x69, - 0x6e, 0x67, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, - 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x65, 0x74, 0x2f, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, - 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, - 0x61, 0x72, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, - 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x7d, 0x2c, - 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x28, 0x2e, - 0x2a, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, + 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, + 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6c, 0x6c, 0x65, + 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x72, 0x3a, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, + 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x25, + 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6c, 0x69, + 0x6b, 0x65, 0x20, 0x5c, 0x22, 0x2c, 0x20, 0x5c, 0x5c, 0x2c, 0x20, 0x27, + 0x2c, 0x20, 0x7e, 0x2c, 0x20, 0x3b, 0x2c, 0x20, 0x40, 0x2c, 0x20, 0x60, + 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x22, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, + 0x2e, 0x2a, 0x29, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, - 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x3a, 0x20, - 0x28, 0x2e, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x22, 0x2c, - 0x20, 0x22, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, - 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, - 0x5c, 0x22, 0x2c, 0x20, 0x5c, 0x5c, 0x2c, 0x20, 0x27, 0x2c, 0x20, 0x7e, - 0x2c, 0x20, 0x3b, 0x2c, 0x20, 0x40, 0x2c, 0x20, 0x60, 0x2c, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, - 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x68, 0x61, - 0x64, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, - 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x27, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, - 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, - 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x2a, - 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x25, - 0x73, 0x23, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x69, - 0x64, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x7d, 0x2c, - 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x69, 0x73, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x63, - 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, - 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, - 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, - 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x22, 0x2c, - 0x20, 0x22, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x71, 0x75, 0x61, - 0x72, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, - 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, 0x73, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x69, - 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, - 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2c, - 0x20, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x73, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, - 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, 0x61, 0x6c, - 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, - 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x63, - 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, 0x2c, 0x20, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, - 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x25, - 0x73, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, - 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x73, 0x79, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, - 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, - 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, - 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, - 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x73, - 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x70, - 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x73, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x28, 0x2e, - 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x25, - 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x72, + 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, + 0x28, 0x2e, 0x2a, 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, + 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x25, 0x73, 0x23, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, + 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x69, + 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, + 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x5b, + 0x22, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, + 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x69, 0x66, + 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x73, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, + 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x61, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, + 0x67, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, + 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x7d, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, 0x2c, + 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x28, 0x2e, + 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, + 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65, 0x61, 0x72, + 0x6c, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x27, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x2c, + 0x20, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x72, + 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x20, 0x61, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x20, 0x73, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x25, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, + 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, + 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, @@ -9014,158 +10367,170 @@ unsigned char loadfennel_lua[] = { 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, - 0x6e, 0x67, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, - 0x61, 0x72, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x75, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, - 0x22, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6e, 0x20, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, - 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, - 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, - 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x73, - 0x65, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x27, - 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x22, 0x2c, 0x20, 0x22, - 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x47, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, - 0x61, 0x64, 0x2c, 0x20, 0x65, 0x67, 0x2e, 0x20, 0x5f, 0x47, 0x2e, 0x25, - 0x73, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x72, 0x65, 0x61, - 0x6c, 0x6c, 0x79, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x76, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x25, 0x73, 0x20, 0x69, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x2c, - 0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, - 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x75, 0x73, 0x65, - 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x66, 0x69, 0x78, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x20, 0x73, 0x6f, 0x20, - 0x25, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x22, 0x2c, - 0x20, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, - 0x5f, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x73, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x28, - 0x2e, 0x2a, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, - 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, - 0x73, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x5f, 0x47, 0x2e, 0x25, 0x73, - 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x7d, 0x7d, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, - 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x28, 0x6d, 0x73, - 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x70, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x67, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, + 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, 0x20, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x7d, 0x2c, + 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x28, 0x2e, + 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, 0x6f, 0x6f, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x27, 0x73, 0x20, 0x61, + 0x20, 0x74, 0x79, 0x70, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x47, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2c, + 0x20, 0x65, 0x67, 0x2e, 0x20, 0x5f, 0x47, 0x2e, 0x25, 0x73, 0x20, 0x69, + 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x25, 0x73, 0x20, 0x69, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x61, 0x73, + 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x66, 0x69, 0x78, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x20, 0x74, 0x79, 0x70, 0x6f, 0x20, 0x73, 0x6f, 0x20, 0x25, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x5f, 0x25, 0x73, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, 0x2c, + 0x20, 0x22, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x5f, 0x47, 0x2e, 0x25, 0x73, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, + 0x61, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6d, 0x73, 0x67, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x29, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x30, 0x20, + 0x3c, 0x20, 0x23, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x75, 0x67, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6d, - 0x73, 0x67, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, - 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x30, 0x20, 0x3c, 0x20, 0x23, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x73, 0x75, 0x67, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x75, 0x67, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x73, 0x3a, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, - 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x3d, 0x20, 0x73, 0x75, 0x67, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, - 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, - 0x20, 0x31, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x23, 0x66, - 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x28, 0x2e, - 0x2d, 0x29, 0x28, 0x5c, 0x31, 0x33, 0x3f, 0x5c, 0x6e, 0x29, 0x22, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x3d, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x20, 0x2b, 0x20, 0x23, 0x6e, 0x65, 0x77, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x2b, 0x20, 0x23, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, - 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x2c, 0x20, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x73, 0x75, 0x67, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x73, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, + 0x73, 0x75, 0x67, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, + 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x23, 0x66, 0x3a, 0x72, 0x65, + 0x61, 0x64, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x20, 0x5f, 0x33, 0x66, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, + 0x5f, 0x33, 0x66, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, + 0x30, 0x29, 0x20, 0x2b, 0x20, 0x23, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x23, 0x6e, 0x65, 0x77, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x2c, 0x20, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, @@ -9173,634 +10538,796 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x2c, + 0x20, 0x22, 0x28, 0x2e, 0x2d, 0x29, 0x28, 0x5c, 0x31, 0x33, 0x3f, 0x5c, + 0x6e, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, + 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x62, + 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, + 0x5b, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x22, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, 0x22, 0x2c, 0x20, 0x28, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2d, 0x20, 0x62, + 0x6f, 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x5e, 0x22, 0x2c, 0x20, 0x6d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x28, 0x62, 0x79, 0x74, + 0x65, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x62, 0x6f, 0x6c, + 0x20, 0x2b, 0x20, 0x23, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x29, 0x20, 0x2d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, + 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, + 0x65, 0x70, 0x28, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2d, 0x20, 0x62, 0x6f, 0x6c, + 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5e, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, + 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x22, + 0x2a, 0x20, 0x54, 0x72, 0x79, 0x20, 0x25, 0x73, 0x2e, 0x22, 0x29, 0x3a, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x5f, 0x6d, 0x73, 0x67, - 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, - 0x64, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, - 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, - 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x3d, - 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x28, 0x6d, 0x73, 0x67, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x6d, 0x73, 0x67, 0x2c, 0x20, - 0x22, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x63, 0x6f, - 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, - 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, - 0x22, 0x20, 0x22, 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x20, 0x2d, 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x2d, 0x20, - 0x31, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5e, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, - 0x28, 0x22, 0x5e, 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, - 0x69, 0x6e, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, - 0x2d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, - 0x2c, 0x20, 0x28, 0x28, 0x62, 0x6f, 0x6c, 0x20, 0x2b, 0x20, 0x23, 0x63, - 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x2d, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x29, 0x29, 0x29, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x6c, 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x28, 0x22, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, + 0x6e, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, 0x25, + 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, + 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, + 0x29, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, + 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x65, 0x6e, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x2d, - 0x22, 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x20, 0x2d, 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, - 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5e, 0x22, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x2a, 0x20, 0x54, 0x72, 0x79, - 0x20, 0x25, 0x73, 0x2e, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x75, 0x74, - 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x73, 0x67, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x61, - 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x5f, 0x6d, 0x73, - 0x67, 0x28, 0x28, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x5f, + 0x6d, 0x73, 0x67, 0x28, 0x28, 0x22, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x6d, 0x73, - 0x67, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x28, - 0x22, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, - 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x7b, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2c, 0x20, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x0a, 0x65, 0x6e, - 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x6f, 0x72, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, - 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6d, 0x73, + 0x67, 0x29, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x7d, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, + 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x2e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, - 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, - 0x28, 0x67, 0x65, 0x74, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x2c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, - 0x33, 0x66, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x65, - 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x63, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x63, - 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x61, 0x72, 0x20, 0x7e, - 0x3d, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x34, - 0x5f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x61, 0x72, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, - 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x5f, - 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x30, 0x20, - 0x3d, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, - 0x5e, 0x23, 0x21, 0x22, 0x2c, 0x20, 0x22, 0x3b, 0x3b, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x72, 0x30, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x69, + 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x66, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x72, 0x61, 0x6e, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x67, 0x65, 0x74, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, + 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x22, 0x22, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x23, + 0x63, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x20, 0x3d, 0x20, 0x63, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x31, - 0x32, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x5b, - 0x31, 0x32, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, - 0x20, 0x5b, 0x34, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x34, 0x31, 0x2c, 0x20, - 0x5b, 0x34, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, - 0x20, 0x5b, 0x39, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x39, 0x33, 0x2c, 0x20, - 0x5b, 0x39, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x31, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, 0x20, + 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x5f, + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, + 0x68, 0x61, 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x32, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x3a, 0x62, 0x79, + 0x74, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x73, 0x74, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x74, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x23, 0x21, 0x22, 0x2c, 0x20, 0x22, + 0x3b, 0x3b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x30, 0x3a, 0x62, + 0x79, 0x74, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x5b, 0x31, 0x32, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x31, + 0x32, 0x35, 0x2c, 0x20, 0x5b, 0x31, 0x32, 0x35, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x34, 0x30, 0x5d, 0x20, 0x3d, + 0x20, 0x34, 0x31, 0x2c, 0x20, 0x5b, 0x34, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x39, 0x31, 0x5d, 0x20, 0x3d, + 0x20, 0x39, 0x33, 0x2c, 0x20, 0x5b, 0x39, 0x33, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, + 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x32, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x62, 0x20, 0x3e, 0x3d, 0x20, + 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3d, + 0x20, 0x31, 0x33, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, - 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x32, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x28, 0x62, 0x20, 0x3e, 0x3d, 0x20, 0x39, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3d, 0x20, 0x31, 0x33, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x33, 0x66, - 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x62, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x62, 0x30, 0x20, 0x3e, 0x20, 0x33, - 0x32, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, - 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x30, 0x5d, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x31, 0x32, 0x37, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x30, 0x20, 0x3d, + 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x62, + 0x30, 0x20, 0x3e, 0x20, 0x33, 0x32, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, + 0x30, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, + 0x3d, 0x20, 0x31, 0x32, 0x37, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x39, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, + 0x31, 0x32, 0x36, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, + 0x20, 0x7e, 0x3d, 0x20, 0x35, 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x34, 0x34, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x36, 0x34, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, - 0x20, 0x33, 0x34, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, - 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x31, 0x32, 0x36, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x35, - 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, - 0x3d, 0x20, 0x34, 0x34, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, - 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x36, 0x34, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x39, 0x36, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x5b, 0x33, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x68, - 0x61, 0x73, 0x68, 0x66, 0x6e, 0x22, 0x2c, 0x20, 0x5b, 0x33, 0x39, 0x5d, - 0x20, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, - 0x5b, 0x34, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x75, 0x6e, 0x71, 0x75, - 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x5b, 0x39, 0x36, 0x5d, 0x20, 0x3d, - 0x20, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x67, 0x65, - 0x74, 0x62, 0x79, 0x74, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, - 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x75, 0x62, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x62, 0x20, 0x3d, - 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x75, - 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, - 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x2c, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x62, 0x79, 0x74, 0x65, 0x28, 0x7b, 0x5b, - 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x20, 0x3d, 0x3d, 0x20, - 0x31, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, - 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x0a, + 0x20, 0x39, 0x36, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x33, 0x35, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x22, 0x2c, + 0x20, 0x5b, 0x33, 0x39, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x22, 0x2c, 0x20, 0x5b, 0x34, 0x34, 0x5d, 0x20, 0x3d, 0x20, + 0x22, 0x75, 0x6e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x5b, + 0x39, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x72, 0x28, 0x67, 0x65, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x75, + 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x75, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, + 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x62, 0x20, 0x3d, 0x20, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x5b, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, - 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, - 0x64, 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x50, 0x61, 0x72, 0x73, - 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x25, - 0x73, 0x3a, 0x25, 0x73, 0x3a, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x28, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, - 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, - 0x29, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x28, - 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x62, 0x79, - 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x74, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x64, - 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x76, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5b, 0x23, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x76, 0x2c, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x29, + 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x2c, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x62, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x62, 0x79, + 0x74, 0x65, 0x28, 0x7b, 0x5b, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x23, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, + 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, + 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x5f, + 0x30, 0x5f, 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, + 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x3a, + 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x6d, + 0x73, 0x67, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x28, 0x6d, 0x73, 0x67, 0x2c, + 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, + 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5b, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, + 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x3d, 0x20, 0x76, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, + 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x29, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, + 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, - 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x2c, 0x20, 0x76, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x68, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2c, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, + 0x20, 0x22, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x72, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x5f, 0x30, 0x5f, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, + 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x76, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, - 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, + 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x62, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x31, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x62, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x5f, + 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, + 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x29, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x7d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x72, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, - 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, - 0x74, 0x62, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, - 0x74, 0x20, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x23, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, - 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x62, 0x2c, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x31, 0x30, 0x20, 0x7e, 0x3d, 0x20, - 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, - 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x67, 0x65, - 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, + 0x62, 0x5d, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x74, 0x62, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x62, + 0x6c, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, - 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x69, - 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x62, 0x65, 0x66, 0x6f, - 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, - 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, - 0x20, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, - 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x23, + 0x74, 0x62, 0x6c, 0x5d, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, + 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x74, + 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x23, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, + 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, + 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x62, - 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x76, 0x61, 0x6c, 0x29, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x6c, 0x79, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x23, 0x74, 0x62, 0x6c, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x7e, 0x3d, - 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x74, 0x62, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x20, 0x25, 0x20, 0x32, 0x29, + 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, + 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x32, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, + 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, + 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5b, + 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x62, + 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x65, + 0x79, 0x73, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, - 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, - 0x2c, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x3a, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x74, - 0x62, 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, - 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, - 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5b, 0x74, 0x62, 0x6c, - 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x28, - 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x2e, 0x6b, 0x65, 0x79, 0x73, + 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, @@ -9821,797 +11348,856 @@ unsigned char loadfennel_lua[] = { 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, - 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x7e, 0x3d, - 0x20, 0x62, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x6d, 0x69, 0x73, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, - 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, 0x6f, 0x70, 0x2e, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x72, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x62, 0x79, 0x74, 0x65, - 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x31, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, - 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x74, 0x6f, - 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, - 0x39, 0x33, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x74, 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x28, 0x22, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, + 0x62, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, + 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, + 0x2e, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, + 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, + 0x3d, 0x20, 0x34, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, 0x75, - 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x6f, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x39, 0x33, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, - 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, - 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, - 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, - 0x20, 0x62, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x39, 0x32, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x62, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x32, 0x5d, 0x20, - 0x3d, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x3d, 0x3d, 0x20, 0x39, 0x32, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x64, - 0x6f, 0x6e, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x64, - 0x6f, 0x6e, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, - 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, - 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x7b, 0x5b, 0x31, 0x30, - 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x5b, - 0x31, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, - 0x20, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, - 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, - 0x5c, 0x72, 0x22, 0x2c, 0x20, 0x5b, 0x37, 0x5d, 0x20, 0x3d, 0x20, 0x22, - 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x38, 0x5d, 0x20, 0x3d, 0x20, - 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, 0x5b, 0x39, 0x5d, 0x20, 0x3d, - 0x20, 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x7d, 0x29, 0x5b, 0x63, 0x3a, 0x62, - 0x79, 0x74, 0x65, 0x28, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x33, 0x34, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x33, - 0x34, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, - 0x29, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x62, + 0x61, 0x63, 0x6b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, + 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, + 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, + 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, + 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, + 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, + 0x7e, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, + 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x67, + 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x75, - 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, - 0x64, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x5b, 0x5c, 0x37, 0x2d, 0x5c, 0x31, 0x33, 0x5d, 0x22, 0x2c, - 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x6e, 0x20, - 0x3d, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, - 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x29, - 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x6e, 0x28, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x5b, - 0x62, 0x5d, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x62, - 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x77, 0x68, 0x69, - 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x6e, - 0x65, 0x78, 0x74, 0x62, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x62, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x35, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x61, - 0x66, 0x74, 0x65, 0x72, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x69, 0x6e, 0x67, - 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, - 0x23, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x67, 0x65, - 0x74, 0x62, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, - 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x33, 0x66, 0x28, - 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, - 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, - 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, - 0x62, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, + 0x5f, 0x63, 0x68, 0x61, 0x72, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x7b, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, + 0x6e, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, + 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x3d, + 0x20, 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x33, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x72, 0x22, 0x2c, 0x20, 0x5b, 0x37, + 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, + 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, + 0x5b, 0x39, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x7d, + 0x29, 0x5b, 0x63, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2c, 0x20, 0x7b, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x33, 0x34, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x33, 0x34, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, + 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, + 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, + 0x77, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, + 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5c, 0x37, 0x2d, 0x5c, + 0x31, 0x33, 0x5d, 0x22, 0x2c, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, + 0x5f, 0x63, 0x68, 0x61, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, + 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x29, 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, + 0x65, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x6e, 0x20, 0x3d, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x66, 0x6e, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x5b, 0x62, 0x5d, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x20, 0x3d, + 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x6e, 0x65, + 0x78, 0x74, 0x62, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x72, 0x75, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, + 0x6e, 0x65, 0x78, 0x74, 0x62, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x62, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x35, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x71, 0x75, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x23, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, + 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x72, 0x61, 0x77, - 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, - 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, - 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, - 0x5e, 0x5f, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, - 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5f, 0x22, - 0x2c, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, - 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x64, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x28, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x28, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, - 0x74, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x22, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, - 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, + 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, + 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, + 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, + 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, - 0x65, 0x64, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, - 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x7e, 0x22, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x7e, 0x3d, - 0x20, 0x22, 0x7e, 0x3d, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6c, 0x6c, 0x65, 0x67, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, - 0x3a, 0x20, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, - 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, - 0x2e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x63, 0x61, 0x6e, - 0x27, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x61, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x3a, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, - 0x28, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x2d, 0x20, 0x23, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, - 0x2b, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, - 0x64, 0x28, 0x22, 0x25, 0x2e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, - 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, + 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x6f, + 0x74, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x5e, 0x5f, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, + 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, + 0x25, 0x64, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x28, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, + 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, + 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, + 0x22, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x28, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, + 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x66, + 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x72, 0x61, + 0x77, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x7e, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, + 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x7e, 0x3d, 0x22, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6c, + 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, + 0x74, 0x65, 0x72, 0x3a, 0x20, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x22, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, - 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, - 0x74, 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, - 0x7e, 0x3d, 0x20, 0x22, 0x24, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, + 0x28, 0x22, 0x25, 0x2e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, - 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x28, + 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, + 0x64, 0x69, 0x67, 0x69, 0x74, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, - 0x23, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x31, - 0x20, 0x2b, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x5b, 0x25, 0x2e, - 0x3a, 0x5d, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x23, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x72, + 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, + 0x25, 0x2e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x29, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, + 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, + 0x25, 0x2e, 0x3a, 0x5d, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, + 0x7e, 0x3d, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x7e, 0x3d, 0x20, + 0x22, 0x24, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x6d, 0x61, 0x6c, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x79, 0x6d, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, + 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x62, 0x79, 0x74, + 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x23, 0x72, 0x61, + 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2b, 0x20, + 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x22, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, + 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x2e, 0x2b, + 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, + 0x6d, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, + 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x23, 0x72, 0x61, 0x77, 0x73, + 0x74, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x2e, 0x2b, 0x5b, 0x25, + 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, + 0x6d, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, + 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, + 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, + 0x70, 0x28, 0x7b, 0x62, 0x7d, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, + 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, + 0x61, 0x72, 0x67, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x3a, 0x2e, 0x2b, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x6f, - 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x3a, 0x20, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, - 0x2c, 0x20, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x2d, 0x20, 0x23, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, - 0x20, 0x2b, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x2e, 0x2b, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, - 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5e, 0x3a, 0x2e, 0x2b, 0x24, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, + 0x62, 0x28, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, + 0x79, 0x6d, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x72, + 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, + 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x7b, 0x62, - 0x7d, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x35, 0x39, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, + 0x2c, 0x20, 0x7b, 0x22, 0x3b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x28, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, - 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x3a, 0x2e, 0x2b, - 0x24, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, - 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x32, 0x29, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, + 0x5b, 0x62, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, + 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, + 0x3d, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x5f, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x73, - 0x79, 0x6d, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, + 0x73, 0x5b, 0x62, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x62, + 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, + 0x79, 0x74, 0x65, 0x28, 0x22, 0x7e, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, - 0x6d, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6e, 0x69, - 0x6c, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, - 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, - 0x20, 0x3d, 0x3d, 0x20, 0x35, 0x39, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x7b, 0x22, 0x3b, - 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x65, 0x6c, - 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x34, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, + 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x69, 0x6c, + 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x22, 0x2c, + 0x20, 0x62, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x2c, 0x20, 0x75, 0x6e, + 0x67, 0x65, 0x74, 0x62, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x69, 0x6c, 0x6c, + 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x72, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x5b, 0x62, 0x5d, 0x20, + 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x5b, + 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, + 0x33, 0x66, 0x2c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x20, 0x3d, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x20, + 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, + 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, + 0x32, 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x20, 0x3c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, + 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, + 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x5f, 0x30, 0x5f, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, + 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x6b, 0x5d, 0x20, + 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, + 0x64, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x69, 0x64, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x73, - 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x62, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x22, - 0x7e, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x69, - 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, - 0x63, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, - 0x66, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x2c, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x79, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x69, 0x64, 0x78, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, + 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, - 0x70, 0x28, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, - 0x28, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x65, + 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x7b, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, - 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, - 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, - 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, - 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x7d, 0x0a, 0x65, 0x6e, - 0x64, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, - 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, - 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, - 0x63, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x6e, 0x65, + 0x78, 0x74, 0x2c, 0x20, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, + 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x75, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, + 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, + 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, + 0x31, 0x5b, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x78, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x66, 0x30, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x30, + 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, + 0x74, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, + 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x20, 0x3d, 0x20, + 0x28, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x30, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x5b, 0x66, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x61, 0x29, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x5f, - 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x69, 0x2c, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x6b, - 0x5d, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x28, 0x69, 0x20, - 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, - 0x20, 0x69, 0x64, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x78, 0x20, 0x69, 0x6e, 0x20, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, 0x20, + 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x30, 0x28, 0x6b, 0x2c, + 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, + 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, - 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x69, - 0x64, 0x78, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x65, 0x79, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6d, 0x61, 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x6f, 0x75, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6f, 0x75, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x75, 0x74, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, - 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x78, 0x5b, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x5f, 0x2c, 0x20, 0x78, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x66, 0x30, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, - 0x74, 0x30, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x5b, 0x6b, 0x65, 0x79, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x30, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x74, 0x2c, - 0x20, 0x66, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x20, - 0x3d, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x66, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, - 0x5f, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x5b, 0x73, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x78, 0x20, 0x69, - 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x30, 0x28, - 0x6b, 0x2c, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, - 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x5b, 0x6b, - 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, - 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x30, - 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x66, - 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x74, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x30, 0x20, 0x3d, - 0x20, 0x28, 0x74, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, - 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x30, - 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x5f, 0x33, 0x66, 0x28, 0x78, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, - 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, - 0x28, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x3d, 0x20, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x66, 0x72, 0x6f, + 0x6d, 0x2c, 0x20, 0x74, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x30, 0x20, 0x3d, 0x20, 0x28, + 0x74, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x30, 0x5b, 0x6b, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x6f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, + 0x66, 0x28, 0x78, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x6e, + 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, + 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, + 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x2c, 0x20, 0x74, 0x62, 0x6c, + 0x2c, 0x20, 0x28, 0x28, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x2c, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, + 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5f, + 0x6e, 0x65, 0x78, 0x74, 0x28, 0x5f, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, + 0x65, 0x65, 0x6e, 0x5b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x2c, - 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x28, 0x28, 0x6e, 0x20, 0x6f, 0x72, - 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x74, 0x62, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, - 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, - 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x5f, 0x2c, 0x20, + 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, + 0x74, 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, - 0x74, 0x61, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, + 0x5b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, + 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x65, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x72, + 0x65, 0x66, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, 0x79, + 0x6d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x2c, + 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6b, 0x20, 0x3e, 0x20, 0x6d, 0x61, + 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x6b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, + 0x78, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x69, 0x6c, 0x5f, + 0x73, 0x79, 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, + 0x28, 0x73, 0x61, 0x66, 0x65, 0x2c, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x32, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x22, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x28, 0x61, 0x2c, + 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x28, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x61, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x62, + 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x72, 0x65, - 0x66, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, 0x79, 0x6d, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x2c, 0x20, - 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, - 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6b, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x78, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x6b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x61, - 0x66, 0x65, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x73, - 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, - 0x79, 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, - 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, 0x28, - 0x73, 0x61, 0x66, 0x65, 0x2c, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x32, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x2c, - 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x29, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, + 0x33, 0x63, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x5b, 0x31, + 0x5d, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x53, 0x59, 0x4d, - 0x42, 0x4f, 0x4c, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, - 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x45, 0x58, 0x50, 0x52, - 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, - 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x4c, 0x49, 0x53, 0x54, 0x22, - 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, - 0x65, 0x77, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, - 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5f, 0x5f, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, - 0x22, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x22, 0x2c, 0x20, 0x5f, - 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, - 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, + 0x42, 0x4f, 0x4c, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x65, 0x71, 0x20, 0x3d, + 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x6c, 0x74, 0x20, + 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x63, 0x2c, 0x20, 0x5f, 0x5f, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, + 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x45, 0x58, 0x50, 0x52, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x53, 0x45, 0x51, - 0x55, 0x45, 0x4e, 0x43, 0x45, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, - 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x7b, - 0x22, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x22, 0x2c, 0x20, 0x5f, 0x5f, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, - 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, - 0x65, 0x66, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x73, 0x2e, 0x67, 0x65, 0x74, - 0x65, 0x6e, 0x76, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x5f, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, - 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x67, 0x65, 0x74, 0x65, 0x6e, - 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x66, 0x6c, 0x61, 0x67, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x22, 0x4c, 0x49, 0x53, 0x54, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x43, 0x4f, 0x4d, 0x4d, 0x45, + 0x4e, 0x54, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x65, 0x71, 0x20, 0x3d, 0x20, + 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x2c, + 0x20, 0x5f, 0x5f, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, + 0x33, 0x63, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, 0x45, + 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x22, 0x2e, + 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x7b, 0x22, 0x56, 0x41, 0x52, 0x41, + 0x52, 0x47, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, + 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x65, + 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, - 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, - 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, + 0x76, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6f, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x33, 0x66, + 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, + 0x20, 0x28, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x22, 0x46, 0x45, + 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, + 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, + 0x6d, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x5b, 0x22, 0x3f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x66, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x5f, 0x33, + 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, @@ -10643,297 +12229,322 @@ unsigned char loadfennel_lua[] = { 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x32, 0x61, - 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, - 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2c, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x0a, 0x20, + 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x5f, + 0x33, 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, + 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x61, 0x72, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, + 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, - 0x72, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, - 0x70, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, - 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x72, - 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x3d, - 0x3d, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, 0x6e, + 0x72, 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, + 0x3d, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x33, 0x66, + 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x33, 0x66, 0x28, - 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x78, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x6d, 0x74, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, - 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x78, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, - 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x78, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, - 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, - 0x7e, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, + 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, - 0x3d, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x74, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x74, 0x2e, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, - 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7e, 0x3d, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, - 0x73, 0x74, 0x72, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x5b, 0x5e, 0x25, 0x2e, 0x25, 0x3a, 0x5d, 0x2b, 0x5b, 0x25, 0x2e, 0x25, - 0x3a, 0x5d, 0x3f, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x28, 0x20, 0x2d, 0x20, - 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, - 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, - 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x78, 0x20, + 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x78, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, + 0x66, 0x28, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, + 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, + 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, + 0x5e, 0x25, 0x2e, 0x25, 0x3a, 0x5d, 0x2b, 0x5b, 0x25, 0x2e, 0x25, 0x3a, + 0x5d, 0x3f, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, - 0x72, 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, 0x20, - 0x2d, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, - 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, - 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, - 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, - 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x72, - 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x2e, 0x25, 0x2e, - 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, - 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, - 0x22, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, - 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, 0x29, - 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x62, 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, + 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, + 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, 0x20, 0x2d, + 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, 0x23, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, + 0x25, 0x2e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x2e, 0x25, 0x2e, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x62, + 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, 0x22, + 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, + 0x62, 0x79, 0x74, 0x65, 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, + 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, + 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, + 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x2e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, + 0x6c, 0x6b, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x28, 0x72, 0x6f, 0x6f, 0x74, + 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, - 0x33, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, - 0x61, 0x6c, 0x6b, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x28, 0x72, 0x6f, 0x6f, - 0x74, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x69, - 0x74, 0x65, 0x72, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, - 0x28, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x74, 0x65, - 0x72, 0x66, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, - 0x61, 0x6c, 0x6b, 0x28, 0x69, 0x74, 0x65, 0x72, 0x66, 0x6e, 0x2c, 0x20, - 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x69, 0x74, + 0x65, 0x72, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x28, + 0x69, 0x64, 0x78, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x66, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, + 0x6c, 0x6b, 0x28, 0x69, 0x74, 0x65, 0x72, 0x66, 0x6e, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x28, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, + 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, + 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, + 0x2c, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6e, + 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x68, 0x65, 0x6e, + 0x22, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x22, + 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x67, 0x6f, 0x74, 0x6f, 0x22, 0x7d, + 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x75, + 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x76, 0x5d, 0x20, 0x3d, + 0x20, 0x69, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, 0x5f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x33, + 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x5b, 0x25, 0x61, 0x5f, 0x5d, + 0x5b, 0x25, 0x77, 0x5f, 0x5d, 0x2a, 0x24, 0x22, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, + 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x22, 0x7d, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, + 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, + 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, + 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x33, + 0x5f, 0x5b, 0x22, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x22, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x22, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, + 0x33, 0x5f, 0x5b, 0x22, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5b, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x28, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, - 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, - 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, - 0x62, 0x72, 0x65, 0x61, 0x6b, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, - 0x2c, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, - 0x22, 0x2c, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, - 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x66, 0x22, 0x2c, - 0x20, 0x22, 0x69, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, - 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, - 0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x68, 0x65, - 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, - 0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x68, - 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x67, 0x6f, 0x74, 0x6f, 0x22, - 0x7d, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, - 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, - 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x75, 0x61, 0x5f, - 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x76, 0x5d, 0x20, - 0x3d, 0x20, 0x69, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, - 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, - 0x33, 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x5b, 0x25, 0x61, 0x5f, - 0x5d, 0x5b, 0x25, 0x77, 0x5f, 0x5d, 0x2a, 0x24, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, - 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x73, 0x74, 0x72, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x72, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x65, - 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x22, 0x7d, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x72, 0x6f, 0x70, 0x61, - 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, - 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, - 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, - 0x7b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, - 0x74, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x5f, - 0x33, 0x5f, 0x5b, 0x22, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, - 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x22, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, - 0x5f, 0x33, 0x5f, 0x5b, 0x22, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, - 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, - 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x5f, 0x2c, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, - 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x5b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x33, - 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, @@ -10950,276 +12561,432 @@ unsigned char loadfennel_lua[] = { 0x20, 0x5b, 0x22, 0x6c, 0x75, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x5b, 0x22, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, - 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, - 0x6d, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, - 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, - 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, - 0x20, 0x5b, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, 0x66, - 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, - 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x2c, - 0x20, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, - 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, - 0x75, 0x61, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x67, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x77, 0x61, 0x6c, 0x6b, 0x2d, 0x74, 0x72, - 0x65, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x5f, - 0x74, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x32, 0x61, 0x2c, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x70, 0x79, - 0x2c, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x64, 0x65, - 0x72, 0x65, 0x66, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x2c, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x20, 0x3d, - 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x2c, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, - 0x20, 0x3d, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, - 0x61, 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x70, 0x61, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x22, 0x2e, 0x2f, 0x3f, 0x2e, - 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, - 0x6e, 0x69, 0x74, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x67, 0x65, - 0x74, 0x65, 0x6e, 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, - 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x22, 0x3b, - 0x22, 0x29, 0x2c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x2c, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x73, - 0x79, 0x6d, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x76, - 0x61, 0x72, 0x67, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x29, - 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, - 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x22, 0x29, - 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x7b, 0x22, 0x2e, 0x2f, 0x3f, 0x2e, 0x66, 0x6e, + 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, + 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x66, 0x6e, 0x6c, + 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, + 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, + 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4d, 0x41, + 0x43, 0x52, 0x4f, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, + 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, + 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, + 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5b, 0x22, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, + 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, + 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, 0x5f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x33, + 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x67, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x5b, 0x22, 0x77, 0x61, 0x6c, 0x6b, 0x2d, 0x74, 0x72, 0x65, 0x65, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x5f, 0x74, 0x72, 0x65, + 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x63, 0x6f, + 0x70, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x64, + 0x65, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, + 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x2c, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x20, 0x3d, 0x20, 0x68, 0x6f, + 0x6f, 0x6b, 0x2c, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, + 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x70, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x7b, 0x22, 0x2e, 0x2f, 0x3f, 0x2e, 0x66, 0x6e, 0x6c, + 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, + 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, + 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x50, 0x41, + 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x6f, 0x74, + 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x2c, + 0x20, 0x76, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x67, + 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x29, - 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x76, 0x28, - 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, - 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, - 0x76, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6e, - 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x65, 0x6e, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, - 0x20, 0x5f, 0x47, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, - 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, - 0x65, 0x6e, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x65, 0x6e, 0x76, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, - 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x6c, 0x6f, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, + 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, + 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x22, 0x29, 0x0a, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6f, + 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5f, + 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, + 0x22, 0x5d, 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, + 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, + 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, + 0x65, 0x6e, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, + 0x6f, 0x70, 0x74, 0x73, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, + 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x6f, + 0x70, 0x74, 0x73, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, + 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, + 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, + 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, + 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, + 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, 0x6c, 0x75, + 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x5f, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, - 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x40, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, 0x61, - 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, 0x6c, 0x75, 0x61, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, - 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x28, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, - 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, - 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x22, 0x72, 0x62, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x3a, 0x72, 0x65, 0x61, - 0x64, 0x28, 0x22, 0x2a, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x28, - 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, - 0x65, 0x61, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x66, 0x3a, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, - 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, - 0x7b, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x22, 0x72, 0x62, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x3a, 0x72, 0x65, + 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x2c, 0x20, + 0x28, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x66, + 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x76, 0x61, + 0x6c, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x77, 0x68, 0x65, + 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, + 0x65, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x22, + 0x2c, 0x20, 0x22, 0x5c, 0x32, 0x30, 0x36, 0x5c, 0x31, 0x38, 0x37, 0x22, + 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, 0x20, 0x22, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x61, 0x63, 0x68, + 0x22, 0x2c, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x6c, + 0x65, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, + 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x33, + 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x66, 0x6e, 0x22, 0x2c, 0x20, 0x22, + 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x32, + 0x30, 0x36, 0x5c, 0x31, 0x38, 0x37, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, + 0x72, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, + 0x20, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x76, + 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, + 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x66, 0x6f, 0x72, + 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, + 0x6b, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x33, + 0x66, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, + 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x2c, + 0x20, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x2c, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x2c, 0x20, 0x5b, + 0x22, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x66, 0x6f, 0x72, 0x6d, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, + 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, + 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, + 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, + 0x28, 0x6b, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x33, 0x66, 0x29, + 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x3f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x2c, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x2c, 0x20, + 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, 0x47, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x32, 0x2c, 0x20, + 0x76, 0x32, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x76, 0x32, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6b, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x5f, 0x47, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x28, 0x6b, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6b, 0x32, 0x29, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x3f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, + 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, - 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x61, - 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, 0x61, - 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, - 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, - 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, - 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, - 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, - 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x20, 0x3d, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x64, 0x6f, - 0x63, 0x2c, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, - 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x65, - 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x2c, 0x20, - 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x2c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, - 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, - 0x74, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x20, - 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, - 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, - 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, + 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, + 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, + 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, + 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, + 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, + 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, + 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, + 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, + 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, + 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, + 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x2c, 0x20, 0x64, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x65, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, + 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x67, 0x72, 0x61, + 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, + 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x2c, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, - 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x72, 0x65, 0x70, - 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2c, 0x20, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, - 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, - 0x28, 0x29, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x73, - 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, - 0x79, 0x6d, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, + 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, + 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, + 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, + 0x5d, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x61, + 0x74, 0x68, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x70, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, + 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x2c, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, + 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x28, 0x29, 0x2c, 0x20, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6e, 0x74, + 0x61, 0x78, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, @@ -11228,115 +12995,154 @@ unsigned char loadfennel_lua[] = { 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, - 0x30, 0x2e, 0x38, 0x2e, 0x31, 0x22, 0x2c, 0x20, 0x76, 0x69, 0x65, 0x77, - 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, 0x7d, 0x0a, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, - 0x64, 0x0a, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x3d, 0x3d, 0x3d, 0x5b, 0x3b, - 0x3b, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, - 0x2d, 0x69, 0x6e, 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x20, 0x55, 0x6e, 0x6c, 0x69, 0x6b, - 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x74, - 0x73, 0x74, 0x72, 0x61, 0x70, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x75, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x3b, - 0x3b, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, - 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x30, 0x2e, 0x31, 0x30, 0x2e, 0x30, 0x22, 0x2c, 0x20, 0x76, 0x69, 0x65, + 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, 0x7d, 0x0a, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, + 0x6f, 0x64, 0x0a, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x3d, 0x3d, 0x3d, 0x5b, + 0x3b, 0x3b, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x74, 0x2d, 0x69, 0x6e, 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x20, 0x55, 0x6e, 0x6c, 0x69, + 0x6b, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x6f, 0x6f, + 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x75, + 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, + 0x3b, 0x3b, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x61, + 0x74, 0x20, 0x69, 0x64, 0x69, 0x6f, 0x73, 0x79, 0x6e, 0x63, 0x72, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, + 0x65, 0x20, 0x61, 0x6e, 0x79, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x79, 0x65, 0x74, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x20, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x61, 0x74, - 0x20, 0x69, 0x64, 0x69, 0x6f, 0x73, 0x79, 0x6e, 0x63, 0x72, 0x61, 0x74, - 0x69, 0x63, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, - 0x20, 0x61, 0x6e, 0x79, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, - 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x79, 0x65, 0x74, 0x20, - 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, - 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, 0x4f, - 0x44, 0x4f, 0x3a, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x69, - 0x72, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, - 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x73, - 0x74, 0x6f, 0x70, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x75, 0x74, - 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x0a, 0x20, 0x20, 0x0a, - 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, 0x2a, 0x20, 0x5b, 0x76, - 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x54, - 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, - 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2c, 0x20, 0x65, 0x74, 0x63, + 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x72, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x3b, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x73, 0x74, 0x6f, 0x70, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x75, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, 0x2a, 0x20, 0x5b, + 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, + 0x54, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x73, 0x20, 0x69, + 0x74, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2c, 0x20, 0x65, 0x74, + 0x63, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x72, + 0x20, 0x78, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x20, 0x28, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, + 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, + 0x32, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x78, 0x20, 0x65, 0x6c, 0x74, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, 0x3e, 0x2a, 0x20, + 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, + 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2d, 0x3e, 0x2c, 0x20, + 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x0a, 0x20, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x78, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x20, 0x28, 0x69, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, - 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, - 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x32, - 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x73, 0x65, 0x74, 0x20, 0x78, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x0a, - 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, 0x3e, 0x2a, 0x20, 0x5b, - 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6c, 0x61, 0x73, - 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x53, - 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2d, 0x3e, 0x2c, 0x20, 0x65, - 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, - 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x0a, - 0x20, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x78, - 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, - 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x20, 0x28, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, - 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x78, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, - 0x20, 0x78, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, - 0x6e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x20, 0x28, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x78, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, + 0x74, 0x20, 0x78, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, + 0x66, 0x6e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, + 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, + 0x69, 0x6c, 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x73, 0x20, 0x2d, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, + 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, + 0x30, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, + 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, + 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, + 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x20, 0x65, 0x6c, 0x73, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, + 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x20, 0x28, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x32, + 0x20, 0x74, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, + 0x74, 0x6d, 0x70, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x69, 0x66, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x2d, 0x3f, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, 0x73, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, + 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x69, 0x6c, 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, - 0x64, 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, - 0x20, 0x2d, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, + 0x64, 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, + 0x2d, 0x3e, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x65, @@ -11358,271 +13164,217 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x32, 0x20, - 0x74, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x74, - 0x6d, 0x70, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, - 0x66, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x74, 0x6d, + 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x74, 0x6d, 0x70, + 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x2c, 0x74, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2d, + 0x3f, 0x3e, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x2d, 0x3f, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, 0x75, - 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, 0x73, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x3f, + 0x64, 0x6f, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x69, 0x6c, 0x2d, 0x73, + 0x61, 0x66, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, + 0x6f, 0x6b, 0x20, 0x75, 0x70, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, + 0x65, 0x20, 0x61, 0x73, 0x20, 0x2e, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x29, + 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x69, 0x72, 0x63, + 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x61, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x68, 0x65, 0x61, 0x64, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x20, 0x3a, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x20, 0x60, + 0x28, 0x64, 0x6f, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x2c, 0x68, 0x65, + 0x61, 0x64, 0x20, 0x2c, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x2c, 0x68, 0x65, + 0x61, 0x64, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x6b, 0x20, 0x28, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x4b, 0x69, 0x6e, 0x64, 0x61, 0x20, 0x67, 0x6e, 0x61, 0x72, 0x6c, + 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6c, + 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x62, 0x75, + 0x74, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x2e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x57, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6d, + 0x70, 0x6c, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, + 0x20, 0x61, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x63, 0x69, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x20, 0x28, 0x23, 0x20, 0x6c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x29, 0x20, 0x60, 0x28, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2c, 0x68, + 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, - 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, - 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x69, 0x6c, - 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, - 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2d, - 0x3e, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, - 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6e, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, - 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, 0x30, 0x20, - 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, - 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, 0x73, 0x20, - 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, - 0x65, 0x6c, 0x73, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x20, - 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, - 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x20, 0x28, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x74, 0x6d, 0x70, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x74, 0x6d, 0x70, 0x20, - 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x2c, - 0x74, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2d, 0x3f, - 0x3e, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x64, 0x6f, - 0x74, 0x6f, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, - 0x61, 0x74, 0x65, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, - 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, - 0x20, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, - 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x32, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x65, 0x6c, 0x74, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, - 0x2a, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, - 0x69, 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, - 0x72, 0x75, 0x74, 0x68, 0x79, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x31, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x62, 0x6f, 0x64, 0x79, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x69, 0x66, 0x20, 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x64, 0x6f, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x20, 0x2c, - 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x28, 0x66, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, - 0x6e, 0x2a, 0x20, 0x5b, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2e, 0x2e, - 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, - 0x20, 0x60, 0x6c, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, - 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x73, 0x20, 0x28, 0x76, 0x3a, 0x63, - 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, - 0x68, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, - 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x69, 0x73, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x60, 0x78, 0x70, 0x63, - 0x61, 0x6c, 0x6c, 0x60, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x64, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x2e, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, - 0x66, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x5b, - 0x5d, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x2c, 0x68, 0x65, 0x61, 0x64, + 0x20, 0x28, 0x2e, 0x20, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x20, 0x2c, 0x6b, + 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x64, 0x6f, 0x74, 0x6f, 0x2a, + 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x70, + 0x6c, 0x69, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x60, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2c, + 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x6c, + 0x74, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, + 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x32, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, + 0x20, 0x28, 0x66, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x2a, 0x20, 0x5b, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, + 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x6c, + 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x75, 0x74, + 0x68, 0x79, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x69, 0x66, + 0x20, 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x2a, 0x20, 0x5b, 0x63, + 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x60, 0x6c, 0x65, 0x74, + 0x60, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6b, + 0x65, 0x73, 0x20, 0x28, 0x76, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, + 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x73, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x60, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x60, 0x20, + 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, + 0x75, 0x70, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x74, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x66, 0x6e, 0x20, 0x60, 0x28, + 0x66, 0x6e, 0x20, 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x23, 0x20, 0x5b, 0x6f, - 0x6b, 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x6f, 0x6b, 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x30, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, - 0x60, 0x28, 0x2e, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, - 0x20, 0x3a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, - 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x23, 0x20, 0x63, 0x6c, 0x6f, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, - 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x20, 0x69, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, - 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, - 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, - 0x34, 0x20, 0x60, 0x28, 0x3a, 0x20, 0x2c, 0x28, 0x2e, 0x20, 0x63, 0x6c, - 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x20, 0x69, 0x29, 0x20, 0x3a, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, - 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x2d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x23, - 0x20, 0x28, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x2c, 0x62, 0x6f, - 0x64, 0x79, 0x66, 0x6e, 0x20, 0x2c, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, - 0x61, 0x63, 0x6b, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, - 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, - 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, - 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x62, - 0x79, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, - 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, - 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x75, - 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, - 0x5c, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5c, 0x22, 0x2e, - 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, - 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x32, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, - 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x5b, 0x6b, 0x20, - 0x76, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x7b, 0x3a, 0x61, - 0x70, 0x70, 0x6c, 0x65, 0x20, 0x5c, 0x22, 0x72, 0x65, 0x64, 0x5c, 0x22, - 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x5c, 0x22, 0x6f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, 0x7d, 0x29, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x76, 0x20, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x3a, 0x72, - 0x65, 0x64, 0x20, 0x5c, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x5c, 0x22, - 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x5c, 0x22, 0x6f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, 0x7d, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, - 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, - 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x32, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x6b, - 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, - 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x6b, 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x78, - 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x62, 0x6f, - 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x2e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x6f, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x7b, 0x7d, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, - 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x20, 0x2c, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2d, 0x65, 0x78, 0x70, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6b, 0x23, 0x20, 0x76, 0x23, 0x29, - 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x20, - 0x6b, 0x23, 0x20, 0x76, 0x23, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, 0x63, 0x6f, 0x6c, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x23, 0x20, + 0x2e, 0x2e, 0x2e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, + 0x2e, 0x2e, 0x20, 0x30, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x20, 0x60, 0x28, 0x2e, 0x20, 0x28, 0x6f, 0x72, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x29, 0x20, 0x3a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, + 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, 0x79, 0x6d, + 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x74, 0x68, + 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x34, 0x20, 0x60, + 0x28, 0x3a, 0x20, 0x2c, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x69, 0x29, 0x20, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x73, 0x23, 0x20, 0x28, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x66, 0x6e, 0x20, 0x2c, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, 0x2d, - 0x74, 0x62, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, - 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x69, - 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x6f, - 0x75, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x73, 0x20, 0x61, - 0x20, 0x5c, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5c, 0x22, 0x2e, - 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x5b, 0x5f, 0x20, - 0x76, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x31, - 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35, 0x5d, 0x29, 0x5d, 0x20, - 0x28, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x28, 0x3e, 0x20, 0x76, 0x20, 0x32, - 0x29, 0x20, 0x28, 0x2a, 0x20, 0x76, 0x20, 0x76, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x5b, 0x39, 0x20, 0x31, 0x36, 0x20, 0x32, 0x35, 0x5d, 0x22, + 0x74, 0x62, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, + 0x65, 0x20, 0x62, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x6b, 0x65, 0x79, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x73, + 0x20, 0x61, 0x20, 0x5c, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5c, 0x22, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x32, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, + 0x6e, 0x69, 0x6c, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, + 0x5b, 0x6b, 0x20, 0x76, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x7b, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x5c, 0x22, 0x72, 0x65, + 0x64, 0x5c, 0x22, 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x5c, 0x22, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, 0x7d, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x76, 0x20, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x3a, 0x72, 0x65, 0x64, 0x20, 0x5c, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x65, 0x5c, 0x22, 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x5c, 0x22, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, @@ -11634,183 +13386,411 @@ unsigned char loadfennel_lua[] = { 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, - 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x62, - 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, - 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, - 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, - 0x74, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x28, 0x2b, 0x20, 0x28, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x29, 0x20, - 0x31, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, - 0x70, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x62, 0x6c, 0x23, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x28, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x2a, - 0x20, 0x5b, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x66, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x28, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x5f, - 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x5b, 0x2c, 0x5f, 0x56, 0x41, - 0x52, 0x41, 0x52, 0x47, 0x5d, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, - 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x20, 0x5b, - 0x6e, 0x20, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x65, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x2e, - 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, - 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x66, 0x6e, 0x20, 0x5b, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x5d, - 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x5f, - 0x31, 0x5f, 0x29, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x29, 0x20, 0x3a, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x6e, - 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, - 0x20, 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x6e, 0x20, 0x30, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x74, 0x65, - 0x72, 0x61, 0x6c, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, - 0x20, 0x31, 0x20, 0x6e, 0x5d, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x20, 0x28, - 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x28, 0x2c, 0x66, 0x20, 0x2c, - 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2a, 0x20, 0x5b, 0x6e, 0x20, 0x2e, - 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6b, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x60, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x2c, 0x20, - 0x62, 0x75, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x65, 0x78, - 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, + 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, + 0x65, 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x7b, 0x7d, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x20, 0x2c, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6b, 0x23, 0x20, + 0x76, 0x23, 0x29, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x74, 0x62, + 0x6c, 0x23, 0x20, 0x6b, 0x23, 0x20, 0x76, 0x23, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, 0x5b, 0x69, 0x74, + 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2d, 0x65, 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x61, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, + 0x62, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x73, 0x20, 0x61, 0x20, 0x5c, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5c, 0x22, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x32, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x5f, 0x30, - 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x29, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, - 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, - 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, - 0x6c, 0x6f, 0x6f, 0x72, 0x20, 0x6e, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, - 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x65, 0x72, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6c, 0x65, 0x74, 0x2d, - 0x73, 0x79, 0x6d, 0x73, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, 0x31, 0x20, 0x28, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x20, 0x3a, 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, - 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x60, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, - 0x31, 0x20, 0x6e, 0x5d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x73, - 0x79, 0x6d, 0x73, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x60, 0x28, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x2c, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x2c, 0x6c, - 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x20, 0x28, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x28, 0x66, 0x6e, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2a, 0x20, - 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x65, - 0x72, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x72, 0x69, - 0x74, 0x79, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2e, - 0x0a, 0x20, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x6f, - 0x77, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x64, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x75, - 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x3f, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x72, 0x67, 0x73, 0x20, 0x5b, 0x2e, - 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, 0x73, 0x79, - 0x6d, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x31, + 0x20, 0x20, 0x28, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, + 0x5b, 0x5f, 0x20, 0x76, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x5b, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35, 0x5d, + 0x29, 0x5d, 0x20, 0x28, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x28, 0x3e, 0x20, + 0x76, 0x20, 0x32, 0x29, 0x20, 0x28, 0x2a, 0x20, 0x76, 0x20, 0x76, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x39, 0x20, 0x31, 0x36, 0x20, 0x32, + 0x35, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, + 0x62, 0x6c, 0x29, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, + 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x5b, + 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, + 0x61, 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x73, 0x65, 0x74, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x28, 0x2b, + 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x74, 0x62, 0x6c, + 0x23, 0x29, 0x20, 0x31, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, + 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, + 0x49, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, + 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x0a, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, + 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x20, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, + 0x60, 0x65, 0x61, 0x63, 0x68, 0x60, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, + 0x2e, 0x0a, 0x20, 0x20, 0x49, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x66, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, + 0x69, 0x76, 0x65, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x49, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x5b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x20, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x7b, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x32, 0x20, 0x3a, + 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x33, 0x7d, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2b, 0x20, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, + 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, + 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, + 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, + 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, + 0x69, 0x6e, 0x69, 0x74, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, + 0x74, 0x62, 0x6c, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x60, 0x28, 0x64, 0x6f, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, + 0x2c, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x20, 0x2c, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, + 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x2c, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x20, 0x2c, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x2a, 0x20, 0x5b, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x79, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, + 0x20, 0x61, 0x72, 0x67, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x72, + 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x61, - 0x72, 0x67, 0x73, 0x20, 0x32, 0x29, 0x20, 0x28, 0x2e, 0x20, 0x61, 0x72, - 0x67, 0x73, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x33, - 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x3f, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3e, - 0x20, 0x28, 0x23, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x3d, 0x20, 0x60, 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x72, + 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x66, 0x20, 0x28, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x66, 0x6e, 0x20, 0x5b, 0x2c, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, + 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x20, 0x5b, 0x6e, + 0x20, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x2e, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, + 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, + 0x6e, 0x20, 0x5b, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x5d, 0x20, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, + 0x5f, 0x29, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x20, + 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x5f, + 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2d, 0x2d, 0x20, 0x57, 0x41, 0x52, 0x4e, 0x49, + 0x4e, 0x47, 0x3a, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x2e, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x29, + 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x20, 0x28, 0x3d, + 0x20, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x20, 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x6e, + 0x20, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x45, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x3e, 0x3d, + 0x20, 0x30, 0x2c, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, 0x20, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, + 0x69, 0x20, 0x31, 0x20, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x20, 0x28, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x2c, 0x66, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, + 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x2a, 0x20, 0x5b, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x60, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x60, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x65, 0x6d, + 0x69, 0x74, 0x73, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, + 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, 0x69, 0x63, + 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x32, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x28, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x29, + 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x5f, 0x30, 0x5f, 0x20, + 0x5f, 0x31, 0x5f, 0x29, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, + 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x28, + 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x20, 0x6e, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x45, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, + 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x5b, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, + 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, 0x31, 0x20, + 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x60, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, + 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x6e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6c, 0x65, 0x74, 0x2d, + 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, + 0x66, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x60, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x5b, 0x2c, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x2c, + 0x6c, 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x28, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, + 0x6d, 0x73, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, + 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, + 0x2a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x2e, 0x0a, 0x20, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x72, 0x6f, 0x77, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x6e, 0x69, 0x6c, 0x2c, + 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x0a, 0x20, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x3f, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x28, + 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, 0x2e, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x29, 0x20, 0x28, 0x2e, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, + 0x20, 0x33, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x3e, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x3d, 0x20, 0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, - 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x34, 0x20, - 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x30, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x64, 0x6f, 0x63, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x34, 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, + 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x30, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x20, 0x30, 0x20, 0x31, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3f, - 0x20, 0x28, 0x3c, 0x20, 0x28, 0x23, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x3f, 0x20, 0x30, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3f, 0x20, 0x28, 0x3c, 0x20, 0x28, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x68, @@ -11830,758 +13810,1001 @@ unsigned char loadfennel_lua[] = { 0x61, 0x74, 0x63, 0x68, 0x20, 0x22, 0x5e, 0x3f, 0x22, 0x29, 0x29, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x26, 0x22, 0x29, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, - 0x5f, 0x22, 0x29, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, - 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2c, - 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x2e, 0x2e, 0x2e, + 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2c, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x25, - 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, + 0x22, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x6e, 0x20, + 0x25, 0x73, 0x3a, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2c, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x28, 0x6f, 0x72, 0x20, 0x61, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x75, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2c, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3a, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, - 0x28, 0x6f, 0x72, 0x20, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x22, - 0x3f, 0x22, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, - 0x3d, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x29, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, - 0x72, 0x67, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, - 0x20, 0x61, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x61, - 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x21, - 0x20, 0x61, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x62, 0x6f, 0x64, - 0x79, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x28, 0x73, 0x79, 0x6d, - 0x20, 0x3a, 0x6e, 0x69, 0x6c, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2a, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, - 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, - 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, - 0x79, 0x6d, 0x3f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, - 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x7b, 0x20, 0x2c, 0x28, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x7d, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, 0x20, 0x5b, - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3f, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, - 0x61, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, - 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, - 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, - 0x5b, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3f, 0x20, 0x60, 0x64, 0x6f, 0x20, - 0x60, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x60, 0x28, 0x2c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x20, 0x2c, 0x28, 0x76, 0x69, 0x65, 0x77, 0x20, 0x28, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x20, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x2a, 0x20, 0x5b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, - 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, - 0x69, 0x6e, 0x64, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x61, 0x63, - 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x2e, 0x0a, 0x20, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, - 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x61, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6f, 0x72, - 0x20, 0x61, 0x20, 0x6b, 0x2f, 0x76, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x79, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, - 0x6d, 0x79, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7b, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x31, 0x20, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x20, 0x3a, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x32, - 0x7d, 0x20, 0x3a, 0x70, 0x72, 0x6f, 0x6a, 0x2e, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x29, 0x20, 0x3b, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, - 0x6e, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, - 0x20, 0x28, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3a, 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x29, - 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, - 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3a, 0x23, 0x20, 0x62, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x3a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x29, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x61, 0x20, + 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x61, 0x72, 0x67, 0x6c, + 0x69, 0x73, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x21, 0x20, 0x61, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x20, 0x3a, 0x6e, + 0x69, 0x6c, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2a, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x2e, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x5b, 0x2e, 0x2e, + 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x7b, 0x2c, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x28, + 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, 0x20, 0x5b, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3f, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x0a, 0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3f, 0x20, 0x60, 0x64, 0x6f, 0x20, 0x60, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x28, 0x2c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x2c, 0x28, 0x76, + 0x69, 0x65, 0x77, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, + 0x70, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x5f, 0x53, + 0x43, 0x4f, 0x50, 0x45, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, 0x20, 0x5b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x28, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x20, 0x62, 0x69, 0x6e, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x69, 0x6e, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x0a, 0x20, + 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, + 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6b, + 0x2f, 0x76, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, + 0x20, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x79, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x6d, 0x79, 0x2d, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x3a, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x31, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x20, + 0x3a, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x32, 0x7d, 0x20, 0x3a, 0x70, + 0x72, 0x6f, 0x6a, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x29, 0x20, + 0x3b, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x62, 0x79, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x28, 0x3d, 0x20, + 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x32, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3b, 0x3b, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, - 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, + 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x28, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x74, 0x6f, 0x20, 0x62, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x2e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x63, + 0x6f, 0x70, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x28, 0x67, 0x65, 0x74, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3b, 0x3b, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x2e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x28, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x60, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x2c, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x7b, 0x7d, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, + 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x31, 0x29, 0x20, 0x28, 0x2e, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, + 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x20, 0x28, 0x67, 0x65, 0x74, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x28, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x41, 0x4c, 0x53, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x60, 0x28, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, - 0x2c, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x7b, 0x7d, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x20, 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x20, 0x31, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x64, 0x6f, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, - 0x28, 0x2e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x31, - 0x29, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, - 0x61, 0x63, 0x68, 0x20, 0x5b, 0x6b, 0x20, 0x76, 0x20, 0x28, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x5b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x5b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6b, 0x65, 0x79, 0x5d, + 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, + 0x2e, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x28, 0x2e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x20, 0x22, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x20, 0x28, 0x2e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x31, 0x29, 0x29, 0x20, 0x6b, 0x20, 0x76, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x31, 0x2d, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, - 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x3f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x5b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x2d, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x5d, 0x0a, 0x20, + 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6b, 0x65, 0x79, + 0x20, 0x28, 0x2e, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x3b, 0x20, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x5b, 0x76, + 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x60, 0x28, 0x61, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x69, 0x20, 0x70, 0x61, 0x74, + 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x73, 0x75, + 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, + 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x5b, 0x28, 0x2e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, + 0x69, 0x29, 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, - 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x2e, 0x2e, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x22, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6d, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x2d, 0x6b, 0x65, 0x79, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x3b, 0x20, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, - 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, + 0x5f, 0x20, 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, - 0x69, 0x20, 0x70, 0x61, 0x74, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x28, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x28, 0x2e, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x20, 0x69, 0x29, 0x5d, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2c, 0x76, 0x61, 0x6c, + 0x29, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x6b, + 0x20, 0x70, 0x61, 0x74, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, + 0x20, 0x70, 0x61, 0x74, 0x20, 0x60, 0x26, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x32, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x26, + 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x60, 0x28, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x20, 0x2c, 0x6b, 0x20, 0x28, 0x28, 0x6f, 0x72, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x20, + 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, + 0x20, 0x6b, 0x20, 0x60, 0x26, 0x61, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x70, 0x61, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6b, 0x29, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x60, 0x26, 0x61, 0x73, 0x20, + 0x70, 0x61, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, - 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, - 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x62, 0x20, 0x28, 0x69, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x5b, 0x76, 0x61, - 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, - 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x5b, 0x6b, 0x20, 0x70, 0x61, 0x74, 0x20, 0x28, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x79, 0x6d, - 0x3f, 0x20, 0x70, 0x61, 0x74, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x22, 0x26, - 0x22, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x70, 0x61, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x20, 0x28, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, - 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, - 0x2b, 0x20, 0x6b, 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x26, 0x61, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x28, 0x2e, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, + 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x26, 0x2f, 0x26, 0x61, 0x73, + 0x3b, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x6e, 0x6f, + 0x74, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6b, 0x29, 0x29, 0x20, 0x28, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x60, 0x26, 0x61, 0x73, + 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x28, 0x2d, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, - 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, - 0x2b, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, - 0x5b, 0x60, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x2c, 0x6b, - 0x20, 0x28, 0x28, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, + 0x20, 0x60, 0x26, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x73, 0x75, 0x62, + 0x76, 0x61, 0x6c, 0x20, 0x60, 0x28, 0x2e, 0x20, 0x2c, 0x76, 0x61, 0x6c, + 0x20, 0x2c, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x73, 0x75, 0x62, 0x76, 0x61, 0x6c, + 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, + 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x73, 0x75, + 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x76, 0x61, 0x6c, - 0x29, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x76, 0x61, + 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, + 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x41, 0x53, 0x54, 0x20, 0x6f, 0x66, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, + 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, + 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x67, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x77, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x77, + 0x65, 0x27, 0x72, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x28, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, + 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x23, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, + 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x77, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x63, 0x61, + 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x2e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x5b, 0x76, + 0x61, 0x6c, 0x5d, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x72, 0x20, + 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3b, 0x20, 0x75, 0x6e, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6e, 0x6f, 0x74, + 0x3d, 0x20, 0x22, 0x5f, 0x22, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x29, 0x20, 0x3b, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x75, 0x6e, + 0x69, 0x66, 0x79, 0x20, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x3d, 0x20, 0x22, 0x26, 0x22, 0x20, 0x28, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x6b, 0x20, 0x31, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x3b, 0x20, 0x64, - 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, - 0x20, 0x26, 0x3b, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, - 0x67, 0x6f, 0x74, 0x20, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, - 0x5b, 0x73, 0x75, 0x62, 0x76, 0x61, 0x6c, 0x20, 0x60, 0x28, 0x2e, 0x20, - 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x69, 0x6c, 0x20, 0x28, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, + 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, + 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3f, 0x20, 0x28, 0x2e, + 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x31, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, + 0x3d, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x75, 0x6e, + 0x69, 0x66, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x77, 0x65, 0x27, 0x76, 0x65, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x61, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x20, 0x28, 0x2e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, + 0x2c, 0x28, 0x2e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, + 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, 0x20, 0x28, 0x3a, + 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x20, 0x22, 0x5e, 0x5f, 0x22, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, + 0x72, 0x64, 0x3f, 0x29, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x75, + 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, + 0x64, 0x3f, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x69, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x22, + 0x5e, 0x3f, 0x22, 0x29, 0x29, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x73, 0x75, - 0x62, 0x76, 0x61, 0x6c, 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x2c, 0x28, 0x73, 0x79, 0x6d, 0x20, + 0x3a, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x29, + 0x20, 0x5b, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, + 0x6c, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x32, 0x29, 0x20, 0x60, 0x3f, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x5b, 0x28, 0x70, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x2e, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, + 0x6e, 0x64, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x33, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, - 0x20, 0x5b, 0x5f, 0x20, 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x61, - 0x6b, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x53, 0x54, 0x20, - 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x66, - 0x20, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, - 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x61, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x69, - 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, - 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, - 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x3b, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x77, 0x65, - 0x27, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, - 0x77, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6b, 0x6e, - 0x6f, 0x77, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x65, 0x69, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, 0x6c, - 0x61, 0x75, 0x73, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6b, - 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x23, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x73, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6e, - 0x6f, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6f, 0x6e, 0x6c, - 0x79, 0x20, 0x63, 0x61, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, - 0x6e, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x5b, 0x76, 0x61, 0x6c, 0x5d, 0x20, 0x76, 0x61, 0x6c, 0x73, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x28, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x79, - 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, - 0x3b, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6f, 0x72, 0x20, - 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x61, + 0x6e, 0x64, 0x20, 0x2c, 0x70, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x3a, 0x5f, 0x20, 0x28, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x29, 0x20, 0x3b, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x79, 0x20, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x69, 0x6c, 0x20, 0x28, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, - 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x6e, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x28, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x31, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, 0x2c, - 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x79, - 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x65, 0x27, - 0x76, 0x65, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, 0x2e, - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, 0x2c, 0x28, 0x2e, + 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x28, + 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x20, 0x2c, 0x76, - 0x61, 0x6c, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x77, 0x69, 0x6c, - 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, 0x20, 0x28, 0x3a, 0x20, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x22, - 0x5e, 0x5f, 0x22, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, - 0x6f, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, - 0x29, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x75, 0x6e, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, - 0x72, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, 0x20, - 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, - 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x22, 0x5e, 0x3f, 0x22, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, + 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x74, 0x75, 0x61, 0x6c, 0x20, 0x60, 0x69, 0x66, 0x60, 0x20, 0x41, 0x53, + 0x54, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x30, 0x20, 0x28, + 0x25, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x29, 0x29, 0x20, 0x3b, + 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x20, 0x6f, 0x64, 0x64, 0x20, 0x66, + 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6f, 0x75, 0x74, 0x20, + 0x60, 0x28, 0x69, 0x66, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, + 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x20, 0x7b, 0x7d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x60, 0x28, 0x6e, 0x6f, - 0x74, 0x3d, 0x20, 0x2c, 0x28, 0x73, 0x79, 0x6d, 0x20, 0x3a, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x67, - 0x75, 0x61, 0x72, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, - 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, - 0x32, 0x29, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x3f, 0x20, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x2e, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x32, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x70, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x28, - 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x2d, 0x76, 0x61, 0x6c, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x5b, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x48, 0x6f, 0x77, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x3f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, + 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x29, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x60, 0x3f, + 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x69, 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x69, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, + 0x3f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, - 0x61, 0x6e, 0x64, 0x20, 0x2c, 0x70, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, - 0x69, 0x20, 0x33, 0x20, 0x28, 0x23, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x5d, 0x20, 0x3b, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, - 0x65, 0x20, 0x69, 0x6e, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, 0x63, - 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x2e, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x69, 0x29, 0x29, 0x29, + 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x6e, 0x75, + 0x6d, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x2e, 0x20, 0x73, + 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x6c, - 0x65, 0x74, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x20, 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x64, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x73, 0x20, 0x28, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, - 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, - 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, - 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, - 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x3b, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, - 0x60, 0x28, 0x3d, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, - 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x60, 0x69, 0x66, 0x60, - 0x20, 0x41, 0x53, 0x54, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, - 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x29, - 0x29, 0x20, 0x3b, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x20, 0x6f, 0x64, - 0x64, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x75, - 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x28, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, - 0x20, 0x28, 0x73, 0x79, 0x6d, 0x20, 0x3a, 0x5f, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6f, 0x75, - 0x74, 0x20, 0x60, 0x28, 0x69, 0x66, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, + 0x65, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, + 0x75, 0x6d, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, + 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x79, 0x6d, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, 0x20, 0x5b, + 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x20, 0x4f, 0x6c, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x6e, 0x27, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, + 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x60, 0x77, 0x68, 0x65, 0x72, 0x65, 0x27, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x6f, 0x72, 0x27, 0x2e, 0x20, 0x4e, + 0x65, 0x77, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x69, 0x73, + 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x60, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, + 0x3b, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, 0x65, 0x64, 0x73, 0x20, 0x69, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x60, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, 0x27, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, + 0x76, 0x61, 0x6c, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, + 0x30, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6d, 0x6f, 0x64, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, - 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, - 0x6f, 0x64, 0x79, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, - 0x65, 0x73, 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, 0x31, 0x29, 0x29, 0x0a, + 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x7b, 0x7d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, - 0x75, 0x74, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, - 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, - 0x75, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, - 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x2d, - 0x73, 0x79, 0x6d, 0x73, 0x20, 0x5b, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, - 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x48, 0x6f, 0x77, 0x20, - 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, - 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x3f, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, - 0x61, 0x6e, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x2e, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x28, - 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, - 0x31, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, - 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, - 0x69, 0x73, 0x74, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, - 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, - 0x68, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x20, 0x28, 0x69, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, + 0x63, 0x74, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x61, + 0x6e, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x73, + 0x20, 0x77, 0x65, 0x20, 0x65, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x60, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x76, 0x61, 0x6c, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x5d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x76, 0x61, 0x6c, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x32, 0x20, 0x5b, + 0x73, 0x65, 0x71, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x73, + 0x65, 0x71, 0x60, 0x20, 0x62, 0x79, 0x20, 0x32, 0x2e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x49, 0x66, 0x20, 0x60, 0x73, 0x65, 0x71, + 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6f, 0x64, 0x64, 0x20, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x72, + 0x6f, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x3a, 0x20, 0x5b, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, + 0x20, 0x35, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20, 0x5b, 0x5b, 0x31, 0x20, 0x32, + 0x5d, 0x20, 0x5b, 0x33, 0x20, 0x34, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x73, 0x20, 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x5b, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, + 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x73, 0x65, 0x71, 0x29, + 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x28, 0x2e, 0x20, 0x73, 0x65, 0x71, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x2e, 0x20, - 0x73, 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x29, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, + 0x71, 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, 0x31, 0x29, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x29, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x60, 0x6e, + 0x69, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x60, 0x6e, 0x69, 0x6c, 0x29, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x5b, 0x69, 0x20, 0x76, 0x31, 0x20, 0x28, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x73, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x5b, 0x76, 0x32, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x69, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, - 0x74, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, 0x75, - 0x6d, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x79, - 0x6d, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, - 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, 0x20, 0x5b, 0x76, 0x61, - 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x2e, 0x20, 0x53, 0x65, 0x65, - 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, - 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, - 0x61, 0x6c, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, - 0x73, 0x65, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3b, 0x3b, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x20, 0x61, - 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x67, - 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x20, - 0x65, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, - 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x2e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x60, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x76, 0x61, - 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, - 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x7b, 0x3a, 0x2d, 0x3e, 0x20, 0x2d, - 0x3e, 0x2a, 0x20, 0x3a, 0x2d, 0x3e, 0x3e, 0x20, 0x2d, 0x3e, 0x3e, 0x2a, - 0x20, 0x3a, 0x2d, 0x3f, 0x3e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x20, 0x3a, - 0x2d, 0x3f, 0x3e, 0x3e, 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, 0x0a, 0x20, - 0x20, 0x20, 0x3a, 0x64, 0x6f, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x74, 0x6f, - 0x2a, 0x20, 0x3a, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, - 0x2a, 0x20, 0x3a, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x2a, 0x0a, - 0x20, 0x20, 0x20, 0x3a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, 0x3a, 0x69, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, - 0x2a, 0x20, 0x3a, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x6c, 0x61, - 0x6d, 0x62, 0x64, 0x61, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, 0x69, - 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x70, 0x69, 0x63, 0x6b, - 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x20, 0x3a, 0x70, 0x69, 0x63, 0x6b, - 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x70, 0x69, 0x63, 0x6b, - 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2a, 0x0a, 0x20, 0x20, 0x20, - 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x2a, 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x2a, 0x20, 0x3a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, - 0x7d, 0x0a, 0x20, 0x20, 0x5d, 0x3d, 0x3d, 0x3d, 0x5d, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, - 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x5f, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, - 0x65, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, - 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, - 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x5b, 0x22, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, - 0x5f, 0x30, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, - 0x65, 0x76, 0x61, 0x6c, 0x28, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, - 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2c, 0x20, 0x7b, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x65, 0x6e, - 0x76, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x72, 0x63, - 0x2f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x5b, 0x76, + 0x31, 0x20, 0x76, 0x32, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x5f, 0x20, + 0x26, 0x20, 0x70, 0x61, 0x74, 0x73, 0x5d, 0x20, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x60, 0x28, + 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x20, 0x70, 0x61, 0x74, 0x73, 0x2a, + 0x29, 0x60, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, + 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x60, 0x67, 0x75, 0x61, + 0x72, 0x64, 0x60, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x31, + 0x20, 0x70, 0x61, 0x74, 0x32, 0x29, 0x2c, 0x20, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, 0x61, 0x74, 0x31, 0x20, + 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x28, 0x70, 0x61, + 0x74, 0x32, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x72, + 0x65, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x70, 0x61, + 0x74, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, + 0x74, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x74, 0x20, 0x60, 0x3f, 0x20, 0x28, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x29, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, + 0x6e, 0x64, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x73, 0x20, 0x60, 0x77, 0x68, 0x65, 0x72, 0x65, 0x60, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x60, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x3e, 0x20, 0x5b, + 0x70, 0x61, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70, 0x61, 0x74, 0x20, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, + 0x61, 0x74, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x28, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x31, 0x20, + 0x70, 0x61, 0x74, 0x32, 0x29, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, + 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, 0x61, 0x74, 0x31, 0x20, 0x3f, + 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x28, 0x70, 0x61, 0x74, + 0x32, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x20, 0x31, 0x29, 0x20, 0x60, 0x77, 0x68, 0x65, 0x72, 0x65, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x2e, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x32, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, + 0x2e, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x20, + 0x60, 0x6f, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x6f, 0x72, 0x20, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x5b, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x33, 0x29, 0x5d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x28, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x60, 0x3f, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x20, 0x33, 0x29, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x63, 0x6f, + 0x6e, 0x64, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, + 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x76, 0x61, + 0x6c, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x53, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x3a, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x2a, + 0x29, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x73, 0x2a, 0x29, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x73, 0x2a, 0x29, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x69, 0x65, + 0x73, 0x20, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2d, 0x32, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x5b, 0x63, 0x6f, + 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5d, 0x20, 0x28, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2d, 0x62, + 0x6f, 0x64, 0x69, 0x65, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2a, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, + 0x79, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x7b, + 0x3a, 0x2d, 0x3e, 0x20, 0x2d, 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, + 0x2d, 0x3e, 0x3e, 0x20, 0x2d, 0x3e, 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, + 0x3a, 0x2d, 0x3f, 0x3e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x0a, 0x20, 0x20, + 0x20, 0x3a, 0x2d, 0x3f, 0x3e, 0x3e, 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, + 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x3f, 0x2e, 0x20, 0x3f, 0x64, 0x6f, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x64, 0x6f, 0x74, 0x6f, 0x20, 0x64, 0x6f, + 0x74, 0x6f, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x77, + 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x69, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x6c, 0x61, 0x6d, 0x62, + 0x64, 0x61, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2a, 0x0a, 0x20, + 0x20, 0x20, 0x3a, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x0a, + 0x20, 0x20, 0x20, 0x3a, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2a, 0x0a, 0x20, 0x20, + 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, + 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, 0x0a, 0x20, 0x20, + 0x20, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x77, 0x68, 0x65, 0x72, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x5d, + 0x3d, 0x3d, 0x3d, 0x5d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, + 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, + 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, + 0x5f, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, + 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x2c, 0x20, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x73, 0x72, 0x63, 0x2f, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x66, 0x6e, + 0x6c, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x62, 0x75, 0x69, + 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6b, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x22, 0x5c, 0x32, 0x30, 0x36, 0x5c, + 0x31, 0x38, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x22, - 0x5c, 0x32, 0x30, 0x36, 0x5c, 0x31, 0x38, 0x37, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x6c, 0x61, 0x6d, 0x62, 0x64, - 0x61, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, - 0x64, 0x0a + 0x73, 0x2e, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x0a, 0x20, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a }; -unsigned int loadfennel_lua_len = 150998; +unsigned int loadfennel_lua_len = 177681; diff --git a/vendor/fennel/fennel.lua b/vendor/fennel/fennel.lua index b958fc126..9572c34cb 100644 --- a/vendor/fennel/fennel.lua +++ b/vendor/fennel/fennel.lua @@ -50,6 +50,77 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end return table.concat(spliced_source, "\n") end + local function completer(env, scope, text) + local matches = {} + local input_fragment = text:gsub(".*[%s)(]+", "") + local stop_looking_3f = false + local function add_partials(input, tbl, prefix, method_3f) + for k in utils.allpairs(tbl) do + local k0 = nil + if ((tbl == env) or (tbl == env.___replLocals___)) then + k0 = scope.unmanglings[k] + else + k0 = k + end + if ((#matches < 2000) and (type(k0) == "string") and (input == k0:sub(0, #input)) and (not method_3f or ("function" == type(tbl[k0])))) then + local function _1_() + if method_3f then + return (prefix .. ":" .. k0) + else + return (prefix .. k0) + end + end + table.insert(matches, _1_()) + end + end + return nil + end + local function descend(input, tbl, prefix, add_matches, method_3f) + local splitter = nil + if method_3f then + splitter = "^([^:]+):(.*)" + else + splitter = "^([^.]+)%.(.*)" + end + local head, tail = input:match(splitter) + local raw_head = nil + if ((tbl == env) or (tbl == env.___replLocals___)) then + raw_head = scope.manglings[head] + else + raw_head = head + end + if (type(tbl[raw_head]) == "table") then + stop_looking_3f = true + if method_3f then + return add_partials(tail, tbl[raw_head], (prefix .. head), true) + else + return add_matches(tail, tbl[raw_head], (prefix .. head)) + end + end + end + local function add_matches(input, tbl, prefix) + local prefix0 = nil + if prefix then + prefix0 = (prefix .. ".") + else + prefix0 = "" + end + if (not input:find("%.") and input:find(":")) then + return descend(input, tbl, prefix0, add_matches, true) + elseif not input:find("%.") then + return add_partials(input, tbl, prefix0) + else + return descend(input, tbl, prefix0, add_matches, false) + end + end + for _, source in ipairs({scope.specials, scope.macros, (env.___replLocals___ or {}), env, env._G}) do + add_matches(input_fragment, source) + if stop_looking_3f then + break + end + end + return matches + end local commands = {} local function command_3f(input) return input:match("^%s*,") @@ -105,16 +176,22 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return on_error("Runtime", _3_()) end end - commands.reload = function(env, read, on_values, on_error) + local function run_command(read, on_error, f) local _0_0, _1_0, _2_0 = pcall(read) if ((_0_0 == true) and (_1_0 == true) and (nil ~= _2_0)) then - local module_sym = _2_0 - return reload(tostring(module_sym), env, on_values, on_error) + local val = _2_0 + return f(val) elseif ((_0_0 == false) and true and true) then local _3fparse_ok = _1_0 - local _3fmsg = _2_0 - return on_error("Parse", (_3fmsg or _3fparse_ok)) + local _3ferr = _2_0 + return on_error("Parse", "Couldn't parse input.") + end + end + commands.reload = function(env, read, on_values, on_error) + local function _0_(_241) + return reload(tostring(_241), env, on_values, on_error) end + return run_command(read, on_error, _0_) end do end (compiler.metadata):set(commands.reload, "fnl/docstring", "Reload the specified module.") commands.reset = function(env, _, on_values) @@ -122,6 +199,114 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return on_values({"ok"}) end do end (compiler.metadata):set(commands.reset, "fnl/docstring", "Erase all repl-local scope.") + commands.complete = function(env, read, on_values, on_error, scope) + local function _0_(_241) + return on_values(completer(env, scope, tostring(_241))) + end + return run_command(read, on_error, _0_) + end + do end (compiler.metadata):set(commands.complete, "fnl/docstring", "Print all possible completions for a given input.") + local function apropos_2a(pattern, module, prefix, seen, names) + for name, module0 in pairs(module) do + if (("string" == type(name)) and (package ~= module0)) then + local _0_0 = type(module0) + if (_0_0 == "function") then + if ((prefix .. name)):match(pattern) then + table.insert(names, (prefix .. name)) + end + elseif (_0_0 == "table") then + if not seen[module0] then + local _2_ + do + local _1_0 = seen + _1_0[module0] = true + _2_ = _1_0 + end + apropos_2a(pattern, module0, (prefix .. name:gsub("%.", "/") .. "."), _2_, names) + end + end + end + end + return names + end + local function apropos(pattern) + local names = apropos_2a(pattern, package.loaded, "", {}, {}) + local tbl_0_ = {} + for _, name in ipairs(names) do + tbl_0_[(#tbl_0_ + 1)] = name:gsub("^_G%.", "") + end + return tbl_0_ + end + commands.apropos = function(env, read, on_values, on_error, scope) + local function _0_(_241) + return on_values(apropos(tostring(_241))) + end + return run_command(read, on_error, _0_) + end + do end (compiler.metadata):set(commands.apropos, "fnl/docstring", "Print all functions matching a pattern in all loaded modules.") + local function apropos_follow_path(path) + local paths = nil + do + local tbl_0_ = {} + for p in path:gmatch("[^%.]+") do + tbl_0_[(#tbl_0_ + 1)] = p + end + paths = tbl_0_ + end + local tgt = package.loaded + for _, path0 in ipairs(paths) do + local _1_ + do + local _0_0 = path0:gsub("%/", ".") + _1_ = _0_0 + end + tgt = tgt[_1_] + if (nil == tgt) then + break + end + end + return tgt + end + local function apropos_doc(pattern) + local names = {} + for _, path in ipairs(apropos(".*")) do + local tgt = apropos_follow_path(path) + if ("function" == type(tgt)) then + local _0_0 = (compiler.metadata):get(tgt, "fnl/docstring") + if (nil ~= _0_0) then + local docstr = _0_0 + if docstr:match(pattern) then + table.insert(names, path) + end + end + end + end + return names + end + commands["apropos-doc"] = function(env, read, on_values, on_error, scope) + local function _0_(_241) + return on_values(apropos_doc(tostring(_241))) + end + return run_command(read, on_error, _0_) + end + do end (compiler.metadata):set(commands["apropos-doc"], "fnl/docstring", "Print all functions that match the pattern in their docs") + local function apropos_show_docs(pattern) + for _, path in ipairs(apropos(pattern)) do + local tgt = apropos_follow_path(path) + if (("function" == type(tgt)) and (compiler.metadata):get(tgt, "fnl/docstring")) then + print(specials.doc(tgt, path)) + print() + end + end + return nil + end + commands["apropos-show-docs"] = function(env, read, _, on_error, scope) + local function _0_(_241) + return apropos_show_docs(tostring(_241)) + end + return run_command(read, on_error, _0_) + end + do end (compiler.metadata):set(commands["apropos-show-docs"], "fnl/docstring", "Print all documentations matching a pattern in function name") local function load_plugin_commands() if (utils.root and utils.root.options and utils.root.options.plugins) then for _, plugin in ipairs(utils.root.options.plugins) do @@ -136,14 +321,14 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return nil end end - local function run_command(input, read, loop, env, on_values, on_error) + local function run_command0(input, read, loop, env, on_values, on_error, scope) load_plugin_commands() local command_name = input:match(",([^%s/]+)") do local _0_0 = commands[command_name] if (nil ~= _0_0) then local command = _0_0 - command(env, read, on_values, on_error) + command(env, read, on_values, on_error, scope) else local _ = _0_0 if ("exit" ~= command_name) then @@ -155,52 +340,6 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return loop() end end - local function completer(env, scope, text) - local matches = {} - local input_fragment = text:gsub(".*[%s)(]+", "") - local function add_partials(input, tbl, prefix) - for k in utils.allpairs(tbl) do - local k0 = nil - if ((tbl == env) or (tbl == env.___replLocals___)) then - k0 = scope.unmanglings[k] - else - k0 = k - end - if ((#matches < 2000) and (type(k0) == "string") and (input == k0:sub(0, #input))) then - table.insert(matches, (prefix .. k0)) - end - end - return nil - end - local function add_matches(input, tbl, prefix) - local prefix0 = nil - if prefix then - prefix0 = (prefix .. ".") - else - prefix0 = "" - end - if not input:find("%.") then - return add_partials(input, tbl, prefix0) - else - local head, tail = input:match("^([^.]+)%.(.*)") - local raw_head = nil - if ((tbl == env) or (tbl == env.___replLocals___)) then - raw_head = scope.manglings[head] - else - raw_head = head - end - if (type(tbl[raw_head]) == "table") then - return add_matches(tail, tbl[raw_head], (prefix0 .. head)) - end - end - end - add_matches(input_fragment, (scope.specials or {})) - add_matches(input_fragment, (scope.macros or {})) - add_matches(input_fragment, (env.___replLocals___ or {})) - add_matches(input_fragment, env) - add_matches(input_fragment, (env._ENV or env._G or {})) - return matches - end local function repl(options) local old_root_options = utils.root.options local env = nil @@ -262,11 +401,11 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) reset() return loop() elseif command_3f(src_string) then - return run_command(src_string, read, loop, env, on_values, on_error) + return run_command0(src_string, read, loop, env, on_values, on_error, scope) else if parse_ok_3f then do - local _4_0, _5_0 = pcall(compiler.compile, x, {["assert-compile"] = opts["assert-compile"], ["parse-error"] = opts["parse-error"], correlate = opts.correlate, moduleName = opts.moduleName, scope = scope, source = src_string, useMetadata = opts.useMetadata}) + local _4_0, _5_0 = pcall(compiler.compile, x, {["assert-compile"] = opts["assert-compile"], ["parse-error"] = opts["parse-error"], correlate = opts.correlate, moduleName = opts.moduleName, scope = scope, source = src_string, useBitLib = opts.useBitLib, useMetadata = opts.useMetadata}) if ((_4_0 == false) and (nil ~= _5_0)) then local msg = _5_0 clear_stream() @@ -331,30 +470,76 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end end end - local function table_kv_pairs(t) + local function max_index_gap(kv) + local gap = 0 + if (#kv > 0) then + local _2_ = kv + local _3_ = _2_[1] + local i = _3_[1] + local rest = {(table.unpack or unpack)(_2_, 2)} + for _, _4_0 in ipairs(rest) do + local _5_ = _4_0 + local k = _5_[1] + if ((k - i) > gap) then + gap = (k - i) + end + i = k + end + end + return gap + end + local function fill_gaps(kv) + local missing_indexes = {} + local i = 0 + for _, _2_0 in ipairs(kv) do + local _3_ = _2_0 + local j = _3_[1] + if (512 < j) then + return true + end + i = (i + 1) + while (i < j) do + table.insert(missing_indexes, i) + i = (i + 1) + end + end + for _, k in ipairs(missing_indexes) do + table.insert(kv, k, {k}) + end + return nil + end + local function table_kv_pairs(t, options) local assoc_3f = false - local i = 1 local kv = {} local insert = table.insert for k, v in pairs(t) do - if ((type(k) ~= "number") or (k ~= i)) then + if (type(k) ~= "number") then assoc_3f = true end - i = (i + 1) insert(kv, {k, v}) end table.sort(kv, sort_keys) + if not assoc_3f then + local gap = max_index_gap(kv) + if (max_index_gap(kv) > options["max-sparse-gap"]) then + assoc_3f = true + else + if fill_gaps(kv) then + assoc_3f = true + end + end + end if (#kv == 0) then return kv, "empty" else - local function _2_() + local function _3_() if assoc_3f then return "table" else return "seq" end end - return kv, _2_() + return kv, _3_() end end local function count_table_appearances(t, appearances) @@ -380,21 +565,19 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end return seen0 end - local function detect_cycle(t, seen) - local seen0 = (seen or {}) - seen0[t] = true - for k, v in pairs(t) do - if ((type(k) == "table") and (seen0[k] or detect_cycle(k, seen0))) then - return true - end - if ((type(v) == "table") and (seen0[v] or detect_cycle(v, seen0))) then - return true + local function detect_cycle(t, seen, _3fk) + if ("table" == type(t)) then + seen[t] = true + local _2_0, _3_0 = next(t, _3fk) + if ((nil ~= _2_0) and (nil ~= _3_0)) then + local k = _2_0 + local v = _3_0 + return (seen[k] or detect_cycle(k, seen) or seen[v] or detect_cycle(v, seen) or detect_cycle(t, seen, k)) end end - return nil end local function visible_cycle_3f(t, options) - return (options["detect-cycles?"] and detect_cycle(t) and save_table(t, options.seen) and (1 < (options.appearances[t] or 0))) + return (options["detect-cycles?"] and detect_cycle(t, {}) and save_table(t, options.seen) and (1 < (options.appearances[t] or 0))) end local function table_indent(t, indent, id) local opener_length = nil @@ -405,7 +588,7 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end return (indent + opener_length) end - local pp = {} + local pp = nil local function concat_table_lines(elements, options, multiline_3f, indent, table_type, prefix) local indent_str = ("\n" .. string.rep(" ", indent)) local open = nil @@ -460,7 +643,7 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) else prefix = "" end - local elements = nil + local items = nil do local tbl_0_ = {} for _, _6_0 in pairs(kv) do @@ -469,16 +652,16 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) local v = _7_[2] local _8_ do - local k0 = pp.pp(k, options, (indent0 + 1), true) - local v0 = pp.pp(v, options, (indent0 + slength(k0) + 1)) + local k0 = pp(k, options, (indent0 + 1), true) + local v0 = pp(v, options, (indent0 + slength(k0) + 1)) multiline_3f = (multiline_3f or k0:find("\n") or v0:find("\n")) _8_ = (k0 .. " " .. v0) end tbl_0_[(#tbl_0_ + 1)] = _8_ end - elements = tbl_0_ + items = tbl_0_ end - return concat_table_lines(elements, options, multiline_3f, indent0, "table", prefix) + return concat_table_lines(items, options, multiline_3f, indent0, "table", prefix) end end local function pp_sequence(t, kv, options, indent) @@ -498,7 +681,7 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) else prefix = "" end - local elements = nil + local items = nil do local tbl_0_ = {} for _, _3_0 in pairs(kv) do @@ -507,15 +690,15 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) local v = _4_[2] local _5_ do - local v0 = pp.pp(v, options, indent0) + local v0 = pp(v, options, indent0) multiline_3f = (multiline_3f or v0:find("\n")) _5_ = v0 end tbl_0_[(#tbl_0_ + 1)] = _5_ end - elements = tbl_0_ + items = tbl_0_ end - return concat_table_lines(elements, options, multiline_3f, indent0, "seq", prefix) + return concat_table_lines(items, options, multiline_3f, indent0, "seq", prefix) end end local function concat_lines(lines, options, indent, force_multi_line_3f) @@ -557,7 +740,7 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end options["visible-cycle?"] = _2_ _ = nil - local lines, force_multi_line_3f = metamethod(t, pp.pp, options, indent) + local lines, force_multi_line_3f = metamethod(t, pp, options, indent) options["visible-cycle?"] = nil local _3_0 = type(lines) if (_3_0 == "string") then @@ -566,7 +749,7 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) return concat_lines(lines, options, indent, force_multi_line_3f) else local _0 = _3_0 - return error("Error: __fennelview metamethod must return a table of lines") + return error("__fennelview metamethod must return a table of lines") end end end @@ -595,7 +778,7 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) x0 = pp_metamethod(x, metamethod, options, indent) else local _ = _2_0 - local _4_0, _5_0 = table_kv_pairs(x) + local _4_0, _5_0 = table_kv_pairs(x, options) if (true and (_5_0 == "empty")) then local _0 = _4_0 if options["empty-as-sequence?"] then @@ -622,10 +805,24 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) return _2_0 end local function colon_string_3f(s) - return s:find("^[-%w?\\^_!$%&*+./@:|<=>]+$") + return s:find("^[-%w?^_!$%&*+./@|<=>]+$") + end + local function pp_string(str, options, indent) + local escs = nil + local _2_ + if (options["escape-newlines?"] and (#str < (options["line-length"] - indent))) then + _2_ = "\\n" + else + _2_ = "\n" + end + local function _4_(_241, _242) + return ("\\%03d"):format(_242:byte()) + end + escs = setmetatable({["\""] = "\\\"", ["\11"] = "\\v", ["\12"] = "\\f", ["\13"] = "\\r", ["\7"] = "\\a", ["\8"] = "\\b", ["\9"] = "\\t", ["\\"] = "\\\\", ["\n"] = _2_}, {__index = _4_}) + return ("\"" .. str:gsub("[%c\\\"]", escs) .. "\"") end local function make_options(t, options) - local defaults = {["detect-cycles?"] = true, ["empty-as-sequence?"] = false, ["line-length"] = 80, ["metamethod?"] = true, ["one-line?"] = false, ["utf8?"] = true, depth = 128} + local defaults = {["detect-cycles?"] = true, ["empty-as-sequence?"] = false, ["escape-newlines?"] = false, ["line-length"] = 80, ["max-sparse-gap"] = 10, ["metamethod?"] = true, ["one-line?"] = false, ["prefer-colon?"] = false, ["utf8?"] = true, depth = 128} local overrides = {appearances = count_table_appearances(t, {}), level = 0, seen = {len = 0}} for k, v in pairs((options or {})) do defaults[k] = v @@ -635,34 +832,52 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end return defaults end - pp.pp = function(x, options, indent, key_3f) + local function _2_(x, options, indent, colon_3f) local indent0 = (indent or 0) local options0 = (options or make_options(x)) - local tv = type(x) - local function _3_() - local _2_0 = getmetatable(x) - if _2_0 then - return _2_0.__fennelview + local x0 = nil + if options0.preprocess then + x0 = options0.preprocess(x, options0) + else + x0 = x + end + local tv = type(x0) + local function _5_() + local _4_0 = getmetatable(x0) + if _4_0 then + return _4_0.__fennelview else - return _2_0 + return _4_0 end end - if ((tv == "table") or ((tv == "userdata") and _3_())) then - return pp_table(x, options0, indent0) + if ((tv == "table") or ((tv == "userdata") and _5_())) then + return pp_table(x0, options0, indent0) elseif (tv == "number") then - return number__3estring(x) - elseif ((tv == "string") and key_3f and colon_string_3f(x)) then - return (":" .. x) - elseif (tv == "string") then - return string.format("%q", x) - elseif ((tv == "boolean") or (tv == "nil")) then - return tostring(x) + return number__3estring(x0) else - return ("#<" .. tostring(x) .. ">") + local function _6_() + if (colon_3f ~= nil) then + return colon_3f + elseif ("function" == type(options0["prefer-colon?"])) then + return options0["prefer-colon?"](x0) + else + return options0["prefer-colon?"] + end + end + if ((tv == "string") and colon_string_3f(x0) and _6_()) then + return (":" .. x0) + elseif (tv == "string") then + return pp_string(x0, options0, indent0) + elseif ((tv == "boolean") or (tv == "nil")) then + return tostring(x0) + else + return ("#<" .. tostring(x0) .. ">") + end end end + pp = _2_ local function view(x, options) - return pp.pp(x, make_options(x, options), 0) + return pp(x, make_options(x, options), 0) end return view end @@ -705,7 +920,28 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return setmetatable({}, {__index = _0_, __newindex = _1_, __pairs = _2_}) end local function current_global_names(env) - return utils.kvmap((env or _G), compiler["global-unmangling"]) + local mt = nil + do + local _0_0 = getmetatable(env) + if ((type(_0_0) == "table") and (nil ~= _0_0.__pairs)) then + local __pairs = _0_0.__pairs + local tbl_0_ = {} + for k, v in __pairs(env) do + local _1_0, _2_0 = k, v + if ((nil ~= _1_0) and (nil ~= _2_0)) then + local k_0_ = _1_0 + local v_0_ = _2_0 + tbl_0_[k_0_] = v_0_ + end + end + mt = tbl_0_ + elseif (_0_0 == nil) then + mt = (env or _G) + else + mt = nil + end + end + return (mt and utils.kvmap(mt, compiler["global-unmangling"])) end local function load_code(code, environment, filename) local environment0 = (environment or rawget(_G, "_ENV") or _G) @@ -737,8 +973,8 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end end - local function doc_special(name, arglist, docstring) - compiler.metadata[SPECIALS[name]] = {["fnl/arglist"] = arglist, ["fnl/docstring"] = docstring} + local function doc_special(name, arglist, docstring, body_form_3f) + compiler.metadata[SPECIALS[name]] = {["fnl/arglist"] = arglist, ["fnl/body-form?"] = body_form_3f, ["fnl/docstring"] = docstring} return nil end local function compile_do(ast, scope, parent, start) @@ -800,7 +1036,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return compile_body(nil, true, utils.expr((fname .. "(" .. fargs .. ")"), "statement")) end end - doc_special("do", {"..."}, "Evaluate multiple forms; return last value.") + doc_special("do", {"..."}, "Evaluate multiple forms; return last value.", true) SPECIALS.values = function(ast, scope, parent) local len = #ast local exprs = {} @@ -849,8 +1085,8 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function set_fn_metadata(arg_list, docstring, parent, fn_name) if utils.root.options.useMetadata then local args = nil - local function _0_(v) - return ("\"%s\""):format(deep_tostring(v)) + local function _0_(_241) + return ("\"%s\""):format(deep_tostring(_241)) end args = utils.map(arg_list, _0_) local meta_fields = {"\"fnl/arglist\"", ("{" .. table.concat(args, ", ") .. "}")} @@ -872,8 +1108,29 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return _0_, not multi, 3 else - return compiler.gensym(scope), true, 2 + return nil, true, 2 + end + end + local function compile_named_fn(ast, f_scope, f_chunk, parent, index, fn_name, local_3f, arg_name_list, arg_list, docstring) + for i = (index + 1), #ast do + compiler.compile1(ast[i], f_scope, f_chunk, {nval = (((i ~= #ast) and 0) or nil), tail = (i == #ast)}) + end + local _0_ + if local_3f then + _0_ = "local function %s(%s)" + else + _0_ = "%s = function(%s)" end + compiler.emit(parent, string.format(_0_, fn_name, table.concat(arg_name_list, ", ")), ast) + compiler.emit(parent, f_chunk, ast) + compiler.emit(parent, "end", ast) + set_fn_metadata(arg_list, docstring, parent, fn_name) + utils.hook("fn", ast, f_scope) + return utils.expr(fn_name, "sym") + end + local function compile_anonymous_fn(ast, f_scope, f_chunk, parent, index, arg_name_list, arg_list, docstring, scope) + local fn_name = compiler.gensym(scope) + return compile_named_fn(ast, f_scope, f_chunk, parent, index, fn_name, true, arg_name_list, arg_list, docstring) end SPECIALS.fn = function(ast, scope, parent) local f_scope = nil @@ -885,7 +1142,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local f_chunk = {} local fn_sym = utils["sym?"](ast[2]) local multi = (fn_sym and utils["multi-sym?"](fn_sym[1])) - local fn_name, local_fn_3f, index = get_fn_name(ast, scope, fn_sym, multi) + local fn_name, local_3f, index = get_fn_name(ast, scope, fn_sym, multi) local arg_list = compiler.assert(utils["table?"](ast[index]), "expected parameters table", ast) compiler.assert((not multi or not multi["multi-sym-method-call"]), ("unexpected multi symbol " .. tostring(fn_name)), fn_sym) local function get_arg_name(arg) @@ -904,38 +1161,44 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return compiler.assert(false, ("expected symbol for function parameter: %s"):format(tostring(arg)), ast[2]) end end - do - local arg_name_list = utils.map(arg_list, get_arg_name) - local index0, docstring = nil, nil - if ((type(ast[(index + 1)]) == "string") and ((index + 1) < #ast)) then - index0, docstring = (index + 1), ast[(index + 1)] - else - index0, docstring = index, nil - end - for i = (index0 + 1), #ast do - compiler.compile1(ast[i], f_scope, f_chunk, {nval = (((i ~= #ast) and 0) or nil), tail = (i == #ast)}) - end - local _2_ - if local_fn_3f then - _2_ = "local function %s(%s)" - else - _2_ = "%s = function(%s)" - end - compiler.emit(parent, string.format(_2_, fn_name, table.concat(arg_name_list, ", ")), ast) - compiler.emit(parent, f_chunk, ast) - compiler.emit(parent, "end", ast) - set_fn_metadata(arg_list, docstring, parent, fn_name) + local arg_name_list = utils.map(arg_list, get_arg_name) + local index0, docstring = nil, nil + if ((type(ast[(index + 1)]) == "string") and ((index + 1) < #ast)) then + index0, docstring = (index + 1), ast[(index + 1)] + else + index0, docstring = index, nil + end + if fn_name then + return compile_named_fn(ast, f_scope, f_chunk, parent, index0, fn_name, local_3f, arg_name_list, arg_list, docstring) + else + return compile_anonymous_fn(ast, f_scope, f_chunk, parent, index0, arg_name_list, arg_list, docstring, scope) end - utils.hook("fn", ast, f_scope) - return utils.expr(fn_name, "sym") end - doc_special("fn", {"name?", "args", "docstring?", "..."}, "Function syntax. May optionally include a name and docstring.\nIf a name is provided, the function will be bound in the current scope.\nWhen called with the wrong number of args, excess args will be discarded\nand lacking args will be nil, use lambda for arity-checked functions.") + doc_special("fn", {"name?", "args", "docstring?", "..."}, "Function syntax. May optionally include a name and docstring.\nIf a name is provided, the function will be bound in the current scope.\nWhen called with the wrong number of args, excess args will be discarded\nand lacking args will be nil, use lambda for arity-checked functions.", true) SPECIALS.lua = function(ast, _, parent) compiler.assert(((#ast == 2) or (#ast == 3)), "expected 1 or 2 arguments", ast) - if (ast[2] ~= nil) then + local _1_ + do + local _0_0 = utils["sym?"](ast[2]) + if _0_0 then + _1_ = utils.deref(_0_0) + else + _1_ = _0_0 + end + end + if ("nil" ~= _1_) then table.insert(parent, {ast = ast, leaf = tostring(ast[2])}) end - if (ast[3] ~= nil) then + local _2_ + do + local _1_0 = utils["sym?"](ast[3]) + if _1_0 then + _2_ = utils.deref(_1_0) + else + _2_ = _1_0 + end + end + if ("nil" ~= _2_) then return tostring(ast[3]) end end @@ -947,8 +1210,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct if special_or_macro then return ("print(%q)"):format(doc_2a(special_or_macro, target)) else - local value = tostring(compiler.compile1(ast[2], scope, parent, {nval = 1})[1]) - return ("print(require('%s').doc(%s, '%s'))"):format((utils.root.options.moduleName or "fennel"), value, tostring(ast[2])) + local _0_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local value = _0_[1] + return ("print(require('%s').doc(%s, '%s'))"):format((utils.root.options.moduleName or "fennel"), tostring(value), tostring(ast[2])) end end doc_special("doc", {"x"}, "Print the docstring and arglist for a function, macro, or special form.") @@ -1027,7 +1291,24 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return SPECIALS["do"](ast, scope, parent, opts, 3, sub_chunk, sub_scope, pre_syms) end - doc_special("let", {"[name1 val1 ... nameN valN]", "..."}, "Introduces a new scope in which a given set of local bindings are used.") + doc_special("let", {"[name1 val1 ... nameN valN]", "..."}, "Introduces a new scope in which a given set of local bindings are used.", true) + local function get_prev_line(parent) + if ("table" == type(parent)) then + return get_prev_line((parent.leaf or parent[#parent])) + else + return (parent or "") + end + end + local function disambiguate_3f(rootstr, parent) + local function _1_() + local _0_0 = get_prev_line(parent) + if (nil ~= _0_0) then + local prev_line = _0_0 + return prev_line:match("%)$") + end + end + return (rootstr:match("^{") or _1_()) + end SPECIALS.tset = function(ast, scope, parent) compiler.assert((#ast > 3), "expected table, key, and value arguments", ast) local root = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] @@ -1040,12 +1321,12 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local value = compiler.compile1(ast[#ast], scope, parent, {nval = 1})[1] local rootstr = tostring(root) local fmtstr = nil - if rootstr:match("^{") then + if disambiguate_3f(rootstr, parent) then fmtstr = "do end (%s)[%s] = %s" else fmtstr = "%s[%s] = %s" end - return compiler.emit(parent, fmtstr:format(tostring(root), table.concat(keys, "]["), tostring(value)), ast) + return compiler.emit(parent, fmtstr:format(rootstr, table.concat(keys, "]["), tostring(value)), ast) end doc_special("tset", {"tbl", "key1", "...", "keyN", "val"}, "Set the value of a table field. Can take additional keys to set\nnested values, but all parents must contain an existing table.") local function calculate_target(scope, opts) @@ -1100,7 +1381,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local cond = tostring(branch.cond) local cond_line = nil - if ((cond == "true") and branch.nested and (i == #branches)) then + if ((cond == "true") and branch.nested and (i == #branches) and not has_else_3f) then cond_line = "else" else cond_line = fstr:format(cond) @@ -1152,14 +1433,30 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end SPECIALS["if"] = if_2a doc_special("if", {"cond1", "body1", "...", "condN", "bodyN"}, "Conditional form.\nTakes any number of condition/body pairs and evaluates the first body where\nthe condition evaluates to truthy. Similar to cond in other lisps.") + local function remove_until_condition(bindings) + if ("until" == bindings[(#bindings - 1)]) then + table.remove(bindings, (#bindings - 1)) + return table.remove(bindings) + end + end + local function compile_until(condition, scope, chunk) + if condition then + local _0_ = compiler.compile1(condition, scope, chunk, {nval = 1}) + local condition_lua = _0_[1] + return compiler.emit(chunk, ("if %s then break end"):format(tostring(condition_lua)), utils.expr(condition, "expression")) + end + end SPECIALS.each = function(ast, scope, parent) compiler.assert((#ast >= 3), "expected body expression", ast[1]) local binding = compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) + local _ = compiler.assert((2 <= #binding), "expected binding and iterator", binding) + local until_condition = remove_until_condition(binding) local iter = table.remove(binding, #binding) local destructures = {} local new_manglings = {} local sub_scope = compiler["make-scope"](scope) local function destructure_binding(v) + compiler.assert(("string" ~= type(v)), ("unexpected iterator clause " .. tostring(v)), binding) if utils["sym?"](v) then return compiler["declare-local"](v, {}, sub_scope, ast, new_manglings) else @@ -1177,11 +1474,12 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.destructure(args, raw, ast, sub_scope, chunk, {declaration = true, nomulti = true, symtype = "each"}) end compiler["apply-manglings"](sub_scope, new_manglings, ast) + compile_until(until_condition, sub_scope, chunk) compile_do(ast, sub_scope, chunk, 3) compiler.emit(parent, chunk, ast) return compiler.emit(parent, "end", ast) end - doc_special("each", {"[key value (iterator)]", "..."}, "Runs the body once for each set of values provided by the given iterator.\nMost commonly used with ipairs for sequential tables or pairs for undefined\norder, but can be used with any iterator.") + doc_special("each", {"[key value (iterator)]", "..."}, "Runs the body once for each set of values provided by the given iterator.\nMost commonly used with ipairs for sequential tables or pairs for undefined\norder, but can be used with any iterator.", true) local function while_2a(ast, scope, parent) local len1 = #parent local condition = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] @@ -1202,32 +1500,35 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return compiler.emit(parent, "end", ast) end SPECIALS["while"] = while_2a - doc_special("while", {"condition", "..."}, "The classic while loop. Evaluates body until a condition is non-truthy.") + doc_special("while", {"condition", "..."}, "The classic while loop. Evaluates body until a condition is non-truthy.", true) local function for_2a(ast, scope, parent) local ranges = compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) + local until_condition = remove_until_condition(ast[2]) local binding_sym = table.remove(ast[2], 1) local sub_scope = compiler["make-scope"](scope) local range_args = {} local chunk = {} compiler.assert(utils["sym?"](binding_sym), ("unable to bind %s %s"):format(type(binding_sym), tostring(binding_sym)), ast[2]) compiler.assert((#ast >= 3), "expected body expression", ast[1]) + compiler.assert((#ranges <= 3), "unexpected arguments", ranges[4]) for i = 1, math.min(#ranges, 3) do range_args[i] = tostring(compiler.compile1(ranges[i], sub_scope, parent, {nval = 1})[1]) end compiler.emit(parent, ("for %s = %s do"):format(compiler["declare-local"](binding_sym, {}, sub_scope, ast), table.concat(range_args, ", ")), ast) + compile_until(until_condition, sub_scope, chunk) compile_do(ast, sub_scope, chunk, 3) compiler.emit(parent, chunk, ast) return compiler.emit(parent, "end", ast) end SPECIALS["for"] = for_2a - doc_special("for", {"[index start stop step?]", "..."}, "Numeric loop construct.\nEvaluates body once for each value between start and stop (inclusive).") + doc_special("for", {"[index start stop step?]", "..."}, "Numeric loop construct.\nEvaluates body once for each value between start and stop (inclusive).", true) local function native_method_call(ast, _scope, _parent, target, args) local _0_ = ast local _ = _0_[1] local _0 = _0_[2] local method_string = _0_[3] local call_string = nil - if ((target.type == "literal") or (target.type == "expression")) then + if ((target.type == "literal") or (target.type == "varg") or (target.type == "expression")) then call_string = "(%s):%s(%s)" else call_string = "%s:%s(%s)" @@ -1274,15 +1575,11 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct SPECIALS.comment = function(ast, _, parent) local els = {} for i = 2, #ast do - local function _1_() - local _0_0 = tostring(ast[i]):gsub("\n", " ") - return _0_0 - end - table.insert(els, _1_()) + table.insert(els, view(ast[i], {["one-line?"] = true})) end return compiler.emit(parent, ("-- " .. table.concat(els, " ")), ast) end - doc_special("comment", {"..."}, "Comment which will be emitted in Lua output.") + doc_special("comment", {"..."}, "Comment which will be emitted in Lua output.", true) local function hashfn_max_used(f_scope, i, max) local max0 = nil if f_scope.symmeta[("$" .. i)].used then @@ -1340,40 +1637,35 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return utils.expr(name, "sym") end doc_special("hashfn", {"..."}, "Function literal shorthand; args are either $... OR $1, $2, etc.") - local function define_arithmetic_special(name, zero_arity, unary_prefix, lua_name) - do - local padded_op = (" " .. (lua_name or name) .. " ") - local function _0_(ast, scope, parent) - local len = #ast - if (len == 1) then - compiler.assert((zero_arity ~= nil), "Expected more than 0 arguments", ast) - return utils.expr(zero_arity, "literal") + local function arithmetic_special(name, zero_arity, unary_prefix, nval, ast, scope, parent) + local _0_0 = #ast + if (_0_0 == 1) then + compiler.assert(zero_arity, "Expected more than 0 arguments", ast) + return utils.expr(zero_arity, "literal") + elseif (nil ~= _0_0) then + local len = _0_0 + local operands = {} + local padded_op = (" " .. name .. " ") + for i = 2, len do + local subexprs = compiler.compile1(ast[i], scope, parent, {nval = nval}) + utils.map(subexprs, tostring, operands) + end + if (#operands == 1) then + if unary_prefix then + return ("(" .. unary_prefix .. padded_op .. operands[1] .. ")") else - local operands = {} - for i = 2, len do - local subexprs = nil - local _1_ - if (i ~= len) then - _1_ = 1 - else - _1_ = nil - end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _1_}) - utils.map(subexprs, tostring, operands) - end - if (#operands == 1) then - if unary_prefix then - return ("(" .. unary_prefix .. padded_op .. operands[1] .. ")") - else - return operands[1] - end - else - return ("(" .. table.concat(operands, padded_op) .. ")") - end + return operands[1] end + else + return ("(" .. table.concat(operands, padded_op) .. ")") end - SPECIALS[name] = _0_ end + end + local function define_arithmetic_special(name, zero_arity, unary_prefix, lua_name) + local function _0_(...) + return arithmetic_special((lua_name or name), zero_arity, unary_prefix, 1, ...) + end + SPECIALS[name] = _0_ return doc_special(name, {"a", "b", "..."}, "Arithmetic operator; works the same as Lua but accepts more arguments.") end define_arithmetic_special("+", "0") @@ -1384,20 +1676,65 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct define_arithmetic_special("%") define_arithmetic_special("/", nil, "1") define_arithmetic_special("//", nil, "1") - define_arithmetic_special("lshift", nil, "1", "<<") - define_arithmetic_special("rshift", nil, "1", ">>") - define_arithmetic_special("band", "0", "0", "&") - define_arithmetic_special("bor", "0", "0", "|") - define_arithmetic_special("bxor", "0", "0", "~") - doc_special("lshift", {"x", "n"}, "Bitwise logical left shift of x by n bits; only works in Lua 5.3+.") - doc_special("rshift", {"x", "n"}, "Bitwise logical right shift of x by n bits; only works in Lua 5.3+.") - doc_special("band", {"x1", "x2"}, "Bitwise AND of arguments; only works in Lua 5.3+.") - doc_special("bor", {"x1", "x2"}, "Bitwise OR of arguments; only works in Lua 5.3+.") - doc_special("bxor", {"x1", "x2"}, "Bitwise XOR of arguments; only works in Lua 5.3+.") - define_arithmetic_special("or", "false") - define_arithmetic_special("and", "true") + SPECIALS["or"] = function(ast, scope, parent) + return arithmetic_special("or", "false", nil, nil, ast, scope, parent) + end + SPECIALS["and"] = function(ast, scope, parent) + return arithmetic_special("and", "true", nil, nil, ast, scope, parent) + end doc_special("and", {"a", "b", "..."}, "Boolean operator; works the same as Lua but accepts more arguments.") doc_special("or", {"a", "b", "..."}, "Boolean operator; works the same as Lua but accepts more arguments.") + local function bitop_special(native_name, lib_name, zero_arity, unary_prefix, ast, scope, parent) + if (#ast == 1) then + return compiler.assert(zero_arity, "Expected more than 0 arguments.", ast) + else + local len = #ast + local operands = {} + local padded_native_name = (" " .. native_name .. " ") + local prefixed_lib_name = ("bit." .. lib_name) + for i = 2, len do + local subexprs = nil + local _0_ + if (i ~= len) then + _0_ = 1 + else + _0_ = nil + end + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _0_}) + utils.map(subexprs, tostring, operands) + end + if (#operands == 1) then + if utils.root.options.useBitLib then + return (prefixed_lib_name .. "(" .. unary_prefix .. ", " .. operands[1] .. ")") + else + return ("(" .. unary_prefix .. padded_native_name .. operands[1] .. ")") + end + else + if utils.root.options.useBitLib then + return (prefixed_lib_name .. "(" .. table.concat(operands, ", ") .. ")") + else + return ("(" .. table.concat(operands, padded_native_name) .. ")") + end + end + end + end + local function define_bitop_special(name, zero_arity, unary_prefix, native) + local function _0_(...) + return bitop_special(native, name, zero_arity, unary_prefix, ...) + end + SPECIALS[name] = _0_ + return nil + end + define_bitop_special("lshift", nil, "1", "<<") + define_bitop_special("rshift", nil, "1", ">>") + define_bitop_special("band", "0", "0", "&") + define_bitop_special("bor", "0", "0", "|") + define_bitop_special("bxor", "0", "0", "~") + doc_special("lshift", {"x", "n"}, "Bitwise logical left shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("rshift", {"x", "n"}, "Bitwise logical right shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("band", {"x1", "x2", "..."}, "Bitwise AND of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("bor", {"x1", "x2", "..."}, "Bitwise OR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("bxor", {"x1", "x2", "..."}, "Bitwise XOR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") doc_special("..", {"a", "b", "..."}, "String concatenation operator; works the same as Lua but accepts more arguments.") local function native_comparator(op, _0_0, scope, parent) local _1_ = _0_0 @@ -1445,7 +1782,6 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct define_comparator_special("<=") define_comparator_special("=", "==") define_comparator_special("not=", "~=", "or") - SPECIALS["~="] = SPECIALS["not="] local function define_unary_special(op, realop) local function opfn(ast, scope, parent) compiler.assert((#ast == 2), "expected one argument", ast) @@ -1458,9 +1794,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct define_unary_special("not", "not ") doc_special("not", {"x"}, "Logical operator; works the same as Lua.") define_unary_special("bnot", "~") - doc_special("bnot", {"x"}, "Bitwise negation; only works in Lua 5.3+.") + doc_special("bnot", {"x"}, "Bitwise negation; only works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") define_unary_special("length", "#") doc_special("length", {"x"}, "Returns the length of a table or string.") + SPECIALS["~="] = SPECIALS["not="] SPECIALS["#"] = SPECIALS.length SPECIALS.quote = function(ast, scope, parent) compiler.assert((#ast == 2), "expected one argument") @@ -1474,8 +1811,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return compiler["do-quote"](ast[2], scope, parent, runtime) end doc_special("quote", {"x"}, "Quasiquote the following form. Only works in macro/compiler scope.") - local already_warned_3f = {} - local compile_env_warning = ("WARNING: Attempting to %s %s in compile" .. " scope.\nIn future versions of Fennel this will not" .. " be allowed without the\n--no-compiler-sandbox flag" .. " or passing a :compilerEnv globals table in options.\n") + local macro_loaded = {} + local already_warned_3f = {_G = true} + local compile_env_warning = table.concat({"WARNING: Attempting to %s %s in compile scope.", "In future versions of Fennel this will not be allowed without the", "--no-compiler-sandbox flag or passing a :compilerEnv globals table", "in the options.\n"}, "\n") local function compiler_env_warn(_, key) local v = _G[key] if (v and io and io.stderr and not already_warned_3f[key]) then @@ -1489,37 +1827,65 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct assert((mt ~= getmetatable("")), "Illegal metatable access!") return mt end - local safe_compiler_env = setmetatable({assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = pairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, xpcall = xpcall}, {__index = compiler_env_warn}) - local function make_compiler_env(ast, scope, parent) - local function _1_() + local safe_require = nil + local function safe_compiler_env(strict_3f) + local _1_ + if strict_3f then + _1_ = nil + else + _1_ = compiler_env_warn + end + return setmetatable({assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = pairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, require = safe_require, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, xpcall = xpcall}, {__index = _1_}) + end + local function combined_mt_pairs(env) + local combined = {} + local _1_ = getmetatable(env) + local __index = _1_["__index"] + if ("table" == type(__index)) then + for k, v in pairs(__index) do + combined[k] = v + end + end + for k, v in next, env, nil do + combined[k] = v + end + return next, combined, nil + end + local function make_compiler_env(ast, scope, parent, strict_3f) + local provided = nil + do + local _1_0 = utils.root.options + if ((type(_1_0) == "table") and (_1_0["compiler-env"] == "strict")) then + provided = safe_compiler_env(true) + elseif ((type(_1_0) == "table") and (nil ~= _1_0.compilerEnv)) then + local compilerEnv = _1_0.compilerEnv + provided = compilerEnv + elseif ((type(_1_0) == "table") and (nil ~= _1_0["compiler-env"])) then + local compiler_env = _1_0["compiler-env"] + provided = compiler_env + else + local _ = _1_0 + provided = safe_compiler_env(strict_3f) + end + end + local env = nil + local function _2_() return compiler.scopes.macro end - local function _2_(symbol) + local function _3_(symbol) compiler.assert(compiler.scopes.macro, "must call from macro", ast) return compiler.scopes.macro.manglings[tostring(symbol)] end - local function _3_(base) + local function _4_(base) return utils.sym(compiler.gensym((compiler.scopes.macro or scope), base)) end - local function _4_(form) + local function _5_(form) compiler.assert(compiler.scopes.macro, "must call from macro", ast) return compiler.macroexpand(form, compiler.scopes.macro) end - local _6_ - do - local _5_0 = utils.root.options - if ((type(_5_0) == "table") and (nil ~= _5_0.compilerEnv)) then - local compilerEnv = _5_0.compilerEnv - _6_ = compilerEnv - elseif ((type(_5_0) == "table") and (nil ~= _5_0["compiler-env"])) then - local compiler_env = _5_0["compiler-env"] - _6_ = compiler_env - else - local _ = _5_0 - _6_ = safe_compiler_env - end - end - return setmetatable({["assert-compile"] = compiler.assert, ["get-scope"] = _1_, ["in-scope?"] = _2_, ["list?"] = utils["list?"], ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), gensym = _3_, list = utils.list, macroexpand = _4_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, view = view}, {__index = _6_}) + env = {["assert-compile"] = compiler.assert, ["get-scope"] = _2_, ["in-scope?"] = _3_, ["list?"] = utils["list?"], ["macro-loaded"] = macro_loaded, ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), gensym = _4_, list = utils.list, macroexpand = _5_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, view = view} + env._G = env + return setmetatable(env, {__index = provided, __newindex = provided, __pairs = combined_mt_pairs}) end local cfg = string.gmatch(package.config, "([^\n]+)") local dirsep, pathsep, pathmark = (cfg() or "/"), (cfg() or ";"), (cfg() or "?") @@ -1576,26 +1942,71 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return allowed end - local function compiler_env_domodule(modname, env, _3fast) - local filename = compiler.assert(search_module(modname), (modname .. " module not found."), _3fast) - local globals = macro_globals(env, current_global_names()) - local scope = compiler["make-scope"](compiler.scopes.compiler) - return utils["fennel-module"].dofile(filename, {allowedGlobals = globals, env = env, scope = scope, useMetadata = utils.root.options.useMetadata}, modname, filename) + local function fennel_macro_searcher(module_name) + local _1_0 = search_module(module_name, utils["fennel-module"]["macro-path"]) + if (nil ~= _1_0) then + local filename = _1_0 + local function _2_(...) + return utils["fennel-module"].dofile(filename, {env = "_COMPILER"}, ...) + end + return _2_, filename + end + end + local function lua_macro_searcher(module_name) + local _1_0 = search_module(module_name, package.path) + if (nil ~= _1_0) then + local filename = _1_0 + local code = nil + do + local f = io.open(filename) + local function close_handlers_0_(ok_0_, ...) + f:close() + if ok_0_ then + return ... + else + return error(..., 0) + end + end + local function _2_() + return assert(f:read("*a")) + end + code = close_handlers_0_(xpcall(_2_, (package.loaded.fennel or debug).traceback)) + end + local chunk = load_code(code, make_compiler_env(), filename) + return chunk, filename + end + end + local macro_searchers = {lua_macro_searcher, fennel_macro_searcher} + local function search_macro_module(modname, n) + local _1_0 = macro_searchers[n] + if (nil ~= _1_0) then + local f = _1_0 + local _2_0, _3_0 = f(modname) + if ((nil ~= _2_0) and true) then + local loader = _2_0 + local _3ffilename = _3_0 + return loader, _3ffilename + else + local _ = _2_0 + return search_macro_module(modname, (n + 1)) + end + end end - local macro_loaded = {} local function metadata_only_fennel(modname) if ((modname == "fennel.macros") or (package and package.loaded and ("table" == type(package.loaded[modname])) and (package.loaded[modname].metadata == compiler.metadata))) then return {metadata = compiler.metadata} end end - safe_compiler_env.require = function(modname) - local function _1_() - local mod = compiler_env_domodule(modname, safe_compiler_env) - macro_loaded[modname] = mod - return mod + local function _1_(modname) + local function _2_() + local loader, filename = search_macro_module(modname, 1) + compiler.assert(loader, (modname .. " module not found.")) + macro_loaded[modname] = loader(modname, filename) + return macro_loaded[modname] end - return (macro_loaded[modname] or metadata_only_fennel(modname) or _1_()) + return (macro_loaded[modname] or metadata_only_fennel(modname) or _2_()) end + safe_require = _1_ local function add_macros(macros_2a, ast, scope) compiler.assert(utils["table?"](macros_2a), "expected macros to be table", ast) for k, v in pairs(macros_2a) do @@ -1604,15 +2015,30 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return nil end + local function resolve_module_name(ast, scope, parent, opts) + local filename = (ast.filename or ast[2].filename) + local module_name = utils.root.options["module-name"] + local modexpr = compiler.compile(ast[2], opts) + local modname_chunk = load_code(modexpr) + local _2_0, _3_0 = pcall(modname_chunk, module_name, filename) + if ((_2_0 == true) and (nil ~= _3_0)) then + local modname = _3_0 + return utils.expr(string.format("%q", modname), "literal") + else + local _ = _2_0 + return compiler.compile1(ast[2], scope, parent, {nval = 1})[1] + end + end SPECIALS["require-macros"] = function(ast, scope, parent, real_ast) compiler.assert((#ast == 2), "Expected one module name argument", (real_ast or ast)) - local filename = (ast[2].filename or ast.filename) - local modname_code = compiler.compile(ast[2]) - local modname = load_code(modname_code, nil, filename)(utils.root.options["module-name"], filename) - compiler.assert((type(modname) == "string"), "module name must compile to string", (real_ast or ast)) + local modexpr = resolve_module_name(ast, scope, parent, {}) + local _ = compiler.assert((modexpr.type == "literal"), "module name must compile to string", (real_ast or ast)) + local modname = load_code(("return " .. modexpr[1]))() if not macro_loaded[modname] then local env = make_compiler_env(ast, scope, parent) - macro_loaded[modname] = compiler_env_domodule(modname, env, ast) + local loader, filename = search_macro_module(modname, 1) + compiler.assert(loader, (modname .. " module not found."), ast) + macro_loaded[modname] = loader(modname, filename) end return add_macros(macro_loaded[modname], ast, scope, parent) end @@ -1651,10 +2077,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return error(..., 0) end end - local function _1_() + local function _2_() return f:read("*all"):gsub("[\13\n]*$", "") end - src = close_handlers_0_(xpcall(_1_, (package.loaded.fennel or debug).traceback)) + src = close_handlers_0_(xpcall(_2_, (package.loaded.fennel or debug).traceback)) end local ret = utils.expr(("require(\"" .. mod .. "\")"), "statement") local target = ("package.preload[%q]"):format(mod) @@ -1682,7 +2108,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end SPECIALS.include = function(ast, scope, parent, opts) compiler.assert((#ast == 2), "expected one argument", ast) - local modexpr = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] + local modexpr = resolve_module_name(ast, scope, parent, opts) if ((modexpr.type ~= "literal") or ((modexpr[1]):byte() ~= 34)) then if opts.fallback then return opts.fallback(modexpr) @@ -1691,13 +2117,18 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end else local mod = load_code(("return " .. modexpr[1]))() - local function _2_() - local _1_0 = search_module(mod) - if (nil ~= _1_0) then - local fennel_path = _1_0 + local oldmod = utils.root.options["module-name"] + local _ = nil + utils.root.options["module-name"] = mod + _ = nil + local res = nil + local function _3_() + local _2_0 = search_module(mod) + if (nil ~= _2_0) then + local fennel_path = _2_0 return include_path(ast, opts, fennel_path, mod, true) else - local _ = _1_0 + local _0 = _2_0 local lua_path = search_module(mod, package.path) if lua_path then return include_path(ast, opts, lua_path, mod, false) @@ -1708,7 +2139,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end end - return (include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _2_()) + res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and utils.expr("nil --[[SKIPPED INCLUDE]]--", "literal")) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _3_()) + utils.root.options["module-name"] = oldmod + return res end end doc_special("include", {"module-name-literal"}, "Like require but load the target module during compilation and embed it in the\nLua output. The module must be a string literal and resolvable at compile time.") @@ -1731,8 +2164,8 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct ast[1] = old_first return val end - doc_special("eval-compiler", {"..."}, "Evaluate the body at compile-time. Use the macro system instead if possible.") - return {["current-global-names"] = current_global_names, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} + doc_special("eval-compiler", {"..."}, "Evaluate the body at compile-time. Use the macro system instead if possible.", true) + return {["current-global-names"] = current_global_names, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} end package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or function(...) local utils = require("fennel.utils") @@ -1748,7 +2181,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else _0_ = 0 end - return {autogensyms = {}, depth = _0_, hashfn = (parent0 and parent0.hashfn), includes = setmetatable({}, {__index = (parent0 and parent0.includes)}), macros = setmetatable({}, {__index = (parent0 and parent0.macros)}), manglings = setmetatable({}, {__index = (parent0 and parent0.manglings)}), parent = parent0, refedglobals = setmetatable({}, {__index = (parent0 and parent0.refedglobals)}), specials = setmetatable({}, {__index = (parent0 and parent0.specials)}), symmeta = setmetatable({}, {__index = (parent0 and parent0.symmeta)}), unmanglings = setmetatable({}, {__index = (parent0 and parent0.unmanglings)}), vararg = (parent0 and parent0.vararg)} + return {autogensyms = setmetatable({}, {__index = (parent0 and parent0.autogensyms)}), depth = _0_, gensyms = setmetatable({}, {__index = (parent0 and parent0.gensyms)}), hashfn = (parent0 and parent0.hashfn), includes = setmetatable({}, {__index = (parent0 and parent0.includes)}), macros = setmetatable({}, {__index = (parent0 and parent0.macros)}), manglings = setmetatable({}, {__index = (parent0 and parent0.manglings)}), parent = parent0, refedglobals = setmetatable({}, {__index = (parent0 and parent0.refedglobals)}), specials = setmetatable({}, {__index = (parent0 and parent0.specials)}), symmeta = setmetatable({}, {__index = (parent0 and parent0.symmeta)}), unmanglings = setmetatable({}, {__index = (parent0 and parent0.unmanglings)}), vararg = (parent0 and parent0.vararg)} end local function assert_msg(ast, msg) local ast_tbl = nil @@ -1760,16 +2193,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local m = getmetatable(ast) local filename = ((m and m.filename) or ast_tbl.filename or "unknown") local line = ((m and m.line) or ast_tbl.line or "?") - local target = nil - local function _1_() - if utils["sym?"](ast_tbl[1]) then - return utils.deref(ast_tbl[1]) - else - return (ast_tbl[1] or "()") - end - end - target = tostring(_1_()) - return string.format("Compile error in '%s' %s:%s: %s", target, filename, line, msg) + local target = tostring((utils["sym?"](ast_tbl[1]) or ast_tbl[1] or "()")) + return string.format("%s:%s: Compile error in '%s': %s", filename, line, target, msg) end local function assert_compile(condition, msg, ast) if not condition then @@ -1777,7 +2202,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local source = _0_["source"] local unfriendly = _0_["unfriendly"] utils.root.reset() - if unfriendly then + if (unfriendly or not friend or not _G.io or not _G.io.read) then error(assert_msg(ast, msg), 0) else friend["assert-compile"](condition, msg, ast, source) @@ -1822,11 +2247,11 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local allowed_globals = nil - local function global_allowed(name) + local function global_allowed_3f(name) return (not allowed_globals or utils["member?"](name, allowed_globals)) end local function unique_mangling(original, mangling, scope, append) - if scope.unmanglings[mangling] then + if (scope.unmanglings[mangling] and not scope.gensyms[mangling]) then return unique_mangling(original, (original .. append), scope, (append + 1)) else return mangling @@ -1875,13 +2300,17 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end return ret end - local function gensym(scope, base) - local append, mangling = 0, ((base or "") .. "_0_") + local function next_append() + utils.root.scope["gensym-append"] = ((utils.root.scope["gensym-append"] or 0) + 1) + return ("_" .. utils.root.scope["gensym-append"] .. "_") + end + local function gensym(scope, base, _3fsuffix) + local mangling = ((base or "") .. next_append() .. (_3fsuffix or "")) while scope.unmanglings[mangling] do - mangling = ((base or "") .. "_" .. append .. "_") - append = (append + 1) + mangling = ((base or "") .. next_append() .. (_3fsuffix or "")) end scope.unmanglings[mangling] = (base or true) + scope.gensyms[mangling] = true return mangling end local function autogensym(base, scope) @@ -1893,7 +2322,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else local _ = _0_0 local function _1_() - local mangling = gensym(scope, base:sub(1, ( - 2))) + local mangling = gensym(scope, base:sub(1, ( - 2)), "auto") scope.autogensyms[base] = mangling return mangling end @@ -1905,7 +2334,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local name = utils.deref(symbol) if (io and io.stderr and name:find("&") and not already_warned[symbol]) then already_warned[symbol] = true - do end (io.stderr):write(("-- Warning: & will not be allowed in identifier names in " .. "future versions: " .. symbol.filename .. ":" .. symbol.line .. "\n")) + do end (io.stderr):write(("-- Warning: & will not be allowed in identifier names in " .. "future versions: " .. (symbol.filename or "unknown") .. ":" .. (symbol.line or "?") .. "\n")) end assert_compile(not (scope.specials[name] or scope.macros[name]), ("local %s was overshadowed by a special form or macro"):format(name), ast) return assert_compile(not utils["quoted?"](symbol), string.format("macro tried to bind %s without gensym", name), symbol) @@ -1940,7 +2369,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if (local_3f and scope.symmeta[parts[1]]) then scope.symmeta[parts[1]]["used"] = true end - assert_compile((not reference_3f or local_3f or global_allowed(parts[1])), ("unknown global in strict mode: " .. parts[1]), symbol) + assert_compile(not scope.macros[parts[1]], "tried to reference a macro at runtime", symbol) + assert_compile((not reference_3f or local_3f or ("_ENV" == parts[1]) or global_allowed_3f(parts[1])), ("unknown global in strict mode: " .. tostring(parts[1])), symbol) if (allowed_globals and not local_3f) then utils.root.scope.refedglobals[parts[1]] = true end @@ -1974,7 +2404,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local m = getmetatable(ast) return ((m and m.line and m) or (("table" == type(ast)) and ast) or {}) end - local function flatten_chunk_correlated(main_chunk) + local function flatten_chunk_correlated(main_chunk, options) local function flatten(chunk, out, last_line, file) local last_line0 = last_line if chunk.leaf then @@ -1983,7 +2413,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct for _, subchunk in ipairs(chunk) do if (subchunk.leaf or (#subchunk > 0)) then local source = ast_source(subchunk.ast) - if (file == source.file) then + if (file == source.filename) then last_line0 = math.max(last_line0, (source.line or 0)) end last_line0 = flatten(subchunk, out, last_line0, file) @@ -1993,7 +2423,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return last_line0 end local out = {} - local last = flatten(main_chunk, out, 1, main_chunk.file) + local last = flatten(main_chunk, out, 1, options.filename) for i = 1, last do if (out[i] == nil) then out[i] = "" @@ -2050,7 +2480,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function flatten(chunk, options) local chunk0 = peephole(chunk) if options.correlate then - return flatten_chunk_correlated(chunk0), {} + return flatten_chunk_correlated(chunk0, options), {} else local sm = {} local ret = flatten_chunk(sm, chunk0, options.indent, 0) @@ -2102,7 +2532,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct emit(chunk, string.format("do local _ = %s end", tostring(se)), ast) elseif (se.type == "statement") then local code = tostring(se) - emit(chunk, (((code:byte() == 40) and ("do end " .. code)) or code), ast) + local disambiguated = nil + if (code:byte() == 40) then + disambiguated = ("do end " .. code) + else + disambiguated = code + end + emit(chunk, disambiguated, ast) end end return nil @@ -2164,26 +2600,35 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function macroexpand_2a(ast, scope, once) - if not utils["list?"](ast) then - return ast + local _0_0 = nil + if utils["list?"](ast) then + _0_0 = find_macro(ast, scope, utils["multi-sym?"](ast[1])) else - local macro_2a = find_macro(ast, scope, utils["multi-sym?"](ast[1])) - if not macro_2a then - return ast - else - local old_scope = scopes.macro - local _ = nil - scopes.macro = scope - _ = nil - local ok, transformed = pcall(macro_2a, unpack(ast, 2)) - scopes.macro = old_scope - assert_compile(ok, transformed, ast) - if (once or not transformed) then - return transformed - else - return macroexpand_2a(transformed, scope) - end + _0_0 = nil + end + if (_0_0 == false) then + return ast + elseif (nil ~= _0_0) then + local macro_2a = _0_0 + local old_scope = scopes.macro + local _ = nil + scopes.macro = scope + _ = nil + local ok, transformed = nil, nil + local function _2_() + return macro_2a(unpack(ast, 2)) end + ok, transformed = xpcall(_2_, debug.traceback) + scopes.macro = old_scope + assert_compile(ok, transformed, ast) + if (once or not transformed) then + return transformed + else + return macroexpand_2a(transformed, scope) + end + else + local _ = _0_0 + return ast end end local function compile_special(ast, scope, parent, opts, special) @@ -2211,7 +2656,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function compile_function_call(ast, scope, parent, opts, compile1, len) local fargs = {} local fcallee = compile1(ast[1], scope, parent, {nval = 1})[1] - assert_compile((fcallee.type ~= "literal"), ("cannot call literal value " .. tostring(ast[1])), ast) + assert_compile((("string" == type(ast[1])) or (fcallee.type ~= "literal")), ("cannot call literal value " .. tostring(ast[1])), ast) for i = 2, len do local subexprs = nil local _0_ @@ -2230,7 +2675,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct keep_side_effects(subexprs, parent, 2, ast[i]) end end - local call = string.format("%s(%s)", tostring(fcallee), exprs1(fargs)) + local pat = nil + if ("string" == type(ast[1])) then + pat = "(%s)(%s)" + else + pat = "%s(%s)" + end + local call = string.format(pat, tostring(fcallee), exprs1(fargs)) return handle_compile_opts({utils.expr(call, "statement")}, parent, opts, ast) end local function compile_call(ast, scope, parent, opts, compile1) @@ -2245,7 +2696,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct elseif (multi_sym_parts and multi_sym_parts["multi-sym-method-call"]) then local table_with_method = table.concat({unpack(multi_sym_parts, 1, (#multi_sym_parts - 1))}, ".") local method_to_call = multi_sym_parts[#multi_sym_parts] - local new_ast = utils.list(utils.sym(":", scope), utils.sym(table_with_method, scope), method_to_call, select(2, unpack(ast))) + local new_ast = utils.list(utils.sym(":", nil, scope), utils.sym(table_with_method, nil, scope), method_to_call, select(2, unpack(ast))) return compile1(new_ast, scope, parent, opts) else return compile_function_call(ast, scope, parent, opts, compile1, len) @@ -2316,9 +2767,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct table.sort(_0_0, _1_) keys = _0_0 end - local function _1_(k) - local v = tostring(compile1(ast[k[2]], scope, parent, {nval = 1})[1]) - return string.format("%s = %s", k[1], v) + local function _1_(_2_0) + local _3_ = _2_0 + local k1 = _3_[1] + local k2 = _3_[2] + local _4_ = compile1(ast[k2], scope, parent, {nval = 1}) + local v = _4_[1] + return string.format("%s = %s", k1, tostring(v)) end utils.map(keys, _1_, buffer) end @@ -2348,8 +2803,6 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local forceglobal = _0_["forceglobal"] local forceset = _0_["forceset"] local isvar = _0_["isvar"] - local nomulti = _0_["nomulti"] - local noundef = _0_["noundef"] local symtype = _0_["symtype"] local symtype0 = ("_" .. (symtype or "dst")) local setter = nil @@ -2361,7 +2814,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local new_manglings = {} local function getname(symbol, up1) local raw = symbol[1] - assert_compile(not (nomulti and utils["multi-sym?"](raw)), ("unexpected multi symbol " .. raw), up1) + assert_compile(not (opts0.nomulti and utils["multi-sym?"](raw)), ("unexpected multi symbol " .. raw), up1) if declaration then return declare_local(symbol, nil, scope, symbol, new_manglings) else @@ -2370,7 +2823,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if ((#parts == 1) and not forceset) then assert_compile(not (forceglobal and meta), string.format("global %s conflicts with local", tostring(symbol)), symbol) assert_compile(not (meta and not meta.var), ("expected var " .. raw), symbol) - assert_compile((meta or not noundef), ("expected local " .. parts[1]), symbol) + assert_compile((meta or not opts0.noundef), ("expected local " .. parts[1]), symbol) end if forceglobal then assert_compile(not scope.symmeta[scope.unmanglings[raw]], ("global " .. raw .. " conflicts with local"), symbol) @@ -2405,6 +2858,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end if ((#parent == (plen + 1)) and parent[#parent].leaf) then parent[#parent]["leaf"] = ("local " .. parent[#parent].leaf) + elseif (init == "nil") then + table.insert(parent, (plen + 1), {ast = ast, leaf = ("local " .. lvalue)}) else table.insert(parent, (plen + 1), {ast = ast, leaf = ("local " .. lvalue .. " = " .. init)}) end @@ -2487,7 +2942,9 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct compile_top_target(left_names) if declaration then for _, sym in ipairs(left) do - scope.symmeta[utils.deref(sym)] = {var = isvar} + if utils["sym?"](sym) then + scope.symmeta[utils.deref(sym)] = {var = isvar} + end end end for _, pair in utils.stablepairs(tables) do @@ -2603,7 +3060,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function traceback(msg, start) - local msg0 = (msg or "") + local msg0 = tostring((msg or "")) if ((msg0:find("^Compile error") or msg0:find("^Parse error")) and not utils["debug-on?"]("trace")) then return msg0 else @@ -2641,9 +3098,6 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end return _0_ end - local function no() - return nil - end local function mixed_concat(t, joiner) local seen = {} local ret, s = "", "" @@ -2677,16 +3131,20 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local symstr = utils.deref(form) assert_compile(not runtime_3f, "symbols may only be used at compile time", form) if (symstr:find("#$") or symstr:find("#[:.]")) then - return string.format("sym('%s', nil, {filename=%s, line=%s})", autogensym(symstr, scope), filename, (form.line or "nil")) + return string.format("sym('%s', {filename=%s, line=%s})", autogensym(symstr, scope), filename, (form.line or "nil")) else - return string.format("sym('%s', nil, {quoted=true, filename=%s, line=%s})", symstr, filename, (form.line or "nil")) + return string.format("sym('%s', {quoted=true, filename=%s, line=%s})", symstr, filename, (form.line or "nil")) end elseif (utils["list?"](form) and utils["sym?"](form[1]) and (utils.deref(form[1]) == "unquote")) then local payload = form[2] local res = unpack(compile1(payload, scope, parent)) return res[1] elseif utils["list?"](form) then - local mapped = utils.kvmap(form, entry_transform(no, q)) + local mapped = nil + local function _0_() + return nil + end + mapped = utils.kvmap(form, entry_transform(_0_, q)) local filename = nil if form.filename then filename = string.format("%q", form.filename) @@ -2741,7 +3199,7 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( local m = getmetatable(ast) return ((m and m.line and m) or (("table" == type(ast)) and ast) or {}) end - local suggestions = {["$ and $... in hashfn are mutually exclusive"] = {"modifying the hashfn so it only contains $... or $, $1, $2, $3, etc"}, ["can't start multisym segment with a digit"] = {"removing the digit", "adding a non-digit before the digit"}, ["cannot call literal value"] = {"checking for typos", "checking for a missing function name"}, ["could not compile value of type "] = {"debugging the macro you're calling not to return a coroutine or userdata"}, ["could not read number (.*)"] = {"removing the non-digit character", "beginning the identifier with a non-digit if it is not meant to be a number"}, ["expected a function.* to call"] = {"removing the empty parentheses", "using square brackets if you want an empty table"}, ["expected binding table"] = {"placing a table here in square brackets containing identifiers to bind"}, ["expected body expression"] = {"putting some code in the body of this form after the bindings"}, ["expected each macro to be function"] = {"ensuring that the value for each key in your macros table contains a function", "avoid defining nested macro tables"}, ["expected even number of name/value bindings"] = {"finding where the identifier or value is missing"}, ["expected even number of values in table literal"] = {"removing a key", "adding a value"}, ["expected local"] = {"looking for a typo", "looking for a local which is used out of its scope"}, ["expected macros to be table"] = {"ensuring your macro definitions return a table"}, ["expected parameters"] = {"adding function parameters as a list of identifiers in brackets"}, ["expected rest argument before last parameter"] = {"moving & to right before the final identifier when destructuring"}, ["expected symbol for function parameter: (.*)"] = {"changing %s to an identifier instead of a literal value"}, ["expected var (.*)"] = {"declaring %s using var instead of let/local", "introducing a new local instead of changing the value of %s"}, ["expected vararg as last parameter"] = {"moving the \"...\" to the end of the parameter list"}, ["expected whitespace before opening delimiter"] = {"adding whitespace"}, ["global (.*) conflicts with local"] = {"renaming local %s"}, ["illegal character: (.)"] = {"deleting or replacing %s", "avoiding reserved characters like \", \\, ', ~, ;, @, `, and comma"}, ["local (.*) was overshadowed by a special form or macro"] = {"renaming local %s"}, ["macro not found in macro module"] = {"checking the keys of the imported macro module's returned table"}, ["macro tried to bind (.*) without gensym"] = {"changing to %s# when introducing identifiers inside macros"}, ["malformed multisym"] = {"ensuring each period or colon is not followed by another period or colon"}, ["may only be used at compile time"] = {"moving this to inside a macro if you need to manipulate symbols/lists", "using square brackets instead of parens to construct a table"}, ["method must be last component"] = {"using a period instead of a colon for field access", "removing segments after the colon", "making the method call, then looking up the field on the result"}, ["mismatched closing delimiter (.), expected (.)"] = {"replacing %s with %s", "deleting %s", "adding matching opening delimiter earlier"}, ["multisym method calls may only be in call position"] = {"using a period instead of a colon to reference a table's fields", "putting parens around this"}, ["unable to bind (.*)"] = {"replacing the %s with an identifier"}, ["unexpected closing delimiter (.)"] = {"deleting %s", "adding matching opening delimiter earlier"}, ["unexpected multi symbol (.*)"] = {"removing periods or colons from %s"}, ["unexpected vararg"] = {"putting \"...\" at the end of the fn parameters if the vararg was intended"}, ["unknown global in strict mode: (.*)"] = {"looking to see if there's a typo", "using the _G table instead, eg. _G.%s if you really want a global", "moving this code to somewhere that %s is in scope", "binding %s as a local in the scope of this code"}, ["unused local (.*)"] = {"fixing a typo so %s is used", "renaming the local to _%s"}, ["use of global (.*) is aliased by a local"] = {"renaming local %s", "refer to the global using _G.%s instead of directly"}} + local suggestions = {["$ and $... in hashfn are mutually exclusive"] = {"modifying the hashfn so it only contains $... or $, $1, $2, $3, etc"}, ["can't start multisym segment with a digit"] = {"removing the digit", "adding a non-digit before the digit"}, ["cannot call literal value"] = {"checking for typos", "checking for a missing function name"}, ["could not compile value of type "] = {"debugging the macro you're calling to return a list or table"}, ["could not read number (.*)"] = {"removing the non-digit character", "beginning the identifier with a non-digit if it is not meant to be a number"}, ["expected a function.* to call"] = {"removing the empty parentheses", "using square brackets if you want an empty table"}, ["expected binding and iterator"] = {"making sure you haven't omitted a local name or iterator"}, ["expected binding table"] = {"placing a table here in square brackets containing identifiers to bind"}, ["expected body expression"] = {"putting some code in the body of this form after the bindings"}, ["expected each macro to be function"] = {"ensuring that the value for each key in your macros table contains a function", "avoid defining nested macro tables"}, ["expected even number of name/value bindings"] = {"finding where the identifier or value is missing"}, ["expected even number of pattern/body pairs"] = {"checking that every pattern has a body to go with it", "adding _ before the final body"}, ["expected even number of values in table literal"] = {"removing a key", "adding a value"}, ["expected local"] = {"looking for a typo", "looking for a local which is used out of its scope"}, ["expected macros to be table"] = {"ensuring your macro definitions return a table"}, ["expected parameters"] = {"adding function parameters as a list of identifiers in brackets"}, ["expected rest argument before last parameter"] = {"moving & to right before the final identifier when destructuring"}, ["expected symbol for function parameter: (.*)"] = {"changing %s to an identifier instead of a literal value"}, ["expected var (.*)"] = {"declaring %s using var instead of let/local", "introducing a new local instead of changing the value of %s"}, ["expected vararg as last parameter"] = {"moving the \"...\" to the end of the parameter list"}, ["expected whitespace before opening delimiter"] = {"adding whitespace"}, ["global (.*) conflicts with local"] = {"renaming local %s"}, ["illegal character: (.)"] = {"deleting or replacing %s", "avoiding reserved characters like \", \\, ', ~, ;, @, `, and comma"}, ["local (.*) was overshadowed by a special form or macro"] = {"renaming local %s"}, ["macro not found in macro module"] = {"checking the keys of the imported macro module's returned table"}, ["macro tried to bind (.*) without gensym"] = {"changing to %s# when introducing identifiers inside macros"}, ["malformed multisym"] = {"ensuring each period or colon is not followed by another period or colon"}, ["may only be used at compile time"] = {"moving this to inside a macro if you need to manipulate symbols/lists", "using square brackets instead of parens to construct a table"}, ["method must be last component"] = {"using a period instead of a colon for field access", "removing segments after the colon", "making the method call, then looking up the field on the result"}, ["mismatched closing delimiter (.), expected (.)"] = {"replacing %s with %s", "deleting %s", "adding matching opening delimiter earlier"}, ["multisym method calls may only be in call position"] = {"using a period instead of a colon to reference a table's fields", "putting parens around this"}, ["tried to reference a macro at runtime"] = {"renaming the macro so as not to conflict with locals"}, ["unable to bind (.*)"] = {"replacing the %s with an identifier"}, ["unexpected arguments"] = {"removing an argument", "checking for typos"}, ["unexpected closing delimiter (.)"] = {"deleting %s", "adding matching opening delimiter earlier"}, ["unexpected iterator clause"] = {"removing an argument", "checking for typos"}, ["unexpected multi symbol (.*)"] = {"removing periods or colons from %s"}, ["unexpected vararg"] = {"putting \"...\" at the end of the fn parameters if the vararg was intended"}, ["unknown global in strict mode: (.*)"] = {"looking to see if there's a typo", "using the _G table instead, eg. _G.%s if you really want a global", "moving this code to somewhere that %s is in scope", "binding %s as a local in the scope of this code"}, ["unused local (.*)"] = {"fixing a typo so %s is used", "renaming the local to _%s"}, ["use of global (.*) is aliased by a local"] = {"renaming local %s", "refer to the global using _G.%s instead of directly"}} local unpack = (table.unpack or _G.unpack) local function suggest(msg) local suggestion = nil @@ -2773,21 +3231,19 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( f:close() return codeline, bytes end - local function read_line_from_source(source, line) - local lines, bytes, codeline = 0, 0 - for this_line, newline in string.gmatch((source .. "\n"), "(.-)(\13?\n)") do - lines = (lines + 1) - if (lines == line) then - codeline = this_line - break - end - bytes = (bytes + #newline + #this_line) + local function read_line_from_string(matcher, target_line, _3fcurrent_line, _3fbytes) + local this_line, newline = matcher() + local current_line = (_3fcurrent_line or 1) + local bytes = ((_3fbytes or 0) + #this_line + #newline) + if (target_line == current_line) then + return this_line, bytes + elseif this_line then + return read_line_from_string(matcher, target_line, (current_line + 1), bytes) end - return codeline, bytes end local function read_line(filename, line, source) if source then - return read_line_from_source(source, line) + return read_line_from_string(string.gmatch((source .. "\n"), "(.-)(\13?\n)"), line) else return read_line_from_file(filename, line) end @@ -2920,13 +3376,14 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end return r end + assert(((nil == filename) or ("string" == type(filename))), "expected filename as second argument to parser") local function parse_error(msg, byteindex_override) local _0_ = (options or utils.root.options or {}) local source = _0_["source"] local unfriendly = _0_["unfriendly"] utils.root.reset() - if unfriendly then - return error(string.format("Parse error in %s:%s: %s", (filename or "unknown"), (line or "?"), msg), 0) + if (unfriendly or not friend or not _G.io or not _G.io.read) then + return error(string.format("%s:%s: Parse error: %s", (filename or "unknown"), (line or "?"), msg), 0) else return friend["parse-error"](msg, (filename or "unknown"), (line or "?"), (byteindex_override or byteindex), source) end @@ -2940,8 +3397,17 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return nil elseif ((type(_0_0) == "table") and (nil ~= _0_0.prefix)) then local prefix = _0_0.prefix - table.remove(stack) - return dispatch(utils.list(utils.sym(prefix), v)) + local source = nil + do + local _1_0 = table.remove(stack) + _1_0["byteend"] = byteindex + source = _1_0 + end + local list = utils.list(utils.sym(prefix, source), v) + for k, v0 in pairs(source) do + list[k] = v0 + end + return dispatch(list) elseif (nil ~= _0_0) then local top = _0_0 whitespace_since_dispatch = false @@ -2977,7 +3443,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end return parse_comment(getb(), _1_()) elseif (options and options.comments) then - return dispatch(utils.comment(table.concat(contents))) + return dispatch(utils.comment(table.concat(contents), {filename = filename, line = (line - 1)})) else return b end @@ -2998,7 +3464,49 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end return dispatch(val) end + local function add_comment_at(comments, index, node) + local _0_0 = comments[index] + if (nil ~= _0_0) then + local existing = _0_0 + return table.insert(existing, node) + else + local _ = _0_0 + comments[index] = {node} + return nil + end + end + local function next_noncomment(tbl, i) + if utils["comment?"](tbl[i]) then + return next_noncomment(tbl, (i + 1)) + else + return tbl[i] + end + end + local function extract_comments(tbl) + local comments = {keys = {}, last = {}, values = {}} + while utils["comment?"](tbl[#tbl]) do + table.insert(comments.last, 1, table.remove(tbl)) + end + local last_key_3f = false + for i, node in ipairs(tbl) do + if not utils["comment?"](node) then + last_key_3f = not last_key_3f + elseif last_key_3f then + add_comment_at(comments.values, next_noncomment(tbl, i), node) + else + add_comment_at(comments.keys, next_noncomment(tbl, i), node) + end + end + for i = #tbl, 1, -1 do + if utils["comment?"](tbl[i]) then + table.remove(tbl, i) + end + end + return comments + end local function close_curly_table(tbl) + local comments = extract_comments(tbl) + local keys = {} local val = {} if ((#tbl % 2) ~= 0) then byteindex = (byteindex - 1) @@ -3010,7 +3518,10 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( tbl[i] = tostring(tbl[(i + 1)]) end val[tbl[i]] = tbl[(i + 1)] + table.insert(keys, tbl[i]) end + tbl.comments = comments + tbl.keys = keys return dispatch(val) end local function close_table(b) @@ -3018,7 +3529,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( if (top == nil) then parse_error(("unexpected closing delimiter " .. string.char(b))) end - if (top.closer ~= b) then + if (top.closer and (top.closer ~= b)) then parse_error(("mismatched closing delimiter " .. string.char(b) .. ", expected " .. string.char(top.closer))) end top.byteend = byteindex @@ -3062,13 +3573,18 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( table.remove(stack) local raw = string.char(unpack(chars)) local formatted = raw:gsub("[\7-\13]", escape_char) - local load_fn = (rawget(_G, "loadstring") or load)(("return " .. formatted)) - return dispatch(load_fn()) + local _1_0 = (rawget(_G, "loadstring") or load)(("return " .. formatted)) + if (nil ~= _1_0) then + local load_fn = _1_0 + return dispatch(load_fn()) + elseif (_1_0 == nil) then + return parse_error(("Invalid string: " .. raw)) + end end local function parse_prefix(b) - table.insert(stack, {prefix = prefixes[b]}) + table.insert(stack, {bytestart = byteindex, filename = filename, line = line, prefix = prefixes[b]}) local nextb = getb() - if whitespace_3f(nextb) then + if (whitespace_3f(nextb) or (true == delims[nextb])) then if (b ~= 35) then parse_error("invalid whitespace after quoting prefix") end @@ -3109,11 +3625,13 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( if (rawstr:match("^~") and (rawstr ~= "~=")) then return parse_error("illegal character: ~") elseif rawstr:match("%.[0-9]") then - return parse_error(("can't start multisym segment " .. "with a digit: " .. rawstr), (((byteindex - #rawstr) + rawstr:find("%.[0-9]")) + 1)) + return parse_error(("can't start multisym segment with a digit: " .. rawstr), (((byteindex - #rawstr) + rawstr:find("%.[0-9]")) + 1)) elseif (rawstr:match("[%.:][%.:]") and (rawstr ~= "..") and (rawstr ~= "$...")) then return parse_error(("malformed multisym: " .. rawstr), ((byteindex - #rawstr) + 1 + rawstr:find("[%.:][%.:]"))) elseif rawstr:match(":.+[%.:]") then - return parse_error(("method must be last component " .. "of multisym: " .. rawstr), ((byteindex - #rawstr) + rawstr:find(":.+[%.:]"))) + return parse_error(("method must be last component of multisym: " .. rawstr), ((byteindex - #rawstr) + rawstr:find(":.+[%.:]"))) + else + return rawstr end end local function parse_sym(b) @@ -3127,12 +3645,8 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return dispatch(utils.varg()) elseif rawstr:match("^:.+$") then return dispatch(rawstr:sub(2)) - elseif parse_number(rawstr) then - return nil - elseif check_malformed_sym(rawstr) then - return nil - else - return dispatch(utils.sym(rawstr, nil, {byteend = byteindex, bytestart = bytestart, filename = filename, line = line})) + elseif not parse_number(rawstr) then + return dispatch(utils.sym(check_malformed_sym(rawstr), {byteend = byteindex, bytestart = bytestart, filename = filename, line = line})) end end local function parse_loop(b) @@ -3149,7 +3663,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( parse_prefix(b) elseif (sym_char_3f(b) or (b == string.byte("~"))) then parse_sym(b) - else + elseif not utils.hook("illegal-char", b, getb, ungetb, dispatch) then parse_error(("illegal character: " .. string.char(b))) end if not b then @@ -3178,8 +3692,8 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. for k in pairs(t) do table.insert(keys, k) end - local function _0_(a, b) - return (tostring(a) < tostring(b)) + local function _0_(_241, _242) + return (tostring(_241) < tostring(_242)) end table.sort(keys, _0_) for i, k in ipairs(keys) do @@ -3208,9 +3722,8 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (type(f) == "function") then f0 = f else - local s = f - local function _0_(x) - return x[s] + local function _0_(_241) + return _241[f] end f0 = _0_ end @@ -3229,9 +3742,8 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (type(f) == "function") then f0 = f else - local s = f - local function _0_(x) - return x[s] + local function _0_(_241) + return _241[f] end f0 = _0_ end @@ -3260,7 +3772,7 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (_0_0 == x) then return true elseif (_0_0 == nil) then - return false + return nil else local _ = _0_0 return member_3f(x, tbl, ((n or 1) + 1)) @@ -3278,10 +3790,13 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. seen[next_state] = true return next_state, value else - local meta = getmetatable(t) - if (meta and meta.__index) then - t = meta.__index - return allpairs_next(t) + local _0_0 = getmetatable(t) + if ((type(_0_0) == "table") and (nil ~= _0_0.__index)) then + local __index = _0_0.__index + if ("table" == type(__index)) then + t = __index + return allpairs_next(t) + end end end end @@ -3303,10 +3818,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end return ("(" .. table.concat(map(safe, (tostring2 or tostring)), " ", 1, max) .. ")") end - local symbol_mt = {"SYMBOL", __fennelview = deref, __tostring = deref} + local function comment_view(c) + return c, true + end + local function sym_3d(a, b) + return ((deref(a) == deref(b)) and (getmetatable(a) == getmetatable(b))) + end + local function sym_3c(a, b) + return (a[1] < tostring(b)) + end + local symbol_mt = {"SYMBOL", __eq = sym_3d, __fennelview = deref, __lt = sym_3c, __tostring = deref} local expr_mt = {"EXPR", __tostring = deref} local list_mt = {"LIST", __fennelview = list__3estring, __tostring = list__3estring} - local comment_mt = {"COMMENT", __fennelview = deref, __tostring = deref} + local comment_mt = {"COMMENT", __eq = sym_3d, __fennelview = comment_view, __lt = sym_3c, __tostring = deref} local sequence_marker = {"SEQUENCE"} local vararg = setmetatable({"..."}, {"VARARG", __fennelview = deref, __tostring = deref}) local getenv = nil @@ -3321,9 +3845,9 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function list(...) return setmetatable({...}, list_mt) end - local function sym(str, scope, source) - local s = {str, scope = scope} - for k, v in pairs((source or {})) do + local function sym(str, _3fsource, _3fscope) + local s = {str, ["?scope"] = _3fscope} + for k, v in pairs((_3fsource or {})) do if (type(k) == "string") then s[k] = v end @@ -3337,8 +3861,11 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function expr(strcode, etype) return setmetatable({strcode, type = etype}, expr_mt) end - local function comment_2a(contents) - return setmetatable({contents}, comment_mt) + local function comment_2a(contents, _3fsource) + local _1_ = (_3fsource or {}) + local filename = _1_["filename"] + local line = _1_["line"] + return setmetatable({contents, filename = filename, line = line}, comment_mt) end local function varg() return vararg @@ -3355,9 +3882,6 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function sym_3f(x) return ((type(x) == "table") and (getmetatable(x) == symbol_mt) and x) end - local function table_3f(x) - return ((type(x) == "table") and (x ~= vararg) and (getmetatable(x) ~= list_mt) and (getmetatable(x) ~= symbol_mt) and x) - end local function sequence_3f(x) local mt = ((type(x) == "table") and getmetatable(x)) return (mt and (mt.sequence == sequence_marker) and x) @@ -3365,6 +3889,9 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function comment_3f(x) return ((type(x) == "table") and (getmetatable(x) == comment_mt) and x) end + local function table_3f(x) + return ((type(x) == "table") and (x ~= vararg) and (getmetatable(x) ~= list_mt) and (getmetatable(x) ~= symbol_mt) and not comment_3f(x) and x) + end local function multi_sym_3f(str) if sym_3f(str) then return multi_sym_3f(tostring(str)) @@ -3432,18 +3959,24 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return root.reset end local function hook(event, ...) + local result = nil if (root.options and root.options.plugins) then for _, plugin in ipairs(root.options.plugins) do - local _3_0 = plugin[event] - if (nil ~= _3_0) then - local f = _3_0 - f(...) + do + local _3_0 = plugin[event] + if (nil ~= _3_0) then + local f = _3_0 + result = f(...) + end + end + if (nil ~= result) then + return result end end return nil end end - return {["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["expr?"] = expr_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["sequence?"] = sequence_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, deref = deref, expr = expr, hook = hook, kvmap = kvmap, list = list, map = map, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg} + return {["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["expr?"] = expr_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";"), ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["sequence?"] = sequence_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, deref = deref, expr = expr, hook = hook, kvmap = kvmap, list = list, map = map, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg} end utils = require("fennel.utils") local parser = require("fennel.parser") @@ -3451,36 +3984,43 @@ local compiler = require("fennel.compiler") local specials = require("fennel.specials") local repl = require("fennel.repl") local view = require("fennel.view") -local function get_env(env) +local function eval_env(env, opts) if (env == "_COMPILER") then local env0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) - local mt = getmetatable(env0) - mt.__index = _G + if (opts.allowedGlobals == nil) then + opts.allowedGlobals = specials["current-global-names"](env0) + end return specials["wrap-env"](env0) else return (env and specials["wrap-env"](env)) end end -local function eval(str, options, ...) +local function eval_opts(options, str) local opts = utils.copy(options) - local _ = nil - if ((opts.allowedGlobals == nil) and not getmetatable(opts.env)) then + if (opts.allowedGlobals == nil) then opts.allowedGlobals = specials["current-global-names"](opts.env) - _ = nil - else - _ = nil end - local env = get_env(opts.env) + if (not opts.filename and not opts.source) then + opts.source = str + end + if (opts.env == "_COMPILER") then + opts.scope = compiler["make-scope"](compiler.scopes.compiler) + end + return opts +end +local function eval(str, options, ...) + local opts = eval_opts(options, str) + local env = eval_env(opts.env, opts) local lua_source = compiler["compile-string"](str, opts) local loader = nil - local function _1_(...) + local function _0_(...) if opts.filename then return ("@" .. opts.filename) else return str end end - loader = specials["load-code"](lua_source, env, _1_(...)) + loader = specials["load-code"](lua_source, env, _0_(...)) opts.filename = nil return loader(...) end @@ -3492,7 +4032,34 @@ local function dofile_2a(filename, options, ...) opts.filename = filename return eval(source, opts, ...) end -local mod = {["compile-stream"] = compiler["compile-stream"], ["compile-string"] = compiler["compile-string"], ["list?"] = utils["list?"], ["load-code"] = specials["load-code"], ["macro-loaded"] = specials["macro-loaded"], ["make-searcher"] = specials["make-searcher"], ["search-module"] = specials["search-module"], ["sequence?"] = utils["sequence?"], ["string-stream"] = parser["string-stream"], ["sym-char?"] = parser["sym-char?"], ["sym?"] = utils["sym?"], compile = compiler.compile, compile1 = compiler.compile1, compileStream = compiler["compile-stream"], compileString = compiler["compile-string"], doc = specials.doc, dofile = dofile_2a, eval = eval, gensym = compiler.gensym, granulate = parser.granulate, list = utils.list, loadCode = specials["load-code"], macroLoaded = specials["macro-loaded"], makeSearcher = specials["make-searcher"], make_searcher = specials["make-searcher"], mangle = compiler["global-mangling"], metadata = compiler.metadata, parser = parser.parser, path = utils.path, repl = repl, scope = compiler["make-scope"], searchModule = specials["search-module"], searcher = specials["make-searcher"](), sequence = utils.sequence, stringStream = parser["string-stream"], sym = utils.sym, traceback = compiler.traceback, unmangle = compiler["global-unmangling"], varg = utils.varg, version = "0.8.1", view = view} +local function syntax() + local body_3f = {"when", "with-open", "collect", "icollect", "lambda", "\206\187", "macro", "match", "accumulate"} + local binding_3f = {"collect", "icollect", "each", "for", "let", "with-open", "accumulate"} + local define_3f = {"fn", "lambda", "\206\187", "var", "local", "macro", "macros", "global"} + local out = {} + for k, v in pairs(compiler.scopes.global.specials) do + local metadata = (compiler.metadata[v] or {}) + out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = metadata["fnl/body-form?"], ["define?"] = utils["member?"](k, define_3f), ["special?"] = true} + end + for k, v in pairs(compiler.scopes.global.macros) do + out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = utils["member?"](k, body_3f), ["define?"] = utils["member?"](k, define_3f), ["macro?"] = true} + end + for k, v in pairs(_G) do + local _0_0 = type(v) + if (_0_0 == "function") then + out[k] = {["function?"] = true, ["global?"] = true} + elseif (_0_0 == "table") then + for k2, v2 in pairs(v) do + if (("function" == type(v2)) and (k ~= "_G")) then + out[(k .. "." .. k2)] = {["function?"] = true, ["global?"] = true} + end + end + out[k] = {["global?"] = true} + end + end + return out +end +local mod = {["comment?"] = utils["comment?"], ["compile-stream"] = compiler["compile-stream"], ["compile-string"] = compiler["compile-string"], ["list?"] = utils["list?"], ["load-code"] = specials["load-code"], ["macro-loaded"] = specials["macro-loaded"], ["macro-path"] = utils["macro-path"], ["macro-searchers"] = specials["macro-searchers"], ["make-searcher"] = specials["make-searcher"], ["search-module"] = specials["search-module"], ["sequence?"] = utils["sequence?"], ["string-stream"] = parser["string-stream"], ["sym-char?"] = parser["sym-char?"], ["sym?"] = utils["sym?"], comment = utils.comment, compile = compiler.compile, compile1 = compiler.compile1, compileStream = compiler["compile-stream"], compileString = compiler["compile-string"], doc = specials.doc, dofile = dofile_2a, eval = eval, gensym = compiler.gensym, granulate = parser.granulate, list = utils.list, loadCode = specials["load-code"], macroLoaded = specials["macro-loaded"], makeSearcher = specials["make-searcher"], make_searcher = specials["make-searcher"], mangle = compiler["global-mangling"], metadata = compiler.metadata, parser = parser.parser, path = utils.path, repl = repl, scope = compiler["make-scope"], searchModule = specials["search-module"], searcher = specials["make-searcher"](), sequence = utils.sequence, stringStream = parser["string-stream"], sym = utils.sym, syntax = syntax, traceback = compiler.traceback, unmangle = compiler["global-unmangling"], varg = utils.varg, version = "0.10.0", view = view} utils["fennel-module"] = mod do local builtin_macros = [===[;; This module contains all the built-in Fennel macros. Unlike all the other @@ -3557,6 +4124,19 @@ do (-?>> ,el ,(unpack els)) ,tmp))))) + (fn ?dot [tbl ...] + "Nil-safe table look up. + Same as . (dot), except will short-circuit with nil when it encounters + a nil value in any of subsequent keys." + (let [head (gensym :t) + lookups `(do (var ,head ,tbl) ,head)] + (each [_ k (ipairs [...])] + ;; Kinda gnarly to reassign in place like this, but it emits the best lua. + ;; With this impl, it emits a flat, concise, and readable set of if blocks. + (table.insert lookups (# lookups) `(if (not= nil ,head) + (set ,head (. ,head ,k))))) + lookups)) + (fn doto* [val ...] "Evaluates val and splices it into the first argument of subsequent forms." (let [name (gensym) @@ -3571,22 +4151,26 @@ do "Evaluate body for side-effects only when condition is truthy." (assert body1 "expected body") `(if ,condition - (do ,body1 ,...))) + (do + ,body1 + ,...))) (fn with-open* [closable-bindings ...] "Like `let`, but invokes (v:close) on each binding after evaluating the body. The body is evaluated inside `xpcall` so that bound values will be closed upon encountering an error before propagating it." - (let [bodyfn `(fn [] ,...) - closer `(fn close-handlers# [ok# ...] (if ok# ... - (error ... 0))) + (let [bodyfn `(fn [] + ,...) + closer `(fn close-handlers# [ok# ...] + (if ok# ... (error ... 0))) traceback `(. (or package.loaded.fennel debug) :traceback)] - (for [i 1 (# closable-bindings) 2] + (for [i 1 (length closable-bindings) 2] (assert (sym? (. closable-bindings i)) "with-open only allows symbols in bindings") (table.insert closer 4 `(: ,(. closable-bindings i) :close))) - `(let ,closable-bindings ,closer - (close-handlers# (xpcall ,bodyfn ,traceback))))) + `(let ,closable-bindings + ,closer + (close-handlers# (xpcall ,bodyfn ,traceback))))) (fn collect* [iter-tbl key-value-expr ...] "Returns a table made by running an iterator and evaluating an expression @@ -3601,8 +4185,7 @@ do {:red \"apple\" :orange \"orange\"}" (assert (and (sequence? iter-tbl) (>= (length iter-tbl) 2)) "expected iterator binding table") - (assert (not= nil key-value-expr) - "expected key-value expression") + (assert (not= nil key-value-expr) "expected key-value expression") (assert (= nil ...) "expected exactly one body expression. Wrap multiple expressions with do") `(let [tbl# {}] @@ -3622,8 +4205,7 @@ do [9 16 25]" (assert (and (sequence? iter-tbl) (>= (length iter-tbl) 2)) "expected iterator binding table") - (assert (not= nil value-expr) - "expected table value expression") + (assert (not= nil value-expr) "expected table value expression") (assert (= nil ...) "expected exactly one body expression. Wrap multiple expressions with do") `(let [tbl# []] @@ -3631,11 +4213,54 @@ do (tset tbl# (+ (length tbl#) 1) ,value-expr)) tbl#)) + (fn accumulate* [iter-tbl accum-expr ...] + "Accumulation macro. + It takes a binding table and an expression as its arguments. + In the binding table, the first symbol is bound to the second value, being an + initial accumulator variable. The rest are an iterator binding table in the + format `each` takes. + It runs through the iterator in each step of which the given expression is + evaluated, and its returned value updates the accumulator variable. + It eventually returns the final value of the accumulator variable. + + For example, + (accumulate [total 0 + _ n (pairs {:apple 2 :orange 3})] + (+ total n)) + returns + 5" + (assert (and (sequence? iter-tbl) (>= (length iter-tbl) 4)) + "expected initial value and iterator binding table") + (assert (not= nil accum-expr) "expected accumulating expression") + (assert (= nil ...) + "expected exactly one body expression. Wrap multiple expressions with do") + (let [accum-var (table.remove iter-tbl 1) + accum-init (table.remove iter-tbl 1)] + `(do (var ,accum-var ,accum-init) + (each ,iter-tbl + (set ,accum-var ,accum-expr)) + ,accum-var))) + (fn partial* [f ...] "Returns a function with all arguments partially applied to f." - (let [body (list f ...)] - (table.insert body _VARARG) - `(fn [,_VARARG] ,body))) + (assert f "expected a function to partially apply") + (let [bindings [] + args []] + (each [_ arg (ipairs [...])] + (if (or (= :number (type arg)) + (= :string (type arg)) + (= :boolean (type arg)) + (= `nil arg)) + (table.insert args arg) + (let [name (gensym)] + (table.insert bindings name) + (table.insert bindings arg) + (table.insert args name)))) + (let [body (list f (unpack args))] + (table.insert body _VARARG) + `(let ,bindings + (fn [,_VARARG] + ,body))))) (fn pick-args* [n f] "Creates a function of arity n that applies its arguments to f. @@ -3644,11 +4269,16 @@ do (pick-args 2 func) expands to (fn [_0_ _1_] (func _0_ _1_))" + (if (and _G.io _G.io.stderr) + (_G.io.stderr:write + "-- WARNING: pick-args is deprecated and will be removed in the future.\n")) (assert (and (= (type n) :number) (= n (math.floor n)) (>= n 0)) - "Expected n to be an integer literal >= 0.") + (.. "Expected n to be an integer literal >= 0, got " (tostring n))) (let [bindings []] - (for [i 1 n] (tset bindings i (gensym))) - `(fn ,bindings (,f ,(unpack bindings))))) + (for [i 1 n] + (tset bindings i (gensym))) + `(fn ,bindings + (,f ,(unpack bindings))))) (fn pick-values* [n ...] "Like the `values` special, but emits exactly n values. @@ -3659,12 +4289,14 @@ do (let [(_0_ _1_) ...] (values _0_ _1_))" (assert (and (= :number (type n)) (>= n 0) (= n (math.floor n))) - "Expected n to be an integer >= 0") - (let [let-syms (list) - let-values (if (= 1 (select :# ...)) ... `(values ,...))] - (for [i 1 n] (table.insert let-syms (gensym))) + (.. "Expected n to be an integer >= 0, got " (tostring n))) + (let [let-syms (list) + let-values (if (= 1 (select "#" ...)) ... `(values ,...))] + (for [i 1 n] + (table.insert let-syms (gensym))) (if (= n 0) `(values) - `(let [,let-syms ,let-values] (values ,(unpack let-syms)))))) + `(let [,let-syms ,let-values] + (values ,(unpack let-syms)))))) (fn lambda* [...] "Function literal with arity checking. @@ -3674,23 +4306,25 @@ do has-internal-name? (sym? (. args 1)) arglist (if has-internal-name? (. args 2) (. args 1)) docstring-position (if has-internal-name? 3 2) - has-docstring? (and (> (# args) docstring-position) + has-docstring? (and (> (length args) docstring-position) (= :string (type (. args docstring-position)))) arity-check-position (- 4 (if has-internal-name? 0 1) (if has-docstring? 0 1)) - empty-body? (< (# args) arity-check-position)] + empty-body? (< (length args) arity-check-position)] (fn check! [a] (if (table? a) (each [_ a (pairs a)] (check! a)) (let [as (tostring a)] - (and (not (as:match "^?")) (not= as "&") (not= as "_") (not= as "..."))) + (and (not (as:match "^?")) (not= as "&") (not= as "_") + (not= as "..."))) (table.insert args arity-check-position `(assert (not= nil ,a) (string.format "Missing argument %s on %s:%s" ,(tostring a) - ,(or a.filename "unknown") + ,(or a.filename :unknown) ,(or a.line "?")))))) + (assert (= :table (type arglist)) "expected arg list") (each [_ a (ipairs arglist)] (check! a)) @@ -3702,7 +4336,7 @@ do "Define a single macro." (assert (sym? name) "expected symbol for macro name") (local args [...]) - `(macros { ,(tostring name) (fn ,(unpack args))})) + `(macros {,(tostring name) (fn ,(unpack args))})) (fn macrodebug* [form return?] "Print the resulting form after performing macroexpansion. @@ -3716,9 +4350,9 @@ do Example: (import-macros mymacros :my-macros ; bind to symbol {:macro1 alias : macro2} :proj.macros) ; import by name" - (assert (and binding1 module-name1 (= 0 (% (select :# ...) 2))) + (assert (and binding1 module-name1 (= 0 (% (select "#" ...) 2))) "expected even number of binding/modulename pairs") - (for [i 1 (select :# binding1 module-name1 ...) 2] + (for [i 1 (select "#" binding1 module-name1 ...) 2] (let [(binding modname) (select i binding1 module-name1 ...) ;; generate a subscope of current scope, use require-macros ;; to bring in macro module. after that, we just copy the @@ -3728,10 +4362,7 @@ do (_SPECIALS.require-macros `(require-macros ,modname) subscope {} ast) (if (sym? binding) ;; bind whole table of macros to table bound to symbol - (do (tset scope.macros (. binding 1) {}) - (each [k v (pairs subscope.macros)] - (tset (. scope.macros (. binding 1)) k v))) - + (tset scope.macros (. binding 1) (. macro-loaded modname)) ;; 1-level table destructuring for importing individual macros (table? binding) (each [macro-name [import-key] (pairs binding)] @@ -3758,16 +4389,26 @@ do (let [condition `(and (= (type ,val) :table)) bindings []] (each [k pat (pairs pattern)] - (if (and (sym? pat) (= "&" (tostring pat))) - (do (assert (not (. pattern (+ k 2))) - "expected rest argument before last parameter") - (table.insert bindings (. pattern (+ k 1))) - (table.insert bindings [`(select ,k ((or table.unpack - _G.unpack) - ,val))])) - (and (= :number (type k)) - (= "&" (tostring (. pattern (- k 1))))) - nil ; don't process the pattern right after &; already got it + (if (= pat `&) + (do + (assert (= nil (. pattern (+ k 2))) + "expected & rest argument before last parameter") + (table.insert bindings (. pattern (+ k 1))) + (table.insert bindings + [`(select ,k ((or table.unpack _G.unpack) ,val))])) + (= k `&as) + (do + (table.insert bindings pat) + (table.insert bindings val)) + (and (= :number (type k)) (= `&as pat)) + (do + (assert (= nil (. pattern (+ k 2))) + "expected &as argument before last parameter") + (table.insert bindings (. pattern (+ k 1))) + (table.insert bindings val)) + ;; don't process the pattern right after &/&as; already got it + (or (not= :number (type k)) (and (not= `&as (. pattern (- k 1))) + (not= `& (. pattern (- k 1))))) (let [subval `(. ,val ,k) (subcondition subbindings) (match-pattern [subval] pat unifications)] @@ -3785,11 +4426,9 @@ do ;; of vals) or we're not, in which case we only care about the first one. (let [[val] vals] (if (or (and (sym? pattern) ; unification with outer locals (or nil) - (not= :_ (tostring pattern)) ; never unify _ - (or (in-scope? pattern) - (= :nil (tostring pattern)))) - (and (multi-sym? pattern) - (in-scope? (. (multi-sym? pattern) 1)))) + (not= "_" (tostring pattern)) ; never unify _ + (or (in-scope? pattern) (= :nil (tostring pattern)))) + (and (multi-sym? pattern) (in-scope? (. (multi-sym? pattern) 1)))) (values `(= ,val ,pattern) []) ;; unify a local we've seen already (and (sym? pattern) (. unifications (tostring pattern))) @@ -3798,18 +4437,16 @@ do (sym? pattern) (let [wildcard? (: (tostring pattern) :find "^_")] (if (not wildcard?) (tset unifications (tostring pattern) val)) - (values (if (or wildcard? (string.find (tostring pattern) "^?")) - true `(not= ,(sym :nil) ,val)) - [pattern val])) + (values (if (or wildcard? (string.find (tostring pattern) "^?")) true + `(not= ,(sym :nil) ,val)) [pattern val])) ;; guard clause - (and (list? pattern) (sym? (. pattern 2)) (= :? (tostring (. pattern 2)))) + (and (list? pattern) (= (. pattern 2) `?)) (let [(pcondition bindings) (match-pattern vals (. pattern 1) unifications) - condition `(and ,pcondition)] - (for [i 3 (# pattern)] ; splice in guard clauses - (table.insert condition (. pattern i))) - (values `(let ,bindings ,condition) bindings)) - + condition `(and ,(unpack pattern 3))] + (values `(and ,pcondition + (let ,bindings + ,condition)) bindings)) ;; multi-valued patterns (represented as lists) (list? pattern) (match-values vals pattern unifications match-pattern) @@ -3822,42 +4459,128 @@ do (fn match-condition [vals clauses] "Construct the actual `if` AST for the given match values and clauses." (if (not= 0 (% (length clauses) 2)) ; treat odd final clause as default - (table.insert clauses (length clauses) (sym :_))) + (table.insert clauses (length clauses) (sym "_"))) (let [out `(if)] (for [i 1 (length clauses) 2] (let [pattern (. clauses i) body (. clauses (+ i 1)) (condition bindings) (match-pattern vals pattern {})] (table.insert out condition) - (table.insert out `(let ,bindings ,body)))) + (table.insert out `(let ,bindings + ,body)))) out)) (fn match-val-syms [clauses] "How many multi-valued clauses are there? return a list of that many gensyms." (let [syms (list (gensym))] (for [i 1 (length clauses) 2] - (if (list? (. clauses i)) - (each [valnum (ipairs (. clauses i))] - (if (not (. syms valnum)) - (tset syms valnum (gensym)))))) + (let [clause (if (and (list? (. clauses i)) (= `? (. clauses i 2))) + (. clauses i 1) + (. clauses i))] + (if (list? clause) + (each [valnum (ipairs clause)] + (if (not (. syms valnum)) + (tset syms valnum (gensym))))))) syms)) (fn match* [val ...] - "Perform pattern matching on val. See reference for details." + ;; Old implementation of match macro, which doesn't directly support + ;; `where' and `or'. New syntax is implemented in `match-where', + ;; which simply generates old syntax and feeds it to `match*'. (let [clauses [...] vals (match-val-syms clauses)] + (assert (= 0 (math.fmod (length clauses) 2)) + "expected even number of pattern/body pairs") ;; protect against multiple evaluation of the value, bind against as ;; many values as we ever match against in the clauses. - (list `let [vals val] - (match-condition vals clauses)))) + (list `let [vals val] (match-condition vals clauses)))) + + ;; Construction of old match syntax from new syntax + + (fn partition-2 [seq] + ;; Partition `seq` by 2. + ;; If `seq` has odd amount of elements, the last one is dropped. + ;; + ;; Input: [1 2 3 4 5] + ;; Output: [[1 2] [3 4]] + (let [firsts [] + seconds [] + res []] + (for [i 1 (length seq) 2] + (let [first (. seq i) + second (. seq (+ i 1))] + (table.insert firsts (if (not= nil first) first `nil)) + (table.insert seconds (if (not= nil second) second `nil)))) + (each [i v1 (ipairs firsts)] + (let [v2 (. seconds i)] + (if (not= nil v2) + (table.insert res [v1 v2])))) + res)) + + (fn transform-or [[_ & pats] guards] + ;; Transforms `(or pat pats*)` lists into match `guard` patterns. + ;; + ;; (or pat1 pat2), guard => [(pat1 ? guard) (pat2 ? guard)] + (let [res []] + (each [_ pat (ipairs pats)] + (table.insert res (list pat `? (unpack guards)))) + res)) + + (fn transform-cond [cond] + ;; Transforms `where` cond into sequence of `match` guards. + ;; + ;; pat => [pat] + ;; (where pat guard) => [(pat ? guard)] + ;; (where (or pat1 pat2) guard) => [(pat1 ? guard) (pat2 ? guard)] + (if (and (list? cond) (= (. cond 1) `where)) + (let [second (. cond 2)] + (if (and (list? second) (= (. second 1) `or)) + (transform-or second [(unpack cond 3)]) + :else + [(list second `? (unpack cond 3))])) + :else + [cond])) + + (fn match-where [val ...] + "Perform pattern matching on val. See reference for details. + + Syntax: + + (match data-expression + pattern body + (where pattern guard guards*) body + (where (or pattern patterns*) guard guards*) body)" + (let [conds-bodies (partition-2 [...]) + else-branch (if (not= 0 (% (select "#" ...) 2)) + (select (select "#" ...) ...)) + match-body []] + (each [_ [cond body] (ipairs conds-bodies)] + (each [_ cond (ipairs (transform-cond cond))] + (table.insert match-body cond) + (table.insert match-body body))) + (if else-branch + (table.insert match-body else-branch)) + (match* val (unpack match-body)))) - {:-> ->* :->> ->>* :-?> -?>* :-?>> -?>>* - :doto doto* :when when* :with-open with-open* - :collect collect* :icollect icollect* - :partial partial* :lambda lambda* - :pick-args pick-args* :pick-values pick-values* - :macro macro* :macrodebug macrodebug* :import-macros import-macros* - :match match*} + {:-> ->* + :->> ->>* + :-?> -?>* + :-?>> -?>>* + :?. ?dot + :doto doto* + :when when* + :with-open with-open* + :collect collect* + :icollect icollect* + :accumulate accumulate* + :partial partial* + :lambda lambda* + :pick-args pick-args* + :pick-values pick-values* + :macro macro* + :macrodebug macrodebug* + :import-macros import-macros* + :match match-where} ]===] local module_name = "fennel.macros" local _ = nil From b2a72d466740e61a6b96424f04dc1faa5a5bf8a4 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 29 Aug 2021 11:53:09 +0300 Subject: [PATCH 024/379] #509: the mouse cursor renders on the studio stage --- build/assets/config.tic.dat | 2 +- config.lua | 10 +- src/studio/config.c | 1 - src/studio/studio.c | 48 +++++- src/studio/system.h | 2 - src/system/sdl/main.c | 290 ++++-------------------------------- 6 files changed, 86 insertions(+), 267 deletions(-) diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 94b1351a9..97a520e0d 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4d, 0x73, 0x1b, 0xc9, 0x75, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0xd7, 0xa1, 0x7d, 0x4d, 0xd5, 0xce, 0x62, 0x0f, 0x01, 0x48, 0x00, 0x24, 0x01, 0x92, 0xb5, 0x89, 0x88, 0x72, 0x71, 0x49, 0x48, 0x64, 0x59, 0x24, 0x55, 0x24, 0xb5, 0x72, 0xca, 0xe5, 0x62, 0x40, 0x60, 0x40, 0x22, 0x86, 0x00, 0xd6, 0x00, 0x14, 0xc8, 0xdd, 0xa8, 0x2a, 0x47, 0x1d, 0x72, 0xc8, 0xd5, 0x7b, 0xda, 0x24, 0x97, 0x98, 0xa5, 0x43, 0x3e, 0xfe, 0x40, 0x4b, 0x4a, 0x9c, 0xd8, 0xe9, 0x20, 0xde, 0x38, 0xdf, 0x31, 0x45, 0x3b, 0xb6, 0xf3, 0x09, 0x4d, 0x76, 0xe3, 0x7c, 0x27, 0x55, 0x9b, 0xf7, 0xba, 0x7b, 0x66, 0x7a, 0x66, 0x7a, 0x86, 0xd2, 0x5a, 0xb6, 0xb7, 0x18, 0xf4, 0xb0, 0xd5, 0xd3, 0xfd, 0xfa, 0xbd, 0x7e, 0xdf, 0xd3, 0xd3, 0x83, 0xd2, 0xb8, 0x61, 0x18, 0xcf, 0xbd, 0xf3, 0xb2, 0x31, 0x60, 0x50, 0xee, 0xde, 0xbd, 0x7b, 0xef, 0xe4, 0xe4, 0xe4, 0x1e, 0xb6, 0xd0, 0xbd, 0xc7, 0xa8, 0x57, 0x19, 0x1b, 0x3a, 0x77, 0xef, 0x32, 0xe7, 0xe4, 0x84, 0x3a, 0x77, 0x7f, 0x9d, 0x3a, 0xec, 0x1e, 0x65, 0xf4, 0x1e, 0xa5, 0x6e, 0xe5, 0xf8, 0xe3, 0xe3, 0xe3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x73, 0x2b, 0xe2, 0x8f, 0x8f, 0x33, 0x27, 0x9d, 0xa6, 0xce, 0xf8, 0x2b, 0x80, 0x9f, 0xa3, 0x0e, 0x15, 0x75, 0x48, 0x73, 0x06, 0xe3, 0xf8, 0x80, 0xbb, 0x50, 0x2a, 0x95, 0x16, 0xb0, 0x85, 0xee, 0x02, 0x81, 0x0a, 0xb8, 0x0b, 0x12, 0x3f, 0x9d, 0x66, 0x4e, 0xa9, 0x44, 0x9d, 0x74, 0x11, 0xf0, 0x17, 0xa8, 0x43, 0xa0, 0xd2, 0x05, 0xc0, 0x5f, 0x90, 0xf8, 0xfd, 0x7e, 0xbf, 0xd5, 0x68, 0x34, 0x5a, 0xd8, 0x42, 0x97, 0x57, 0x62, 0x10, 0x6c, 0x11, 0xbf, 0xdf, 0x67, 0x4e, 0xa3, 0x41, 0x9d, 0xfe, 0x1e, 0xe0, 0xb7, 0x80, 0x66, 0x8b, 0x52, 0x03, 0x2a, 0xb6, 0x5f, 0x3b, 0x3d, 0x7d, 0xf1, 0x14, 0xcb, 0xe3, 0x47, 0xa7, 0xa7, 0x8e, 0x73, 0xfa, 0xd8, 0x71, 0x1e, 0x61, 0x17, 0xfe, 0x79, 0xfc, 0x4d, 0xc7, 0x79, 0xc9, 0x85, 0xf3, 0x71, 0x80, 0xf3, 0x79, 0x11, 0xf8, 0x23, 0x89, 0x2f, 0x5b, 0xe8, 0x07, 0xe0, 0x8f, 0x25, 0xfd, 0xc7, 0x12, 0xff, 0xb1, 0x8f, 0xff, 0x73, 0x8d, 0xc6, 0x8f, 0x35, 0x6e, 0xef, 0x35, 0x1a, 0x7b, 0xb7, 0x45, 0xed, 0xf7, 0x79, 0x0b, 0x23, 0xb7, 0x0f, 0xfa, 0xfd, 0x17, 0xcc, 0x74, 0xfa, 0x63, 0xe9, 0xf1, 0x57, 0xd2, 0xe9, 0x57, 0x3e, 0x99, 0x56, 0x5b, 0xb8, 0xfb, 0xe4, 0x4f, 0x8c, 0x8f, 0x3f, 0xf7, 0xce, 0xc9, 0x49, 0xea, 0xe4, 0x4b, 0x6f, 0x9f, 0xf0, 0xfa, 0xf6, 0x97, 0x4e, 0xdc, 0x7b, 0xb8, 0x7b, 0xfb, 0x97, 0xbf, 0xf8, 0xc5, 0xb1, 0xe9, 0x52, 0xe9, 0x52, 0xa9, 0xf8, 0x6a, 0x89, 0xd7, 0x57, 0xd3, 0xa0, 0x65, 0x6c, 0x8b, 0xa5, 0x22, 0xfc, 0x8b, 0xb4, 0xb9, 0xbd, 0xd1, 0xf6, 0xfc, 0xfa, 0x2a, 0xbf, 0xff, 0x25, 0xf0, 0x03, 0x66, 0x50, 0xd4, 0xed, 0x80, 0xdd, 0x33, 0x18, 0xd8, 0x7e, 0x78, 0x0f, 0xec, 0x7f, 0x22, 0x2b, 0xfa, 0x83, 0x41, 0x87, 0x0e, 0x63, 0x8e, 0xc3, 0xed, 0x8d, 0xb6, 0x4f, 0x3f, 0x80, 0x16, 0xaf, 0x74, 0xfa, 0x27, 0xc1, 0x0f, 0x3c, 0xfc, 0x1c, 0xa5, 0x60, 0x7b, 0x5e, 0x73, 0x69, 0xca, 0xb8, 0x1f, 0x8c, 0xfb, 0xf8, 0xdc, 0xde, 0x68, 0xfb, 0x87, 0x0f, 0x1f, 0x2e, 0x94, 0x16, 0x16, 0xf0, 0x1e, 0x69, 0x78, 0xf8, 0x0b, 0x94, 0x82, 0xed, 0xe9, 0x43, 0xa8, 0x0b, 0x25, 0xca, 0xb8, 0x1f, 0xa4, 0x7d, 0x7c, 0x6e, 0x6b, 0xb4, 0x7d, 0x03, 0xdb, 0x2f, 0xf3, 0xfb, 0x5f, 0x00, 0x3f, 0xf0, 0xf0, 0x5b, 0x06, 0x03, 0xdb, 0x0f, 0x5b, 0x60, 0xff, 0x86, 0xac, 0xe8, 0x0f, 0x2e, 0x3e, 0x84, 0x81, 0x11, 0xe7, 0x03, 0x38, 0xae, 0xc2, 0xc3, 0x3e, 0x10, 0x84, 0x47, 0x7d, 0x20, 0x00, 0xd7, 0xf8, 0x80, 0x0b, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0x38, 0xc2, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0xae, 0x8d, 0x5f, 0x5e, 0xd2, 0xb9, 0x1c, 0x7b, 0xa0, 0x8b, 0x5f, 0x80, 0x83, 0x3d, 0xa1, 0x3e, 0x80, 0x6a, 0x3c, 0x83, 0xb2, 0x77, 0xc3, 0x7a, 0xc1, 0xf8, 0x01, 0x15, 0x74, 0xae, 0x48, 0x65, 0x84, 0x57, 0x50, 0x7f, 0x09, 0x4b, 0x04, 0xfe, 0x8d, 0x17, 0xbd, 0x39, 0xa5, 0x4b, 0x86, 0xc1, 0xeb, 0xf7, 0x3e, 0xf8, 0x80, 0xb7, 0x5f, 0x7f, 0xf1, 0xb4, 0xa4, 0x16, 0x17, 0xae, 0xce, 0x53, 0x8a, 0xf1, 0x11, 0x2f, 0x7e, 0xfc, 0x62, 0xfb, 0x80, 0x45, 0xe3, 0xd7, 0xc0, 0x98, 0x1d, 0x42, 0xec, 0x72, 0x1f, 0x08, 0xc7, 0xef, 0xb3, 0xe0, 0xe1, 0xbd, 0x0f, 0x3e, 0x30, 0x46, 0x65, 0x54, 0x46, 0xe5, 0x47, 0x54, 0x08, 0x11, 0x15, 0xb2, 0x39, 0x25, 0x8c, 0x57, 0xb5, 0x50, 0x46, 0x00, 0x04, 0x95, 0x62, 0x56, 0xc0, 0x49, 0x2c, 0x94, 0x64, 0x11, 0x0e, 0x17, 0x13, 0xb8, 0xd8, 0x06, 0x09, 0x00, 0x6d, 0x66, 0x88, 0x71, 0x26, 0xfb, 0x01, 0x7c, 0x31, 0xc6, 0xe1, 0x72, 0x6e, 0x70, 0x7d, 0x26, 0xe8, 0xbb, 0x6b, 0x30, 0x12, 0x59, 0x1f, 0xf9, 0x17, 0xf8, 0x86, 0xa8, 0x2e, 0x08, 0x92, 0x78, 0x5c, 0xf5, 0xd9, 0x53, 0xe8, 0xe3, 0x45, 0x34, 0xf2, 0x51, 0x77, 0x6d, 0xc6, 0xef, 0x83, 0xe2, 0xf9, 0x3a, 0xd3, 0xe9, 0x4f, 0xc8, 0x44, 0x85, 0xee, 0xb8, 0xfe, 0xc2, 0xfc, 0xc3, 0x7c, 0x42, 0x79, 0xd5, 0xe2, 0x33, 0x02, 0xaa, 0x67, 0x5e, 0xc5, 0x7e, 0xc0, 0x7c, 0x94, 0x20, 0x4b, 0x04, 0x5a, 0x82, 0x2d, 0xa5, 0x41, 0xb8, 0xc7, 0xb7, 0x6b, 0x1f, 0x83, 0x6a, 0xec, 0xcb, 0x44, 0xe5, 0x36, 0x62, 0x1a, 0x27, 0xa1, 0x7e, 0x8d, 0xd8, 0x57, 0xca, 0x48, 0xa5, 0xfd, 0xc2, 0xbb, 0x02, 0x09, 0x43, 0xff, 0x31, 0x5c, 0x1b, 0xeb, 0xfc, 0x87, 0xd3, 0xd6, 0xe1, 0x87, 0xfc, 0x83, 0x46, 0xfd, 0x43, 0xd7, 0x2a, 0x13, 0x40, 0x49, 0xa8, 0x5d, 0xfc, 0x43, 0x47, 0x66, 0x51, 0xff, 0x72, 0xed, 0x2b, 0xdb, 0x88, 0xf4, 0x5c, 0x2f, 0x1a, 0xde, 0x54, 0x1e, 0x19, 0xd1, 0xe2, 0xe2, 0xe2, 0x52, 0x6f, 0x84, 0xc7, 0x90, 0x11, 0x94, 0xdf, 0xf5, 0x27, 0xd7, 0x2e, 0x34, 0xb2, 0xad, 0xc2, 0x75, 0xa9, 0xf0, 0x71, 0x8d, 0xfb, 0x78, 0xf8, 0x34, 0x06, 0x5f, 0xf5, 0x5f, 0x57, 0xc7, 0x11, 0xfa, 0x44, 0xca, 0x47, 0x24, 0xbf, 0x21, 0xf6, 0x99, 0x8c, 0x33, 0x16, 0x05, 0x7b, 0x7a, 0x97, 0x36, 0xa6, 0x1a, 0xfd, 0xba, 0x7c, 0xb9, 0x35, 0xa2, 0x3b, 0x99, 0x5f, 0x04, 0x2f, 0x46, 0xc4, 0x3f, 0x0d, 0xdf, 0x43, 0xa2, 0xfe, 0x47, 0x7c, 0x1a, 0xbc, 0x8d, 0xe8, 0x07, 0xab, 0xcc, 0x5f, 0x54, 0xe8, 0x30, 0x36, 0x3e, 0x58, 0x30, 0x7f, 0x51, 0x91, 0x43, 0xdc, 0x01, 0xe2, 0xdd, 0x53, 0x65, 0x3c, 0x46, 0x6d, 0xaa, 0xfb, 0xb9, 0x35, 0xce, 0x75, 0x68, 0x9c, 0x6b, 0x29, 0x7e, 0xa5, 0xe6, 0x2c, 0x35, 0xbf, 0x25, 0xfa, 0x26, 0x35, 0x64, 0xee, 0x95, 0xa1, 0xc7, 0xdc, 0x7c, 0xab, 0x31, 0x2d, 0x8b, 0x9a, 0x18, 0x32, 0x25, 0x81, 0xac, 0x43, 0x98, 0x7a, 0xc9, 0xbe, 0x9a, 0x5f, 0xa1, 0x8b, 0xd9, 0xcb, 0xc0, 0x36, 0x90, 0x5f, 0x65, 0x6c, 0x63, 0x86, 0x22, 0xd0, 0x21, 0x9e, 0x0d, 0x89, 0xa7, 0x7b, 0x2e, 0x83, 0xe2, 0x1b, 0xc1, 0x18, 0x24, 0x2e, 0xf3, 0x5c, 0x4e, 0x5c, 0x96, 0xa8, 0x2e, 0xcc, 0x88, 0x1f, 0x77, 0xee, 0x73, 0x8c, 0xf8, 0xba, 0x20, 0x84, 0x10, 0x49, 0x25, 0xd8, 0xca, 0x71, 0xd5, 0x79, 0xa8, 0x60, 0x1c, 0x04, 0x61, 0x3c, 0x4d, 0x8c, 0xca, 0xa8, 0x5c, 0xf4, 0xc2, 0x8f, 0xc8, 0x1c, 0xc7, 0x19, 0xe2, 0x9b, 0x3e, 0x16, 0xde, 0x0e, 0x06, 0xb2, 0x75, 0x24, 0x78, 0xa0, 0x82, 0x07, 0x03, 0x31, 0xdd, 0x11, 0xad, 0x5f, 0x34, 0x74, 0x42, 0xe0, 0x08, 0x9d, 0x91, 0x05, 0x7e, 0xb4, 0x65, 0x38, 0x40, 0x43, 0x82, 0xdd, 0xa0, 0xa2, 0x81, 0x58, 0xb4, 0x38, 0x4a, 0x19, 0x84, 0x81, 0xae, 0x9f, 0x20, 0x9d, 0x18, 0x7c, 0xd7, 0x4f, 0xb4, 0xf8, 0x23, 0x0b, 0x7c, 0x84, 0xe2, 0x5f, 0x53, 0x99, 0x6f, 0xd6, 0x41, 0x4c, 0xd5, 0xe1, 0x63, 0x80, 0xc3, 0xd8, 0xd0, 0xd1, 0xe1, 0xe3, 0xb9, 0x92, 0x83, 0x75, 0x10, 0x87, 0x3f, 0x74, 0x44, 0x65, 0x5a, 0x7c, 0xc4, 0xe3, 0xf5, 0xdc, 0xf5, 0xa3, 0xf8, 0x4e, 0xa8, 0x6a, 0xf0, 0x1d, 0xb5, 0x26, 0xf2, 0xaf, 0xc7, 0xf7, 0x64, 0x1f, 0x4a, 0x15, 0xaa, 0xf8, 0xaa, 0xec, 0x78, 0x7f, 0x7e, 0xfc, 0x41, 0x70, 0x41, 0xdc, 0xc8, 0xca, 0x58, 0x4c, 0x80, 0xb2, 0x27, 0x2c, 0x6a, 0x30, 0xb3, 0xb0, 0xbd, 0xf5, 0xbc, 0x28, 0xb6, 0x8e, 0xf2, 0x22, 0xe5, 0x8c, 0xc5, 0x97, 0x36, 0x4e, 0xc0, 0x67, 0xc3, 0x24, 0xfc, 0x01, 0xfb, 0xfe, 0xf0, 0x15, 0x3b, 0xc5, 0xe1, 0xbb, 0xb6, 0xfe, 0x7e, 0xd6, 0x1f, 0x26, 0xe1, 0x0f, 0x12, 0xf0, 0xc3, 0x65, 0x20, 0x78, 0xe6, 0x75, 0xf8, 0x04, 0x35, 0x21, 0x2e, 0xfd, 0xf8, 0x7c, 0x0a, 0xe7, 0xd0, 0xc5, 0x3f, 0x4b, 0xce, 0x03, 0x49, 0xf8, 0xc3, 0x24, 0xfc, 0xc1, 0xb9, 0xf8, 0x43, 0x27, 0x09, 0xdf, 0xcb, 0x1f, 0x1f, 0x62, 0xfd, 0x40, 0xfc, 0xea, 0xf1, 0xbd, 0xf8, 0xff, 0x90, 0xfc, 0x0f, 0x93, 0xf0, 0xdd, 0x3c, 0xa0, 0xfa, 0x6e, 0xcc, 0xf3, 0x53, 0xf5, 0x9d, 0x73, 0x63, 0xfb, 0x69, 0xf2, 0x00, 0x8b, 0xf3, 0xab, 0x20, 0x2f, 0x1a, 0x9f, 0x1a, 0x86, 0xe2, 0xc7, 0xcb, 0xd7, 0x11, 0x7c, 0x47, 0xc9, 0xd7, 0x7a, 0xfc, 0xa1, 0x1b, 0x7f, 0x43, 0x2d, 0xbe, 0xcc, 0xf3, 0x83, 0xc4, 0xf5, 0x13, 0xf0, 0xa3, 0xf9, 0x3e, 0x0e, 0x3f, 0x90, 0x07, 0xc2, 0xf8, 0xf1, 0xeb, 0x0f, 0x1d, 0x25, 0x07, 0x0c, 0x75, 0xfc, 0xbb, 0x39, 0x60, 0xf0, 0x14, 0xb6, 0x1c, 0x48, 0x59, 0x3e, 0xf6, 0x95, 0x97, 0x47, 0x9b, 0x94, 0x51, 0x19, 0x95, 0x51, 0x49, 0xd8, 0xc4, 0x2b, 0xd5, 0x30, 0xa2, 0xdf, 0x4f, 0xa8, 0x61, 0x24, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd0, 0x86, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xe8, 0xf1, 0xab, 0x7f, 0xee, 0x4a, 0xdd, 0x7e, 0xe8, 0x08, 0x92, 0xe3, 0x13, 0x71, 0x76, 0x47, 0x49, 0xf4, 0x7c, 0x99, 0x26, 0xc9, 0xe7, 0x9e, 0xe9, 0x12, 0xf5, 0xb8, 0x2e, 0x72, 0x7c, 0xec, 0x55, 0xaa, 0x39, 0x7e, 0x27, 0x44, 0x1c, 0xfb, 0xf3, 0x63, 0x3f, 0xa2, 0x3f, 0xa2, 0xa7, 0x2c, 0xfe, 0x0c, 0x57, 0xfd, 0x94, 0x11, 0xc7, 0x2f, 0x7d, 0x82, 0xb7, 0x59, 0x4a, 0xa2, 0xe7, 0xf7, 0x46, 0x44, 0x7f, 0x51, 0xba, 0x4c, 0x9e, 0x9e, 0xb2, 0xe8, 0xe7, 0x0b, 0xef, 0x7c, 0xd7, 0xf5, 0x81, 0xf0, 0xf7, 0x31, 0xe6, 0x7d, 0x5f, 0x93, 0x53, 0x22, 0x70, 0xe2, 0x7d, 0x77, 0x23, 0x34, 0x9e, 0x3e, 0xa3, 0xee, 0x5c, 0x23, 0x82, 0xcf, 0x94, 0x75, 0x74, 0x9f, 0x5f, 0x5c, 0xb8, 0x8e, 0x7f, 0x75, 0x7d, 0xcd, 0xe7, 0x3f, 0x89, 0x4f, 0x02, 0xad, 0x1e, 0x2e, 0x8c, 0x43, 0x59, 0xbc, 0xce, 0x75, 0xfa, 0x0f, 0xc3, 0x23, 0xf6, 0x55, 0x6c, 0xa3, 0xf3, 0x3f, 0xd5, 0xf6, 0x3a, 0x1f, 0x08, 0xe0, 0xe9, 0x3e, 0x6f, 0x29, 0xf2, 0x6b, 0xe3, 0x57, 0xfa, 0x2d, 0x3f, 0xfb, 0xd6, 0xac, 0xe1, 0xca, 0xcf, 0x2b, 0x13, 0x6d, 0xd8, 0xfe, 0x02, 0xe6, 0xb7, 0x7a, 0xfc, 0x38, 0xfb, 0x28, 0xf4, 0x35, 0xf8, 0xaa, 0xfd, 0xe3, 0xfc, 0x2b, 0x00, 0xd7, 0xc8, 0xcf, 0xc7, 0x29, 0x51, 0xec, 0xa8, 0xba, 0x5f, 0x50, 0xb6, 0xb0, 0x7c, 0xd4, 0xfd, 0x68, 0x11, 0xeb, 0xff, 0xc4, 0x33, 0x32, 0xd3, 0xf8, 0x37, 0xa7, 0x29, 0xbf, 0x29, 0xf0, 0x36, 0xac, 0xbf, 0x70, 0x0d, 0xd3, 0xa7, 0x92, 0x37, 0x9e, 0x27, 0x49, 0x24, 0xff, 0x71, 0xfa, 0x44, 0xce, 0xa1, 0x3a, 0xfe, 0x83, 0xfa, 0x4d, 0xd4, 0x3f, 0x8b, 0x8f, 0x8f, 0x20, 0x3e, 0x49, 0xc0, 0x8f, 0xea, 0x8f, 0xb9, 0xf9, 0x8f, 0xe9, 0xfc, 0x83, 0x44, 0x95, 0xa0, 0xb3, 0x4f, 0x1c, 0xff, 0x61, 0x18, 0x89, 0x3e, 0x3f, 0x08, 0xf1, 0x75, 0xc8, 0xa8, 0xde, 0xfe, 0xaa, 0x9c, 0xc1, 0xf8, 0x25, 0xa2, 0xaa, 0x7c, 0x86, 0xed, 0xaf, 0xe4, 0x96, 0xc8, 0x67, 0x34, 0x16, 0x7a, 0xbe, 0x24, 0x7c, 0x5e, 0xf4, 0x6f, 0xa2, 0xcf, 0x04, 0xef, 0xf9, 0x43, 0x62, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xb0, 0xff, 0x6a, 0x96, 0xd4, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0x5b, 0xe3, 0xbf, 0x21, 0x1f, 0xd0, 0xe1, 0x33, 0xf7, 0x13, 0x30, 0x8b, 0x26, 0xc8, 0x24, 0xfa, 0xc1, 0x67, 0x94, 0x26, 0x07, 0xe2, 0x9e, 0x82, 0xc8, 0xbd, 0x85, 0xf6, 0xf9, 0x27, 0x73, 0x9c, 0x8c, 0x23, 0x23, 0x14, 0xa3, 0x4c, 0x93, 0x83, 0x22, 0x02, 0x1a, 0xf1, 0xfe, 0x19, 0x4e, 0xfe, 0x44, 0x47, 0x5f, 0xcd, 0x8f, 0x1a, 0xfb, 0xaa, 0xd5, 0xd0, 0xc8, 0xef, 0x3e, 0x1b, 0x79, 0xfc, 0x13, 0x0d, 0x3c, 0x89, 0xff, 0x50, 0x0c, 0xeb, 0x9e, 0x21, 0xe7, 0xe7, 0x80, 0x90, 0x7d, 0x68, 0xcc, 0x33, 0x40, 0xa3, 0x1e, 0xd5, 0xfe, 0xda, 0xf8, 0x0f, 0xdb, 0x4e, 0x27, 0x7f, 0x42, 0xfc, 0x87, 0x63, 0x58, 0xe7, 0xcb, 0x81, 0x1c, 0x40, 0x75, 0xfa, 0x25, 0xde, 0x37, 0x74, 0x1d, 0x3c, 0x2c, 0x3b, 0x4d, 0xca, 0x01, 0x31, 0xf1, 0x4f, 0x63, 0xe2, 0xdf, 0x20, 0x9a, 0xaa, 0x8b, 0x7f, 0x16, 0x13, 0xff, 0xe2, 0x83, 0xb3, 0xf1, 0x6c, 0x7e, 0x2d, 0x3b, 0x2a, 0xa3, 0x32, 0x2a, 0xa3, 0x12, 0xdc, 0x1f, 0x50, 0xe5, 0xb5, 0x84, 0x46, 0x53, 0x8f, 0x41, 0x12, 0xf6, 0x0f, 0x84, 0x78, 0x3f, 0xa1, 0xf4, 0xda, 0x48, 0xfe, 0x57, 0x5b, 0x4d, 0x7a, 0x0c, 0xbc, 0xbb, 0x92, 0x98, 0xe3, 0x09, 0xf7, 0xa7, 0x39, 0x44, 0xcf, 0x7f, 0x3c, 0x83, 0x21, 0x19, 0x89, 0x7e, 0x7f, 0x46, 0x0d, 0xfd, 0xfb, 0xb3, 0x2b, 0xa3, 0x7b, 0x0e, 0x11, 0xa7, 0x43, 0x76, 0xde, 0x39, 0x44, 0xe8, 0x38, 0xc2, 0x88, 0x6e, 0x73, 0x9e, 0xd8, 0x5e, 0x46, 0xfc, 0x11, 0x80, 0xf6, 0xcc, 0x40, 0xfd, 0x69, 0x13, 0xd3, 0xf1, 0xae, 0xc8, 0xaf, 0x7b, 0xbc, 0xa9, 0xf4, 0x93, 0xe0, 0x86, 0x86, 0x3e, 0x51, 0x7c, 0x43, 0xf7, 0xfc, 0x63, 0x44, 0x79, 0x6c, 0x12, 0xfd, 0xf6, 0x8b, 0x18, 0x41, 0x1f, 0x8b, 0xe8, 0x8d, 0x04, 0x8f, 0x79, 0x22, 0xf4, 0x49, 0x32, 0x7e, 0x12, 0x7f, 0x46, 0x42, 0x6c, 0xe8, 0xe0, 0x09, 0xc7, 0x33, 0xb1, 0x7b, 0x71, 0x97, 0x27, 0xa6, 0xdd, 0xdb, 0x24, 0xfe, 0x3c, 0x31, 0x20, 0xbf, 0x8e, 0x47, 0xaa, 0xca, 0x6f, 0xe8, 0xe3, 0x47, 0xd5, 0x0f, 0xd1, 0x6d, 0x6f, 0x48, 0xb0, 0xd5, 0xd9, 0xc7, 0x3b, 0x5e, 0x8b, 0xc1, 0x8f, 0xf3, 0x3f, 0xd5, 0xfe, 0x5a, 0xff, 0x0a, 0xc1, 0x49, 0xdc, 0xfa, 0x31, 0xf9, 0x81, 0x90, 0x73, 0xe4, 0x0b, 0xe5, 0x87, 0x38, 0xff, 0x32, 0x82, 0x3f, 0x0d, 0x8c, 0xd2, 0x8f, 0xc9, 0x95, 0xe1, 0xad, 0x9f, 0x8e, 0x3e, 0x0b, 0xc5, 0x68, 0x92, 0xfe, 0x48, 0x8c, 0xfd, 0x48, 0x0c, 0x7f, 0x01, 0xfb, 0xe9, 0xf4, 0x17, 0xd2, 0x51, 0x9c, 0xfd, 0x98, 0x22, 0xa3, 0x4e, 0xff, 0x71, 0xf1, 0x1f, 0xd6, 0x6f, 0x9c, 0xfe, 0xce, 0xb3, 0x1f, 0x39, 0x47, 0xff, 0x1e, 0x8f, 0x31, 0xf8, 0x34, 0xce, 0x3e, 0x0a, 0x5c, 0xc7, 0x5f, 0x38, 0xbf, 0x30, 0xdd, 0xf9, 0x9f, 0x2a, 0xdf, 0x39, 0x31, 0xac, 0x3b, 0x7e, 0x0f, 0xf8, 0x5f, 0x8c, 0x7d, 0x9e, 0xf8, 0x38, 0x9f, 0x18, 0x4f, 0xfd, 0xfe, 0xcf, 0x42, 0x79, 0x22, 0xcc, 0x3b, 0x33, 0xe2, 0xe3, 0x37, 0x9c, 0x03, 0x68, 0xcc, 0xcf, 0xc3, 0xe3, 0xec, 0x1b, 0xc8, 0x51, 0x71, 0xf8, 0x21, 0x3f, 0x32, 0x12, 0x72, 0x5c, 0xf8, 0x8c, 0x94, 0x68, 0x62, 0x28, 0x2e, 0x77, 0x6b, 0xe9, 0x93, 0x60, 0x20, 0x13, 0x0d, 0x7d, 0xa2, 0x1c, 0x1d, 0xe9, 0xe2, 0x37, 0x29, 0xbf, 0xe8, 0x72, 0x80, 0x61, 0x24, 0xe7, 0x00, 0x23, 0x21, 0x86, 0xa9, 0x91, 0x8c, 0xcf, 0xe2, 0x72, 0xa8, 0x6a, 0x1f, 0x4d, 0x8c, 0xb0, 0xf8, 0xc7, 0xa3, 0x7f, 0xfc, 0x1c, 0xb7, 0xbf, 0x20, 0xf1, 0xfb, 0xaf, 0x70, 0x0c, 0xd3, 0xf3, 0xe0, 0x46, 0x3c, 0x5c, 0x17, 0xff, 0xe1, 0xfd, 0x1b, 0x49, 0xa0, 0x1f, 0xf7, 0x7d, 0xc6, 0xcd, 0x8b, 0x49, 0xf1, 0xcf, 0x62, 0xe2, 0x9f, 0x6a, 0x7c, 0x4c, 0xeb, 0x1f, 0x44, 0x1f, 0xff, 0x9e, 0x7e, 0x9f, 0xcf, 0x7d, 0xc2, 0xa0, 0xf7, 0x75, 0xd7, 0x37, 0xbf, 0xa5, 0xbb, 0x2e, 0xc2, 0xcb, 0x09, 0xfb, 0x43, 0xdd, 0x35, 0x7c, 0xac, 0xbb, 0x2e, 0xc4, 0xcb, 0xd8, 0xff, 0x33, 0xfb, 0x7e, 0xed, 0xdd, 0xf0, 0x85, 0xf6, 0x7d, 0xef, 0xfd, 0xf0, 0x35, 0xb2, 0xef, 0x45, 0xb1, 0x2f, 0x5e, 0x51, 0xfb, 0xe2, 0x35, 0xb2, 0xef, 0xc8, 0xbe, 0x1f, 0xf5, 0x72, 0xa6, 0x31, 0xef, 0xe0, 0xfe, 0x99, 0xc6, 0xbc, 0xce, 0x85, 0xb0, 0xef, 0x99, 0xc6, 0xbc, 0xdf, 0x78, 0x74, 0xa6, 0x31, 0xef, 0xff, 0x3e, 0xba, 0x08, 0xf2, 0x7e, 0xf5, 0x0f, 0xa2, 0x06, 0x3e, 0x7d, 0xf4, 0x8f, 0xff, 0x14, 0x35, 0xf0, 0xe9, 0x85, 0x90, 0xf7, 0xaf, 0xfe, 0x5a, 0x17, 0xbf, 0xff, 0xfd, 0x3f, 0x17, 0x36, 0x3f, 0x0f, 0xee, 0xf3, 0x3f, 0x59, 0xee, 0x9f, 0xf1, 0x02, 0xc1, 0xca, 0xff, 0x64, 0xf9, 0x96, 0x18, 0xbd, 0x10, 0xf9, 0xf9, 0x8f, 0xde, 0xe5, 0x7f, 0xb2, 0xbc, 0x7b, 0x76, 0xf6, 0xe0, 0xe1, 0xd9, 0xd9, 0x7b, 0xff, 0xfc, 0x3e, 0xff, 0x93, 0xe5, 0xfd, 0xb3, 0xb3, 0xbf, 0xf9, 0xf6, 0xc5, 0x90, 0xf7, 0x2c, 0x52, 0xfe, 0xf8, 0xeb, 0x67, 0x9a, 0xf2, 0x2f, 0xdf, 0xbb, 0x20, 0xf2, 0xbe, 0xf3, 0x2b, 0x01, 0xb9, 0xbe, 0xfc, 0x7b, 0xbf, 0xf3, 0xbb, 0xbf, 0xff, 0x95, 0xb3, 0x5f, 0xfd, 0xb5, 0xc0, 0xe8, 0xdf, 0xfe, 0xdd, 0x77, 0xbe, 0xfb, 0xf7, 0xff, 0x70, 0x21, 0xe4, 0xfd, 0x8d, 0xdf, 0x0c, 0x48, 0xf6, 0x67, 0x7f, 0xfe, 0x27, 0x7f, 0xfa, 0x17, 0x7f, 0x79, 0xf6, 0x5b, 0xbf, 0x1d, 0x18, 0xfd, 0xf7, 0xff, 0xf8, 0xd7, 0x7f, 0xfb, 0xcf, 0xff, 0x1a, 0xbb, 0x6f, 0x18, 0x1f, 0xe7, 0xd7, 0x27, 0xc6, 0xf0, 0xfa, 0x71, 0x7e, 0xf1, 0x7b, 0xe3, 0x49, 0x2e, 0xfe, 0xbf, 0x63, 0x19, 0x97, 0xf0, 0x7a, 0x1e, 0xae, 0x17, 0xe0, 0x22, 0x97, 0xc8, 0x98, 0x11, 0xbc, 0x48, 0xe8, 0x52, 0x29, 0x5c, 0x02, 0x12, 0xbf, 0x68, 0xbc, 0x64, 0xbc, 0xf4, 0xdc, 0x4b, 0xcf, 0x3d, 0xd9, 0x9a, 0xe1, 0xeb, 0xf9, 0x8f, 0xbf, 0xfc, 0x29, 0x63, 0x7b, 0xa5, 0xb2, 0x56, 0x29, 0xa7, 0xde, 0x4a, 0x8d, 0x2d, 0xdd, 0xd8, 0xdc, 0xda, 0xd8, 0x2c, 0xa7, 0xc6, 0xe0, 0x7e, 0x6c, 0x71, 0x73, 0x73, 0xe3, 0x66, 0x39, 0x3f, 0x93, 0x83, 0xfb, 0x95, 0xc5, 0xf5, 0x65, 0x79, 0xbb, 0xfa, 0x7a, 0x65, 0x71, 0x4d, 0xde, 0x5f, 0x5f, 0xfd, 0x6c, 0xe5, 0xda, 0xce, 0xf5, 0xca, 0xe6, 0x95, 0xca, 0xd2, 0x76, 0xb9, 0x67, 0x1f, 0x5a, 0x30, 0x7a, 0x27, 0x97, 0x02, 0x4a, 0x1b, 0xcb, 0x15, 0x53, 0x12, 0x7a, 0xfd, 0xaa, 0x89, 0xa5, 0x3c, 0x33, 0x87, 0x38, 0x57, 0xdc, 0x5e, 0x11, 0x7b, 0x5b, 0xdb, 0x9b, 0xab, 0xeb, 0x57, 0xcd, 0xf2, 0x2c, 0x76, 0xd6, 0x6f, 0xac, 0xbd, 0x5e, 0xd9, 0x04, 0x10, 0x27, 0xfe, 0x99, 0xca, 0xcf, 0xde, 0xdc, 0xd8, 0x5c, 0x2e, 0x97, 0xb0, 0xb3, 0x78, 0x7d, 0x95, 0x63, 0x71, 0x12, 0x4b, 0x1b, 0x6b, 0x6b, 0x95, 0xf5, 0xed, 0xf2, 0x0c, 0xc7, 0xda, 0x5a, 0xbd, 0xba, 0xce, 0x09, 0xf2, 0x89, 0x5b, 0x95, 0x6b, 0xc0, 0x8b, 0x29, 0x61, 0x42, 0x20, 0xb3, 0x2c, 0xd6, 0x5a, 0x59, 0x5c, 0xde, 0xb8, 0x69, 0xba, 0x7c, 0x8e, 0x2d, 0x5e, 0xdb, 0xde, 0xb9, 0xb2, 0x01, 0x74, 0x1a, 0xd5, 0x56, 0x97, 0x8f, 0xac, 0x2d, 0x6e, 0x2f, 0xad, 0xec, 0x2c, 0x57, 0xae, 0xad, 0xae, 0xad, 0x6e, 0x57, 0x36, 0xb7, 0x02, 0x22, 0x5d, 0x5d, 0x5c, 0xab, 0x5c, 0x5f, 0x5c, 0x96, 0x42, 0x6d, 0x6f, 0xdc, 0x58, 0x5a, 0x81, 0x7b, 0xde, 0x01, 0x52, 0xd7, 0x57, 0x16, 0xcb, 0x33, 0xaf, 0x4d, 0x23, 0x95, 0x3b, 0x02, 0xe3, 0x4e, 0x2a, 0xb5, 0xb4, 0x52, 0x59, 0xfa, 0xcc, 0xce, 0x7a, 0xe5, 0xe6, 0xce, 0x1b, 0x40, 0x6d, 0x75, 0x63, 0x9d, 0x13, 0x4c, 0xad, 0x6f, 0xec, 0x6c, 0x6d, 0xdc, 0x00, 0x8d, 0xf2, 0x85, 0x53, 0x57, 0x57, 0xaf, 0xec, 0x5c, 0xab, 0xac, 0x5f, 0xdd, 0x5e, 0x29, 0x17, 0xa7, 0xcd, 0x7c, 0xde, 0x6c, 0xb6, 0xcd, 0xae, 0x55, 0xeb, 0xb4, 0xeb, 0xdd, 0xd4, 0xd2, 0xe6, 0xf6, 0xce, 0xda, 0xc6, 0xfa, 0xea, 0x36, 0x98, 0xc5, 0x9f, 0xbd, 0xb5, 0xb4, 0x78, 0xad, 0x52, 0x2e, 0xa5, 0x6e, 0xac, 0xca, 0xdb, 0xd9, 0x54, 0x2a, 0x1f, 0x5f, 0x52, 0x8d, 0xc3, 0x76, 0xad, 0xd7, 0xec, 0xb4, 0xcd, 0xed, 0xd5, 0xa5, 0x4c, 0x36, 0x35, 0x56, 0x6b, 0x75, 0xb1, 0x69, 0x75, 0x6a, 0xd5, 0x96, 0xd9, 0xaa, 0xee, 0x5a, 0xad, 0x72, 0x7a, 0x7b, 0xbf, 0xd9, 0x35, 0xe1, 0xaf, 0x7b, 0xdc, 0xed, 0x59, 0xb7, 0x4c, 0x58, 0xbe, 0xd1, 0xdc, 0x3b, 0xb4, 0xab, 0x1c, 0xaf, 0x56, 0xb5, 0x7b, 0x76, 0xb3, 0xbe, 0x67, 0xa5, 0x5d, 0xac, 0x6e, 0xf3, 0x4d, 0xab, 0x7c, 0x60, 0x37, 0xdb, 0xbd, 0x0c, 0x27, 0x90, 0x9b, 0xce, 0xe5, 0xe7, 0x81, 0xa6, 0x3a, 0x94, 0x29, 0xce, 0x4e, 0xe7, 0x71, 0x62, 0x76, 0x6a, 0xaa, 0x98, 0xcb, 0xcc, 0x94, 0xe6, 0x61, 0x0a, 0xdc, 0x66, 0x53, 0x56, 0xbb, 0x9e, 0xe2, 0xb2, 0xa1, 0x4d, 0x2a, 0x9b, 0xdc, 0xf9, 0x40, 0x45, 0xdb, 0x95, 0xcf, 0x96, 0x3f, 0xf7, 0x39, 0x50, 0xe1, 0xab, 0xb7, 0x2d, 0xbb, 0x8b, 0x0b, 0xcf, 0xcc, 0x4c, 0x43, 0xb7, 0xda, 0x83, 0xd5, 0x77, 0x0f, 0x7b, 0x96, 0x79, 0xdb, 0xaa, 0x95, 0xcc, 0xbd, 0x83, 0xc3, 0x9d, 0x37, 0x2c, 0xbb, 0x67, 0x1d, 0x5d, 0x0e, 0x03, 0x8b, 0x1c, 0xb8, 0x6d, 0x1d, 0x2d, 0x75, 0x3a, 0x76, 0x3d, 0x02, 0x9e, 0xe5, 0xe0, 0xa5, 0x4e, 0xab, 0x63, 0x23, 0xec, 0xb0, 0xdd, 0x6c, 0x74, 0xec, 0x5b, 0xe6, 0xad, 0x6a, 0x4f, 0x40, 0xd6, 0x3a, 0x75, 0xab, 0xf5, 0x46, 0xd3, 0xea, 0x5f, 0xb7, 0x3b, 0x3f, 0x6f, 0x71, 0x9d, 0xad, 0x55, 0x01, 0x9f, 0x2f, 0x74, 0xbb, 0x6a, 0x1f, 0x37, 0xdb, 0x7b, 0x82, 0x4e, 0xcd, 0xa5, 0xa1, 0x8c, 0x16, 0xcd, 0x9e, 0xb2, 0xf0, 0xed, 0x4e, 0xb3, 0x0e, 0x94, 0x9b, 0xed, 0x0c, 0xde, 0x65, 0x5d, 0x57, 0xe1, 0x88, 0x66, 0x39, 0xc8, 0xc8, 0x98, 0x8b, 0x08, 0x00, 0x24, 0x94, 0x51, 0xa5, 0xc8, 0xf2, 0x19, 0x7b, 0xad, 0x9d, 0xeb, 0x9d, 0x6e, 0x93, 0x9b, 0xa3, 0x9c, 0xcc, 0xac, 0x39, 0xc1, 0x79, 0xcc, 0xf8, 0x7a, 0xca, 0x99, 0x33, 0x85, 0x69, 0x4e, 0xe7, 0x4e, 0x6a, 0xec, 0xf3, 0x9f, 0x07, 0x07, 0xe5, 0xa1, 0xab, 0x55, 0xf6, 0xd4, 0xd4, 0x81, 0x6d, 0xd5, 0x9a, 0x7c, 0x64, 0xbf, 0xb9, 0xb7, 0x7f, 0x60, 0x36, 0x5a, 0x9d, 0x6a, 0x2f, 0x51, 0x56, 0x57, 0x91, 0xdd, 0xea, 0xad, 0x83, 0x96, 0x65, 0x17, 0x97, 0xcd, 0x6e, 0xe7, 0xd0, 0xae, 0x59, 0x2a, 0x8c, 0x53, 0x31, 0x7b, 0xf6, 0xde, 0xce, 0x91, 0x7e, 0xf8, 0x58, 0x3f, 0xdc, 0xd7, 0x0f, 0xef, 0x47, 0x87, 0xbb, 0x35, 0x5b, 0x37, 0x1b, 0x87, 0x61, 0x36, 0x17, 0xcd, 0xac, 0xdc, 0x3a, 0x6c, 0x55, 0x7b, 0x56, 0x1d, 0x82, 0xec, 0xe0, 0xb0, 0x67, 0xda, 0x56, 0xb7, 0xd3, 0x3a, 0x44, 0xd5, 0x15, 0x50, 0x3e, 0x94, 0x0b, 0x86, 0xca, 0xdc, 0x06, 0xc5, 0xb9, 0xf9, 0xc2, 0x74, 0x6e, 0x66, 0x76, 0x96, 0xab, 0x4e, 0xa0, 0xaf, 0x54, 0xed, 0x7a, 0xdb, 0xea, 0x76, 0xcd, 0x4e, 0x03, 0xe8, 0x56, 0xdb, 0xad, 0x66, 0xdb, 0x2a, 0x08, 0x90, 0x99, 0x7f, 0xad, 0x30, 0x0d, 0xa6, 0xe9, 0x76, 0x1a, 0x3d, 0x31, 0x92, 0x9f, 0x99, 0xe7, 0x23, 0xb7, 0xac, 0x7a, 0xf3, 0xf0, 0x16, 0x8c, 0x09, 0x7e, 0xf6, 0x81, 0xc6, 0x16, 0xe0, 0x96, 0x11, 0x41, 0x47, 0xf8, 0xa0, 0x79, 0x64, 0xb5, 0xba, 0x3c, 0x0d, 0x04, 0x97, 0xc8, 0x17, 0xc3, 0x2b, 0xcc, 0xf2, 0x01, 0xa4, 0x18, 0x20, 0x7f, 0xbd, 0x79, 0x54, 0xce, 0x97, 0x7c, 0xea, 0xcb, 0xcd, 0xee, 0x41, 0xab, 0x7a, 0x6c, 0xf6, 0xab, 0xf6, 0x81, 0xa4, 0x35, 0xcd, 0x31, 0xdb, 0x9d, 0xb6, 0x25, 0xfa, 0xe0, 0x20, 0x53, 0x42, 0x00, 0xeb, 0xa8, 0x67, 0x5b, 0xb7, 0x2c, 0x57, 0x1f, 0x88, 0x23, 0x14, 0x82, 0x53, 0xe6, 0x67, 0x51, 0x27, 0x70, 0x33, 0xfb, 0x1a, 0xaa, 0xc5, 0x94, 0x0b, 0x2c, 0xde, 0xea, 0x1c, 0xb6, 0x7b, 0x5c, 0x2b, 0xfb, 0xd5, 0x7a, 0xa7, 0x0f, 0x8e, 0xdf, 0xfd, 0x42, 0xc1, 0xe3, 0x09, 0x7b, 0xcb, 0x55, 0xfb, 0x0b, 0xe5, 0xe9, 0xc2, 0xdc, 0xe5, 0xc0, 0xe8, 0x35, 0xf0, 0xb0, 0x5e, 0x79, 0x06, 0x87, 0x39, 0xa5, 0xfc, 0x33, 0x2a, 0x92, 0xaf, 0xee, 0xe6, 0xd5, 0xd7, 0xcd, 0x5e, 0xc7, 0xbc, 0x06, 0x4a, 0xac, 0xda, 0x52, 0xf4, 0xc5, 0x6e, 0xf7, 0x10, 0xdd, 0xf8, 0xb0, 0x8b, 0xff, 0x8a, 0x29, 0xc7, 0x07, 0xe0, 0x13, 0xe0, 0xd2, 0xbd, 0x43, 0xb0, 0xbf, 0xd9, 0xc3, 0x64, 0xd8, 0xdd, 0xef, 0x1c, 0xb6, 0xea, 0xa0, 0xa2, 0x9e, 0xb9, 0x6b, 0x99, 0x6d, 0xcb, 0xaa, 0x5b, 0x75, 0x5f, 0xa4, 0xed, 0x8e, 0xa0, 0x39, 0x93, 0x11, 0xfd, 0x5a, 0xf6, 0x2d, 0xdb, 0x02, 0xec, 0x76, 0xa6, 0xb6, 0x00, 0x62, 0x4e, 0xcf, 0x4e, 0xcf, 0xce, 0x65, 0x3f, 0x5d, 0x9b, 0x9a, 0x29, 0x16, 0x7e, 0xba, 0xf8, 0x33, 0x07, 0x9d, 0x7e, 0x26, 0x53, 0x9b, 0x84, 0xf1, 0xb9, 0xb9, 0xec, 0xd4, 0x0c, 0x36, 0xb9, 0x62, 0x61, 0x36, 0x7b, 0xf9, 0x8e, 0x50, 0x73, 0xc9, 0xa3, 0x97, 0xe1, 0x3d, 0x8f, 0x1a, 0xcf, 0x78, 0x19, 0x7f, 0xb1, 0x5a, 0xc1, 0xce, 0xe6, 0xd4, 0xee, 0x5e, 0xb0, 0xbb, 0x9b, 0x45, 0x9a, 0x42, 0x4e, 0x31, 0x8a, 0xe2, 0xa3, 0x8c, 0xcf, 0x56, 0xf8, 0x2d, 0x7b, 0x6f, 0x57, 0x27, 0x3a, 0x48, 0x38, 0x5d, 0x9a, 0x29, 0x4d, 0xbf, 0xf6, 0xe9, 0xda, 0x84, 0x10, 0x9d, 0x0b, 0x3b, 0x81, 0x0a, 0xa8, 0xe5, 0xa6, 0x0b, 0xb3, 0x33, 0xf3, 0xf3, 0xf3, 0xd9, 0xbc, 0x50, 0x84, 0x2a, 0x3d, 0x12, 0x8c, 0x91, 0x5d, 0xac, 0x25, 0x25, 0x77, 0x3b, 0x7b, 0x6a, 0x47, 0x95, 0x7a, 0x1d, 0x64, 0xb6, 0xba, 0x3d, 0xd3, 0x72, 0x23, 0x5d, 0x24, 0x25, 0x73, 0xaf, 0x79, 0xdb, 0x6a, 0x8b, 0x94, 0x80, 0x92, 0x1f, 0x74, 0xe0, 0x41, 0x05, 0xff, 0xca, 0x94, 0x5a, 0x6d, 0x73, 0x0d, 0x58, 0x2d, 0xf0, 0xe1, 0x46, 0xd7, 0xea, 0xb9, 0xda, 0x6a, 0x75, 0x3b, 0xe6, 0x9b, 0x96, 0xdd, 0xf9, 0x29, 0x8c, 0x4c, 0x8c, 0x79, 0xdb, 0xb2, 0xdc, 0x5c, 0x51, 0x32, 0xaf, 0x58, 0xbd, 0xda, 0x7e, 0x86, 0x87, 0x09, 0x50, 0xca, 0xf1, 0x1b, 0x98, 0x96, 0xe5, 0x99, 0x1e, 0x46, 0xca, 0xa8, 0xa1, 0x8e, 0x9d, 0x81, 0xdb, 0x09, 0x60, 0x6a, 0x12, 0x61, 0x93, 0x3c, 0x96, 0x20, 0x10, 0x40, 0x1b, 0x73, 0xd9, 0xec, 0x14, 0x8c, 0xf3, 0x04, 0x2f, 0x65, 0xf6, 0xfc, 0x60, 0xa6, 0x50, 0x84, 0x44, 0x2e, 0xad, 0x52, 0x5c, 0xce, 0x88, 0x8c, 0x9a, 0x03, 0x52, 0x85, 0xa3, 0xe3, 0x1c, 0xcf, 0x2d, 0xd9, 0x02, 0xc8, 0xef, 0x4b, 0x0e, 0x51, 0xde, 0xab, 0xb6, 0x6b, 0x16, 0x66, 0x0e, 0x4f, 0x7a, 0x99, 0x4c, 0xc0, 0x09, 0xda, 0x52, 0x31, 0x5c, 0x4c, 0x2f, 0xdd, 0x21, 0x92, 0x27, 0x41, 0xf6, 0x2d, 0x64, 0x5a, 0x72, 0x7b, 0x59, 0x72, 0x94, 0xcf, 0x20, 0xff, 0x79, 0x4f, 0x92, 0x6c, 0x36, 0xef, 0x8a, 0x90, 0x15, 0x26, 0x1c, 0x1b, 0x93, 0x39, 0x64, 0xd9, 0xbc, 0x5a, 0x3d, 0xec, 0x76, 0x9b, 0xd5, 0xb6, 0xef, 0x2b, 0x38, 0x22, 0x1d, 0x05, 0x75, 0xe4, 0xe6, 0xe4, 0x6a, 0xcb, 0xf2, 0xec, 0x6c, 0x1d, 0x1d, 0x14, 0x33, 0x7c, 0x68, 0x02, 0xd7, 0xc6, 0x35, 0x3c, 0xa1, 0x4a, 0xf9, 0x5e, 0xf5, 0xc0, 0x23, 0x6b, 0x36, 0x9a, 0xad, 0x9e, 0x65, 0x9b, 0xd5, 0x56, 0x07, 0x6c, 0xb8, 0xdf, 0xb1, 0xdf, 0x34, 0xdd, 0xfc, 0xc8, 0x0d, 0xb2, 0x02, 0x23, 0x25, 0xdf, 0x20, 0x62, 0x31, 0xcf, 0x22, 0x7c, 0xca, 0x6e, 0x59, 0x58, 0xcd, 0x35, 0x58, 0x26, 0x0f, 0x1e, 0x9a, 0xc3, 0x39, 0xe2, 0x41, 0x2b, 0x7c, 0x30, 0x3c, 0x09, 0xf3, 0x65, 0x78, 0x52, 0x3d, 0x32, 0x29, 0x48, 0x49, 0xac, 0x5e, 0xef, 0xf6, 0xca, 0x5c, 0xc9, 0x28, 0x56, 0x81, 0x3f, 0xfb, 0x50, 0xae, 0xa5, 0x4e, 0x1b, 0x9e, 0xbb, 0x00, 0x76, 0x8d, 0x06, 0x16, 0xea, 0x5b, 0x98, 0x0d, 0x0b, 0x3e, 0x2e, 0xd7, 0x49, 0x59, 0x66, 0x74, 0x85, 0x66, 0x7f, 0xb7, 0xcc, 0xd5, 0x0a, 0xb4, 0x39, 0xf7, 0x42, 0x9d, 0xea, 0x84, 0x9a, 0x37, 0x01, 0x93, 0x8e, 0x66, 0x42, 0xdd, 0x9f, 0x10, 0xa2, 0x00, 0xcc, 0x6d, 0x0a, 0xbb, 0x08, 0x65, 0x7b, 0x21, 0x54, 0x50, 0xdc, 0x34, 0xb3, 0x3b, 0xd1, 0xdf, 0x9d, 0xac, 0x4d, 0xf4, 0x6b, 0x93, 0xf5, 0x89, 0x7e, 0x3d, 0x3b, 0x95, 0x81, 0x2e, 0x74, 0xe0, 0xd6, 0x33, 0xdd, 0xdc, 0x53, 0x9b, 0x6e, 0x2e, 0xd9, 0x74, 0xd5, 0x88, 0xe9, 0x8a, 0x51, 0xab, 0xfc, 0xf0, 0xec, 0xcb, 0x27, 0x59, 0x91, 0x49, 0xc5, 0x1f, 0x96, 0x13, 0x54, 0x7d, 0x27, 0x28, 0x6a, 0x6d, 0xfc, 0x83, 0xf4, 0x12, 0x39, 0xc1, 0xf2, 0x27, 0x14, 0x3f, 0x8c, 0x1b, 0x55, 0x27, 0xfa, 0xd5, 0xc9, 0xa0, 0x2f, 0x4d, 0x5a, 0x13, 0x7d, 0x0b, 0x1d, 0xaa, 0x3a, 0xe9, 0xfa, 0xd4, 0x24, 0x0c, 0x78, 0x6e, 0x25, 0xa9, 0xba, 0x7b, 0x23, 0x45, 0x61, 0x82, 0x27, 0xdc, 0x5b, 0xc5, 0xfa, 0x91, 0xce, 0x1c, 0xc7, 0x6a, 0xfe, 0xf5, 0xc4, 0x01, 0x94, 0x9c, 0xbb, 0x55, 0xf3, 0x17, 0x5f, 0x6c, 0xb5, 0x60, 0x77, 0xe3, 0xa5, 0xd2, 0x7d, 0x78, 0x1c, 0x70, 0x37, 0xe6, 0x19, 0xd6, 0x6a, 0x34, 0x60, 0x1f, 0x2e, 0x52, 0xae, 0xe7, 0xd7, 0xdb, 0x76, 0x53, 0xc9, 0xaf, 0x8a, 0x2f, 0x8b, 0x5c, 0x85, 0x3c, 0xe6, 0xdd, 0xdd, 0xb9, 0xeb, 0xc1, 0x22, 0x16, 0x10, 0x84, 0x7e, 0x19, 0xf0, 0x5b, 0x1f, 0xcb, 0xdb, 0xd3, 0xfb, 0xfe, 0xc0, 0x45, 0x0f, 0x52, 0xf4, 0x5c, 0xc1, 0x83, 0xf9, 0x24, 0x3d, 0x2f, 0xf0, 0x61, 0x1e, 0x9e, 0x54, 0x47, 0xd0, 0x3e, 0x81, 0x47, 0x4d, 0xc7, 0xe6, 0x4f, 0x4e, 0x65, 0x27, 0x0c, 0xf8, 0xf8, 0x1c, 0x85, 0xb7, 0x3b, 0x31, 0x8a, 0xcf, 0x4a, 0x88, 0xf7, 0x83, 0xfd, 0xaa, 0xf7, 0xb8, 0xb9, 0x09, 0xbb, 0xc9, 0x90, 0x3a, 0xdc, 0x47, 0x0e, 0xf8, 0x0f, 0xb2, 0x7d, 0x19, 0x5f, 0xf4, 0xe5, 0xf8, 0x84, 0xb7, 0xf1, 0x9c, 0x44, 0xf6, 0x0a, 0xc7, 0x13, 0xfc, 0xdf, 0xec, 0x04, 0xdf, 0xc8, 0x1e, 0xe5, 0x3c, 0xc0, 0x11, 0x07, 0x1c, 0x49, 0xc0, 0x71, 0x40, 0x04, 0xa4, 0x03, 0xcf, 0xaa, 0x49, 0xdc, 0x7b, 0xba, 0xfc, 0x6f, 0x05, 0x77, 0xa9, 0x5c, 0xb7, 0x6b, 0xd0, 0x89, 0xb2, 0x56, 0x38, 0x9a, 0x2c, 0x8b, 0xa5, 0xf9, 0x7e, 0xda, 0x35, 0x04, 0x62, 0x96, 0xf9, 0xfe, 0xc4, 0xdd, 0xdb, 0xe6, 0x22, 0x37, 0x82, 0x0b, 0x4e, 0xa3, 0xdc, 0xb0, 0xab, 0xb5, 0x9e, 0x60, 0x75, 0x6a, 0xde, 0xd5, 0x71, 0xb3, 0x21, 0x46, 0x60, 0xd7, 0x54, 0x2a, 0x95, 0xb2, 0x9c, 0x1b, 0xbb, 0xec, 0x6d, 0x8b, 0xf9, 0x1c, 0x78, 0x78, 0xc3, 0x03, 0xdd, 0x9f, 0x88, 0xdb, 0x27, 0x3e, 0x71, 0x4f, 0x37, 0x91, 0x43, 0x76, 0x43, 0x10, 0xa9, 0x07, 0x1c, 0xbc, 0x7c, 0x87, 0x6b, 0x37, 0xf0, 0x7a, 0x9a, 0x35, 0xb9, 0xac, 0xfe, 0x6b, 0x09, 0xec, 0xdb, 0xa6, 0x65, 0x08, 0x7b, 0x1b, 0xf7, 0x20, 0x45, 0xae, 0x25, 0x48, 0x59, 0x76, 0xaf, 0x0c, 0xef, 0xa5, 0x57, 0xec, 0xea, 0x1e, 0x7f, 0x15, 0x84, 0x8d, 0x89, 0xd8, 0x1a, 0xf0, 0xb7, 0xbc, 0x9c, 0x78, 0xab, 0x13, 0xa2, 0xf2, 0xc9, 0x85, 0xe3, 0x32, 0x7f, 0x19, 0xcb, 0xcb, 0x1e, 0xdf, 0xf3, 0x8f, 0xb9, 0x2a, 0x2f, 0x73, 0xdf, 0xe0, 0xa0, 0x29, 0x8f, 0x4a, 0x5f, 0x50, 0xd9, 0xcf, 0x8a, 0x57, 0xb0, 0x31, 0x6f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x4f, 0x19, 0xc3, 0x0b, 0xed, 0x35, 0xc1, 0xcd, 0x17, 0xe2, 0xc6, 0x7b, 0x75, 0xf6, 0x70, 0xc4, 0x0b, 0xf6, 0xac, 0xdc, 0x55, 0x66, 0xc2, 0xe4, 0xb2, 0xa1, 0x37, 0xe5, 0xd4, 0x9d, 0xd4, 0xff, 0x01, 0xf9, 0xa1, 0xd7, 0x5d, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4d, 0x73, 0x1b, 0xc9, 0x75, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0x4d, 0xe7, 0x9a, 0x2a, 0xcf, 0x62, 0x0f, 0x01, 0x48, 0x00, 0x24, 0x01, 0x8a, 0xb5, 0x89, 0x38, 0xe5, 0xe2, 0x92, 0x90, 0xc8, 0xb2, 0x48, 0xaa, 0x48, 0x6a, 0xe5, 0x94, 0xcb, 0x45, 0x83, 0xc0, 0x80, 0x44, 0x0c, 0x02, 0xac, 0x01, 0x28, 0x90, 0xbb, 0x51, 0x55, 0x8e, 0x3a, 0xe4, 0x90, 0xab, 0xf7, 0xb4, 0x49, 0x2e, 0x31, 0x4b, 0x87, 0x7c, 0xfc, 0x81, 0x96, 0x94, 0xd8, 0xb1, 0xd3, 0xc6, 0x7a, 0xe3, 0x7c, 0xc7, 0x14, 0x6d, 0xe7, 0x3b, 0x81, 0x10, 0x6d, 0x9c, 0xef, 0x6c, 0x95, 0xf2, 0x5e, 0x77, 0xcf, 0x4c, 0xcf, 0x4c, 0xcf, 0x50, 0x5a, 0xcb, 0xf6, 0x86, 0x61, 0x0f, 0x5b, 0x3d, 0xdd, 0xaf, 0xdf, 0xeb, 0xf7, 0x3d, 0x3d, 0x3d, 0x28, 0x8d, 0x1a, 0x86, 0xf1, 0xdc, 0x3b, 0x9f, 0x32, 0xfa, 0x0c, 0xca, 0xed, 0xdb, 0xb7, 0xef, 0x1c, 0x1d, 0x1d, 0xdd, 0xc1, 0x16, 0xba, 0x77, 0x18, 0xf5, 0x2a, 0x63, 0x83, 0xe1, 0xed, 0xdb, 0x6c, 0x78, 0x74, 0x44, 0x87, 0xb7, 0x7f, 0x83, 0x0e, 0xd9, 0x1d, 0xca, 0xe8, 0x1d, 0x4a, 0xdd, 0xca, 0xf1, 0x47, 0x47, 0x47, 0x73, 0xe9, 0x74, 0x3a, 0x87, 0x2d, 0x74, 0x73, 0x80, 0xe7, 0x56, 0xc4, 0x1f, 0x1d, 0x65, 0xc3, 0x74, 0x9a, 0x0e, 0x47, 0x5f, 0x01, 0xfc, 0x1c, 0x1d, 0x52, 0x51, 0x07, 0x34, 0x67, 0x30, 0x8e, 0x0f, 0xb8, 0xb3, 0xa5, 0x52, 0x69, 0x16, 0x5b, 0xe8, 0xce, 0x12, 0xa8, 0x80, 0x3b, 0x2b, 0xf1, 0xd3, 0x69, 0x36, 0x2c, 0x95, 0xe8, 0x30, 0x5d, 0x04, 0xfc, 0x59, 0x3a, 0x24, 0x50, 0xe9, 0x2c, 0xe0, 0xcf, 0x4a, 0xfc, 0x5e, 0xaf, 0xd7, 0xac, 0xd7, 0xeb, 0x4d, 0x6c, 0xa1, 0xcb, 0x2b, 0x31, 0x08, 0xb6, 0x88, 0xdf, 0xeb, 0xb1, 0x61, 0xbd, 0x4e, 0x87, 0xbd, 0x6d, 0xc0, 0x6f, 0x02, 0xcd, 0x26, 0xa5, 0x06, 0x54, 0x6c, 0xbf, 0x79, 0x7c, 0xfc, 0xe2, 0x31, 0x96, 0x87, 0x0f, 0x8e, 0x8f, 0x87, 0xc3, 0xe3, 0x87, 0xc3, 0xe1, 0x03, 0xec, 0xc2, 0x3f, 0x0f, 0xbf, 0x33, 0x1c, 0xbe, 0xe4, 0xc2, 0xf9, 0x38, 0xc0, 0xf9, 0xbc, 0x08, 0xfc, 0x81, 0xc4, 0x97, 0x2d, 0xf4, 0x03, 0xf0, 0x87, 0x92, 0xfe, 0x43, 0x89, 0xff, 0xd0, 0xc7, 0xff, 0x42, 0xbd, 0xfe, 0x13, 0xf5, 0x9b, 0xdb, 0xf5, 0xfa, 0xf6, 0x4d, 0x51, 0x7b, 0x3d, 0xde, 0xc2, 0xc8, 0xcd, 0xbd, 0x5e, 0xef, 0x05, 0x33, 0x9d, 0xfe, 0x58, 0x7a, 0xf4, 0x95, 0x74, 0xfa, 0x95, 0x4f, 0xa6, 0xd5, 0x16, 0xee, 0x3e, 0xf9, 0x89, 0xd1, 0xd1, 0xe7, 0xde, 0x39, 0x3a, 0x4a, 0x1d, 0x7d, 0xf9, 0xed, 0x23, 0x5e, 0xdf, 0xfe, 0xf2, 0x91, 0x7b, 0x0f, 0x77, 0x6f, 0xff, 0xca, 0x97, 0xbe, 0x34, 0x32, 0x59, 0x2a, 0x5d, 0x28, 0x15, 0x5f, 0x2d, 0xf1, 0xfa, 0x6a, 0x1a, 0xb4, 0x8c, 0x6d, 0xb1, 0x54, 0x84, 0x7f, 0x91, 0x36, 0xb7, 0x37, 0xda, 0x9e, 0x5f, 0x5f, 0xe7, 0xf7, 0xbf, 0x0c, 0x7e, 0xc0, 0x0c, 0x8a, 0xba, 0xed, 0xb3, 0x3b, 0x06, 0x03, 0xdb, 0x0f, 0xee, 0x80, 0xfd, 0x8f, 0x64, 0x45, 0x7f, 0x30, 0xe8, 0x60, 0xc8, 0xd8, 0x70, 0xc8, 0xed, 0x8d, 0xb6, 0x4f, 0xdf, 0x83, 0x16, 0xaf, 0x74, 0xfa, 0xa7, 0xc1, 0x0f, 0x3c, 0xfc, 0x1c, 0xa5, 0x60, 0x7b, 0x5e, 0x73, 0x69, 0xca, 0xb8, 0x1f, 0x8c, 0xfa, 0xf8, 0xdc, 0xde, 0x68, 0xfb, 0xfb, 0xf7, 0xef, 0xcf, 0x96, 0x66, 0x67, 0xf1, 0x1e, 0x69, 0x78, 0xf8, 0xb3, 0x94, 0x82, 0xed, 0xe9, 0x7d, 0xa8, 0xb3, 0x25, 0xca, 0xb8, 0x1f, 0xa4, 0x7d, 0x7c, 0x6e, 0x6b, 0xb4, 0x7d, 0x1d, 0xdb, 0xaf, 0xf0, 0xfb, 0x5f, 0x04, 0x3f, 0xf0, 0xf0, 0x9b, 0x06, 0x03, 0xdb, 0x0f, 0x9a, 0x60, 0xff, 0xba, 0xac, 0xe8, 0x0f, 0x2e, 0x3e, 0x84, 0x81, 0x11, 0xe7, 0x03, 0x38, 0xae, 0xc2, 0xc3, 0x3e, 0x10, 0x84, 0x47, 0x7d, 0x20, 0x00, 0xd7, 0xf8, 0x80, 0x0b, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0x38, 0xc2, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0xae, 0x8d, 0x5f, 0x5e, 0xd2, 0xb9, 0x1c, 0xbb, 0xa7, 0x8b, 0x5f, 0x80, 0x83, 0x3d, 0xa1, 0xde, 0x83, 0x6a, 0x3c, 0x83, 0xb2, 0x7d, 0xdd, 0x7e, 0xc1, 0xf8, 0x21, 0x15, 0x74, 0xae, 0x48, 0x65, 0x84, 0x57, 0x50, 0x7f, 0x09, 0x4b, 0x04, 0xfe, 0xed, 0x17, 0xbd, 0x39, 0xa5, 0x0b, 0x86, 0xc1, 0xeb, 0xf7, 0x1f, 0x3f, 0xe6, 0xed, 0xb7, 0x5e, 0x3c, 0x2e, 0xa9, 0xc5, 0x85, 0xab, 0xf3, 0x94, 0x62, 0x7c, 0xc4, 0x8b, 0x1f, 0xbf, 0xd8, 0xde, 0x63, 0xd1, 0xf8, 0x35, 0x30, 0x66, 0x07, 0x10, 0xbb, 0xdc, 0x07, 0xc2, 0xf1, 0xfb, 0x2c, 0x78, 0x78, 0xf4, 0xf8, 0xb1, 0x71, 0x5e, 0x7e, 0x3c, 0x05, 0x35, 0xff, 0xee, 0xcb, 0x50, 0x3f, 0x80, 0xca, 0x5e, 0x86, 0xfa, 0x81, 0x68, 0x1f, 0x7f, 0x60, 0x3c, 0x32, 0x00, 0xf0, 0xc8, 0x9d, 0xf0, 0xd8, 0x78, 0x04, 0x80, 0x77, 0x61, 0xc2, 0x23, 0x26, 0x27, 0x3d, 0x7a, 0x8c, 0x7f, 0xe2, 0x16, 0xf0, 0xd5, 0x2a, 0xc1, 0xe7, 0xe5, 0xff, 0x42, 0x21, 0x44, 0x54, 0xc8, 0xe6, 0x94, 0x30, 0x5e, 0xd5, 0x42, 0x19, 0x01, 0x10, 0x54, 0x8a, 0x59, 0x01, 0x27, 0xb1, 0x50, 0x92, 0x45, 0x38, 0x5c, 0x4c, 0xe0, 0x62, 0x1b, 0x24, 0x00, 0xb4, 0x99, 0x21, 0xc6, 0x99, 0xec, 0x07, 0xf0, 0xc5, 0x18, 0x87, 0xcb, 0xb9, 0xc1, 0xf5, 0x99, 0xa0, 0xef, 0xae, 0xc1, 0x48, 0x64, 0x7d, 0xe4, 0x5f, 0xe0, 0x1b, 0xa2, 0xba, 0x20, 0x48, 0xe2, 0x71, 0xd5, 0x67, 0x4f, 0xa1, 0x8f, 0x17, 0xd1, 0xc8, 0x47, 0xdd, 0xb5, 0x19, 0xbf, 0x0f, 0x8a, 0xe7, 0xeb, 0x4c, 0xa7, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x0b, 0xf3, 0x0f, 0xf3, 0x09, 0xe5, 0x55, 0x8b, 0xcf, 0x08, 0xa8, 0x9e, 0x79, 0x15, 0xfb, 0x01, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x06, 0xe1, 0x1e, 0xdf, 0xae, 0x7d, 0x0c, 0xaa, 0xb1, 0x2f, 0x13, 0x95, 0xdb, 0x88, 0x69, 0x9c, 0x84, 0xfa, 0x35, 0x62, 0x5f, 0x29, 0x23, 0x95, 0xf6, 0x0b, 0xef, 0x0a, 0x24, 0x0c, 0xfd, 0xc7, 0x70, 0x6d, 0xac, 0xf3, 0x1f, 0x4e, 0x5b, 0x87, 0x1f, 0xf2, 0x0f, 0x1a, 0xf5, 0x0f, 0x5d, 0xab, 0x4c, 0x00, 0x25, 0xa1, 0x76, 0xf1, 0x0f, 0x1d, 0x99, 0x45, 0xfd, 0xcb, 0xb5, 0xaf, 0x6c, 0x23, 0xd2, 0x73, 0xbd, 0x68, 0x78, 0x53, 0x79, 0x64, 0x44, 0x8b, 0x8b, 0x8b, 0x4b, 0xbd, 0x11, 0x1e, 0x43, 0x46, 0x50, 0x7e, 0xd7, 0x9f, 0x5c, 0xbb, 0xd0, 0xc8, 0xb6, 0x0a, 0xd7, 0xa5, 0xc2, 0xc7, 0x35, 0xee, 0xe3, 0xe1, 0xd3, 0x18, 0x7c, 0xd5, 0x7f, 0x5d, 0x1d, 0x47, 0xe8, 0x13, 0x29, 0x1f, 0x91, 0xfc, 0x86, 0xd8, 0x67, 0x32, 0xce, 0x58, 0x14, 0xec, 0xe9, 0x5d, 0xda, 0x98, 0x6a, 0xf4, 0xeb, 0xf2, 0xe5, 0xd6, 0x88, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x18, 0x11, 0xff, 0x34, 0x7c, 0x0f, 0x89, 0xfa, 0x1f, 0xf1, 0x69, 0xf0, 0x36, 0xa2, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xd8, 0xf8, 0x60, 0xc1, 0xfc, 0x45, 0x45, 0x0e, 0x71, 0x07, 0x88, 0x77, 0x4f, 0x95, 0xf1, 0x18, 0xb5, 0xa9, 0xee, 0xe7, 0xd6, 0x38, 0xd7, 0xa1, 0x71, 0xae, 0xa5, 0xf8, 0x95, 0x9a, 0xb3, 0xd4, 0xfc, 0x96, 0xe8, 0x9b, 0xd4, 0x90, 0xb9, 0x57, 0x86, 0x1e, 0x73, 0xf3, 0xad, 0xc6, 0xb4, 0x2c, 0x6a, 0x62, 0xc8, 0x94, 0x04, 0xb2, 0x0e, 0x61, 0xea, 0x25, 0xfb, 0x6a, 0x7e, 0x85, 0x2e, 0x66, 0x2f, 0x03, 0xdb, 0x40, 0x7e, 0x95, 0xb1, 0x8d, 0x19, 0x8a, 0x40, 0x87, 0x78, 0x36, 0x24, 0x9e, 0xee, 0xb9, 0x0c, 0x8a, 0x6f, 0x04, 0x63, 0x90, 0xb8, 0xcc, 0x73, 0x39, 0x71, 0x59, 0xa2, 0xba, 0x30, 0x23, 0x7e, 0xdc, 0xb9, 0xcf, 0x31, 0xe2, 0xeb, 0x82, 0x10, 0x42, 0x24, 0x95, 0x60, 0x2b, 0xc7, 0x55, 0xe7, 0xa1, 0x82, 0x71, 0x10, 0x84, 0xf1, 0x34, 0x71, 0x5e, 0xce, 0xcb, 0x59, 0x2f, 0xfc, 0x88, 0x6c, 0x38, 0x1c, 0x0e, 0xf0, 0x4d, 0x1f, 0x0b, 0x6f, 0xfb, 0x7d, 0xd9, 0x0e, 0x25, 0xb8, 0xaf, 0x82, 0xfb, 0x7d, 0x31, 0x7d, 0x28, 0x5a, 0xbf, 0x68, 0xe8, 0x84, 0xc0, 0x11, 0x3a, 0xe7, 0x16, 0xf8, 0xf1, 0x96, 0x41, 0x1f, 0x0d, 0x09, 0x76, 0x83, 0x8a, 0x06, 0x62, 0xd1, 0x32, 0x54, 0x4a, 0x3f, 0x0c, 0x74, 0xfd, 0x04, 0xe9, 0xc4, 0xe0, 0xbb, 0x7e, 0xa2, 0xc5, 0x3f, 0xb7, 0xc0, 0x47, 0x28, 0xfe, 0x35, 0x95, 0xf9, 0x66, 0xed, 0xc7, 0x54, 0x1d, 0x3e, 0x06, 0x38, 0x8c, 0x0d, 0x86, 0x3a, 0x7c, 0x3c, 0x57, 0x1a, 0x62, 0xed, 0xc7, 0xe1, 0x0f, 0x86, 0xa2, 0x32, 0x2d, 0x3e, 0xe2, 0xf1, 0x7a, 0xea, 0xfa, 0x51, 0xfc, 0x61, 0xa8, 0x6a, 0xf0, 0x87, 0x6a, 0x4d, 0xe4, 0x5f, 0x8f, 0xef, 0xc9, 0x3e, 0x90, 0x2a, 0x54, 0xf1, 0x55, 0xd9, 0xf1, 0xfe, 0xf4, 0xf8, 0x83, 0xe0, 0x82, 0xb8, 0x91, 0x95, 0xb1, 0x98, 0x00, 0x65, 0x4f, 0x58, 0xd4, 0x60, 0x66, 0x61, 0x7b, 0xeb, 0x79, 0x51, 0x6c, 0x1d, 0xe5, 0x45, 0xca, 0x19, 0x8b, 0x2f, 0x6d, 0x9c, 0x80, 0xcf, 0x06, 0x49, 0xf8, 0x7d, 0xf6, 0x83, 0xe1, 0x2b, 0x76, 0x8a, 0xc3, 0x77, 0x6d, 0xfd, 0x83, 0xac, 0x3f, 0x48, 0xc2, 0xef, 0x27, 0xe0, 0x87, 0x4b, 0x5f, 0xf0, 0xcc, 0xeb, 0xe0, 0x09, 0x6a, 0x42, 0x5c, 0xfa, 0xf1, 0xf9, 0x14, 0xce, 0xa1, 0x8b, 0x7f, 0x96, 0x9c, 0x07, 0x92, 0xf0, 0x07, 0x49, 0xf8, 0xfd, 0x53, 0xf1, 0x07, 0xc3, 0x24, 0x7c, 0x2f, 0x7f, 0x7c, 0x88, 0xf5, 0x03, 0xf1, 0xab, 0xc7, 0xf7, 0xe2, 0xff, 0x43, 0xf2, 0x3f, 0x48, 0xc2, 0x77, 0xf3, 0x80, 0xea, 0xbb, 0x31, 0xcf, 0x4f, 0xd5, 0x77, 0x4e, 0x8d, 0xed, 0xa7, 0xc9, 0x03, 0x2c, 0xce, 0xaf, 0x82, 0xbc, 0x68, 0x7c, 0x6a, 0x10, 0x8a, 0x1f, 0x2f, 0x5f, 0x47, 0xf0, 0x87, 0x4a, 0xbe, 0xd6, 0xe3, 0x0f, 0xdc, 0xf8, 0x1b, 0x68, 0xf1, 0x65, 0x9e, 0xef, 0x27, 0xae, 0x9f, 0x80, 0x1f, 0xcd, 0xf7, 0x71, 0xf8, 0x81, 0x3c, 0x10, 0xc6, 0x8f, 0x5f, 0x7f, 0x30, 0x54, 0x72, 0xc0, 0x40, 0xc7, 0xbf, 0x9b, 0x03, 0xfa, 0x4f, 0x61, 0xcb, 0xbe, 0x94, 0xe5, 0x63, 0x5f, 0xfb, 0xd4, 0xf9, 0x26, 0xe5, 0xbc, 0x9c, 0x97, 0xf3, 0x92, 0xb0, 0x89, 0x57, 0xaa, 0x61, 0x44, 0xbf, 0x9f, 0x50, 0xc3, 0x48, 0xfa, 0x52, 0x4f, 0xc5, 0xd1, 0x74, 0xa0, 0x0d, 0x9f, 0xbf, 0x12, 0x79, 0x0c, 0x87, 0x37, 0xd1, 0xe3, 0x57, 0xff, 0xdc, 0x95, 0xba, 0xfd, 0xd0, 0x11, 0x24, 0xc7, 0x27, 0xe2, 0xec, 0x8e, 0x92, 0xe8, 0xf9, 0x32, 0x4d, 0x92, 0xcf, 0x3d, 0xd3, 0x25, 0xea, 0x71, 0x5d, 0xe4, 0xf8, 0xd8, 0xab, 0x54, 0x73, 0xfc, 0x4e, 0x88, 0x38, 0xf6, 0xe7, 0xc7, 0x7e, 0x44, 0x7f, 0x44, 0x4f, 0x59, 0xfc, 0x19, 0xae, 0xfa, 0x29, 0x23, 0x8e, 0x5f, 0xfa, 0x04, 0x6f, 0xb3, 0x94, 0x44, 0xcf, 0xef, 0x8d, 0x88, 0xfe, 0xa2, 0x74, 0x99, 0x3c, 0x3d, 0x65, 0xd1, 0xcf, 0x17, 0xde, 0xf9, 0xae, 0xeb, 0x03, 0xe1, 0xef, 0x63, 0xcc, 0xfb, 0xbe, 0x26, 0xa7, 0x44, 0xe0, 0xc4, 0xfb, 0xee, 0x46, 0x68, 0x3c, 0x7d, 0x46, 0xdd, 0xb9, 0x46, 0x04, 0x9f, 0x29, 0xeb, 0xe8, 0x3e, 0xbf, 0xb8, 0x70, 0x1d, 0xff, 0xea, 0xfa, 0x9a, 0xcf, 0x7f, 0x12, 0x9f, 0x04, 0x5a, 0x3d, 0x5c, 0x18, 0x87, 0xb2, 0x78, 0x9d, 0xeb, 0xf4, 0x1f, 0x86, 0x47, 0xec, 0xab, 0xd8, 0x46, 0xe7, 0x7f, 0xaa, 0xed, 0x75, 0x3e, 0x10, 0xc0, 0xd3, 0x7d, 0xde, 0x52, 0xe4, 0xd7, 0xc6, 0xaf, 0xf4, 0x5b, 0x7e, 0xf6, 0xad, 0x59, 0xc3, 0x95, 0x9f, 0x57, 0x26, 0xda, 0xb0, 0xfd, 0x05, 0xcc, 0x6f, 0xf5, 0xf8, 0x71, 0xf6, 0x51, 0xe8, 0x6b, 0xf0, 0x55, 0xfb, 0xc7, 0xf9, 0x57, 0x00, 0xae, 0x91, 0x9f, 0x8f, 0x53, 0xa2, 0xd8, 0x51, 0x75, 0xbf, 0xa0, 0x6c, 0x61, 0xf9, 0xa8, 0xfb, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0xa6, 0xf1, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x75, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x73, 0xf3, 0x1f, 0xd3, 0xf9, 0x07, 0x89, 0x2a, 0x41, 0x67, 0x9f, 0x38, 0xfe, 0xc3, 0x30, 0x12, 0x7d, 0x7e, 0x10, 0xe2, 0xeb, 0x90, 0x51, 0xbd, 0xfd, 0x55, 0x39, 0x83, 0xf1, 0x4b, 0x44, 0x55, 0xf9, 0x0c, 0xdb, 0x5f, 0xc9, 0x2d, 0x91, 0xcf, 0x68, 0x2c, 0xf4, 0x7c, 0x49, 0xf8, 0xbc, 0xe8, 0xdf, 0x44, 0x9f, 0x09, 0xde, 0xf3, 0x87, 0xc4, 0x7c, 0xbe, 0x7d, 0xc2, 0x6f, 0x4a, 0x61, 0xff, 0xd5, 0x2c, 0xa9, 0xc5, 0xc1, 0xdc, 0x2d, 0xf2, 0xb7, 0xc6, 0x7f, 0x43, 0x3e, 0xa0, 0xc3, 0x67, 0xee, 0x27, 0x60, 0x16, 0x4d, 0x90, 0x49, 0xf4, 0x83, 0xcf, 0x28, 0x4d, 0x0e, 0xc4, 0x3d, 0x05, 0x91, 0x7b, 0x0b, 0xed, 0xf3, 0x4f, 0xe6, 0x38, 0x19, 0x47, 0x46, 0x28, 0x46, 0x99, 0x26, 0x07, 0x45, 0x04, 0x34, 0xe2, 0xfd, 0x33, 0x9c, 0xfc, 0x89, 0x8e, 0xbe, 0x9a, 0x1f, 0x35, 0xf6, 0x55, 0xab, 0xa1, 0x91, 0xdf, 0x7d, 0x36, 0xf2, 0xf8, 0x27, 0x1a, 0x78, 0x12, 0xff, 0xa1, 0x18, 0xd6, 0x3d, 0x43, 0x4e, 0xcf, 0x01, 0x21, 0xfb, 0xd0, 0x98, 0x67, 0x80, 0x46, 0x3d, 0xaa, 0xfd, 0xb5, 0xf1, 0x1f, 0xb6, 0x9d, 0x4e, 0xfe, 0x84, 0xf8, 0x0f, 0xc7, 0xb0, 0xce, 0x97, 0x03, 0x39, 0x80, 0xea, 0xf4, 0x4b, 0xbc, 0x6f, 0xe8, 0x3a, 0x78, 0x58, 0x76, 0x9a, 0x94, 0x03, 0x62, 0xe2, 0x9f, 0xc6, 0xc4, 0xbf, 0x41, 0x34, 0x55, 0x17, 0xff, 0x2c, 0x26, 0xfe, 0xc5, 0x07, 0x67, 0xe3, 0xd9, 0xfc, 0x5a, 0xf6, 0xbc, 0x9c, 0x97, 0xf3, 0x72, 0x5e, 0x82, 0xfb, 0x03, 0xaa, 0xbc, 0x96, 0xd0, 0x68, 0xea, 0x31, 0x48, 0xc2, 0xfe, 0x81, 0x10, 0xef, 0x27, 0x94, 0x5e, 0x1b, 0xc9, 0xff, 0x6a, 0xab, 0x49, 0x8f, 0x81, 0x77, 0x57, 0x12, 0x73, 0x3c, 0xe1, 0xfe, 0x34, 0x87, 0xe8, 0xf9, 0x8f, 0x67, 0x30, 0x24, 0x23, 0xd1, 0xef, 0xcf, 0xa8, 0xa1, 0x7f, 0x7f, 0x76, 0x65, 0x74, 0xcf, 0x21, 0xe2, 0x74, 0xc8, 0x4e, 0x3b, 0x87, 0x08, 0x1d, 0x47, 0x18, 0xd1, 0x6d, 0xce, 0x13, 0xdb, 0xcb, 0x88, 0x3f, 0x02, 0xd0, 0x9e, 0x19, 0xa8, 0x3f, 0x6d, 0x62, 0x3a, 0xde, 0x15, 0xf9, 0x75, 0x8f, 0x37, 0x95, 0x7e, 0x12, 0xdc, 0xd0, 0xd0, 0x27, 0x8a, 0x6f, 0xe8, 0x9e, 0x7f, 0x8c, 0x28, 0x8f, 0x4d, 0xa2, 0xdf, 0x7e, 0x11, 0x23, 0xe8, 0x63, 0x11, 0xbd, 0x91, 0xe0, 0x31, 0x4f, 0x84, 0x3e, 0x49, 0xc6, 0x4f, 0xe2, 0xcf, 0x48, 0x88, 0x0d, 0x1d, 0x3c, 0xe1, 0x78, 0x26, 0x76, 0x2f, 0xee, 0xf2, 0xc4, 0xb4, 0x7b, 0x9b, 0xc4, 0x9f, 0x27, 0x06, 0xe4, 0xd7, 0xf1, 0x48, 0x55, 0xf9, 0x0d, 0x7d, 0xfc, 0xa8, 0xfa, 0x21, 0xba, 0xed, 0x0d, 0x09, 0xb6, 0x3a, 0xfb, 0x78, 0xc7, 0x6b, 0x31, 0xf8, 0x71, 0xfe, 0xa7, 0xda, 0x5f, 0xeb, 0x5f, 0x21, 0x38, 0x89, 0x5b, 0x3f, 0x26, 0x3f, 0x10, 0x72, 0x8a, 0x7c, 0xa1, 0xfc, 0x10, 0xe7, 0x5f, 0x46, 0xf0, 0xa7, 0x81, 0x51, 0xfa, 0x31, 0xb9, 0x32, 0xbc, 0xf5, 0xd3, 0xd1, 0x67, 0xa1, 0x18, 0x4d, 0xd2, 0x1f, 0x89, 0xb1, 0x1f, 0x89, 0xe1, 0x2f, 0x60, 0x3f, 0x9d, 0xfe, 0x42, 0x3a, 0x8a, 0xb3, 0x1f, 0x53, 0x64, 0xd4, 0xe9, 0x3f, 0x2e, 0xfe, 0xc3, 0xfa, 0x8d, 0xd3, 0xdf, 0x69, 0xf6, 0x23, 0xa7, 0xe8, 0xdf, 0xe3, 0x31, 0x06, 0x9f, 0xc6, 0xd9, 0x47, 0x81, 0xeb, 0xf8, 0x0b, 0xe7, 0x17, 0xa6, 0x3b, 0xff, 0x53, 0xe5, 0x3b, 0x25, 0x86, 0x75, 0xc7, 0xef, 0x01, 0xff, 0x8b, 0xb1, 0xcf, 0x13, 0x1f, 0xe7, 0x13, 0xe3, 0xa9, 0xdf, 0xff, 0x59, 0x28, 0x4f, 0x84, 0x79, 0x67, 0x46, 0x7c, 0xfc, 0x86, 0x73, 0x00, 0x8d, 0xf9, 0x79, 0x78, 0x9c, 0x7d, 0x03, 0x39, 0x2a, 0x0e, 0x3f, 0xe4, 0x47, 0x46, 0x42, 0x8e, 0x0b, 0x9f, 0x91, 0x12, 0x4d, 0x0c, 0xc5, 0xe5, 0x6e, 0x2d, 0x7d, 0x12, 0x0c, 0x64, 0xa2, 0xa1, 0x4f, 0x94, 0xa3, 0x23, 0x5d, 0xfc, 0x26, 0xe5, 0x17, 0x5d, 0x0e, 0x30, 0x8c, 0xe4, 0x1c, 0x60, 0x24, 0xc4, 0x30, 0x35, 0x92, 0xf1, 0x59, 0x5c, 0x0e, 0x55, 0xed, 0xa3, 0x89, 0x11, 0x16, 0xff, 0x78, 0xf4, 0x8f, 0x9f, 0xe3, 0xf6, 0x17, 0x24, 0x7e, 0xff, 0x15, 0x8e, 0x61, 0x7a, 0x1a, 0xdc, 0x88, 0x87, 0xeb, 0xe2, 0x3f, 0xbc, 0x7f, 0x23, 0x09, 0xf4, 0xe3, 0xbe, 0xcf, 0xb8, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x8d, 0x8f, 0x69, 0xfd, 0x83, 0xe8, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x0d, 0x7a, 0x57, 0x77, 0x7d, 0xe7, 0xbb, 0xba, 0xeb, 0x2c, 0xbc, 0x9c, 0xb0, 0x6f, 0xe8, 0xae, 0xc1, 0x43, 0xdd, 0x75, 0x26, 0x5e, 0xc6, 0xfe, 0x9f, 0xd9, 0xf7, 0x9b, 0xef, 0x85, 0x2f, 0xb4, 0xef, 0xa3, 0xf7, 0xc3, 0xd7, 0xb9, 0x7d, 0xcf, 0x8a, 0x7d, 0xf1, 0x8a, 0xda, 0x17, 0xaf, 0x73, 0xfb, 0x9e, 0xdb, 0xf7, 0xa3, 0x5e, 0x4e, 0x34, 0xe6, 0xed, 0xdf, 0x3d, 0xd1, 0x98, 0x77, 0x78, 0x26, 0xec, 0x7b, 0xa2, 0x31, 0xef, 0xb7, 0x1f, 0x9c, 0x68, 0xcc, 0xfb, 0xc1, 0x83, 0xb3, 0x20, 0xef, 0xd7, 0xff, 0x20, 0x6a, 0xe0, 0xe3, 0x07, 0xff, 0xf8, 0x4f, 0x51, 0x03, 0x1f, 0x9f, 0x09, 0x79, 0xff, 0xe2, 0x2f, 0x75, 0xf1, 0xfb, 0xdf, 0xff, 0x73, 0x66, 0xf3, 0x73, 0xff, 0x2e, 0xff, 0x93, 0xe5, 0xee, 0x09, 0x2f, 0x10, 0xac, 0xfc, 0x4f, 0x96, 0xef, 0x8a, 0xd1, 0x33, 0x91, 0x9f, 0xdf, 0x7d, 0x8f, 0xff, 0xc9, 0xf2, 0xde, 0xc9, 0xc9, 0xbd, 0xfb, 0x27, 0x27, 0x8f, 0xfe, 0xf9, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x27, 0x27, 0xdf, 0xfb, 0xab, 0xb3, 0x21, 0xef, 0x49, 0xa4, 0xfc, 0xe1, 0xb7, 0x4e, 0x34, 0xe5, 0x5f, 0xbe, 0x7f, 0x46, 0xe4, 0x7d, 0xe7, 0x57, 0x03, 0x72, 0x7d, 0xe5, 0xab, 0xbf, 0xfb, 0x7b, 0xbf, 0xff, 0xb5, 0x93, 0x5f, 0xfb, 0xf5, 0xc0, 0xe8, 0xdf, 0xfe, 0xdd, 0x5f, 0xff, 0xcd, 0xdf, 0xff, 0xc3, 0x99, 0x90, 0xf7, 0x37, 0x7f, 0x2b, 0x20, 0xd9, 0x9f, 0xfc, 0xe9, 0x1f, 0xfd, 0xf1, 0x9f, 0xfd, 0xf9, 0xc9, 0x6f, 0xff, 0x4e, 0x60, 0xf4, 0xdf, 0xff, 0xe3, 0x5f, 0xff, 0xed, 0x3f, 0xff, 0x6b, 0xe4, 0xae, 0x61, 0x7c, 0x9c, 0x5f, 0x2f, 0x8f, 0xe0, 0xf5, 0x93, 0xfc, 0xe2, 0xf7, 0xc6, 0x93, 0x5c, 0xfc, 0x7f, 0xc7, 0x32, 0x2e, 0xe0, 0xf5, 0x3c, 0x5c, 0x2f, 0xc0, 0x45, 0x2e, 0x90, 0x11, 0x23, 0x78, 0x91, 0xd0, 0xa5, 0x52, 0xb8, 0x00, 0x24, 0x7e, 0xc9, 0x78, 0xc9, 0x78, 0xe9, 0xb9, 0x97, 0x9e, 0x7b, 0xb2, 0x35, 0xc3, 0xd7, 0xf3, 0x1f, 0x1f, 0xf9, 0x29, 0x63, 0x63, 0xb1, 0xbc, 0x5c, 0xb6, 0x52, 0x6f, 0xa5, 0x46, 0xe6, 0xaf, 0xaf, 0xad, 0xaf, 0xae, 0x59, 0xa9, 0x11, 0xb8, 0x1f, 0x99, 0x5b, 0x5b, 0x5b, 0xbd, 0x61, 0xcd, 0x4c, 0xe7, 0xe0, 0x7e, 0x71, 0x6e, 0x65, 0xc1, 0x9a, 0xb9, 0x88, 0xb7, 0x4b, 0xaf, 0x97, 0xe7, 0x96, 0xad, 0x99, 0x19, 0xb8, 0xbf, 0x95, 0x4b, 0x01, 0xce, 0xea, 0x42, 0xd9, 0x94, 0x28, 0xaf, 0x5f, 0x31, 0xb1, 0x58, 0x53, 0x7c, 0xe6, 0x65, 0xb7, 0x57, 0xc4, 0xde, 0xfa, 0xc6, 0xda, 0xd2, 0xca, 0x15, 0xd3, 0xe2, 0xf4, 0x56, 0xae, 0x2f, 0xbf, 0x5e, 0x5e, 0x03, 0xd0, 0x14, 0xf6, 0x3e, 0x53, 0xfe, 0xf9, 0x1b, 0xab, 0x6b, 0x0b, 0x56, 0x09, 0x3b, 0x73, 0xd7, 0x96, 0x38, 0x16, 0x27, 0x31, 0xbf, 0xba, 0xbc, 0x5c, 0x5e, 0xd9, 0xb0, 0xa6, 0x38, 0xd6, 0xfa, 0xd2, 0x95, 0x15, 0x4e, 0x90, 0x4f, 0x5c, 0x2f, 0x5f, 0x2d, 0xcf, 0x6f, 0x98, 0x12, 0x26, 0x58, 0x37, 0x2d, 0xb1, 0xd6, 0xe2, 0xdc, 0xc2, 0xea, 0x0d, 0xd3, 0xea, 0x3a, 0xfb, 0x36, 0xa7, 0x79, 0x75, 0x63, 0xf3, 0xf2, 0x2a, 0xd0, 0xa9, 0x57, 0x9a, 0x1d, 0x3e, 0xb2, 0x3c, 0xb7, 0x31, 0xbf, 0xb8, 0xb9, 0x50, 0xbe, 0xba, 0xb4, 0xbc, 0xb4, 0x51, 0x5e, 0x5b, 0x77, 0xa7, 0x72, 0x91, 0xae, 0xcc, 0x2d, 0x97, 0xaf, 0xcd, 0x2d, 0x48, 0xa1, 0x36, 0x56, 0xaf, 0xcf, 0x2f, 0xc2, 0x3d, 0xef, 0x00, 0xa9, 0x6b, 0x8b, 0x73, 0xd6, 0xd4, 0x6b, 0x93, 0x48, 0xe5, 0x96, 0xc0, 0xb8, 0x95, 0x4a, 0xcd, 0x2f, 0x96, 0xe7, 0x3f, 0xb3, 0xb9, 0x52, 0xbe, 0xb1, 0xf9, 0x06, 0x50, 0x5b, 0x5a, 0x5d, 0xe1, 0x04, 0x53, 0x2b, 0xab, 0x9b, 0xeb, 0xab, 0xd7, 0x41, 0x77, 0x7c, 0xe1, 0xd4, 0x95, 0xa5, 0xcb, 0x9b, 0x57, 0xcb, 0x2b, 0x57, 0x36, 0x16, 0xad, 0xe2, 0xa4, 0x99, 0xcf, 0x9b, 0x8d, 0x96, 0xd9, 0xb1, 0xab, 0xed, 0x56, 0xad, 0x93, 0x9a, 0x5f, 0xdb, 0xd8, 0x5c, 0x5e, 0x5d, 0x59, 0xda, 0x00, 0x03, 0xf8, 0xb3, 0xd7, 0xe7, 0xe7, 0xae, 0x96, 0xad, 0x52, 0xea, 0xfa, 0x92, 0xbc, 0x9d, 0x4e, 0xa5, 0xf2, 0xf1, 0x25, 0x55, 0xdf, 0x6f, 0x55, 0xbb, 0x8d, 0x76, 0xcb, 0xdc, 0x58, 0x9a, 0xcf, 0x64, 0x53, 0x23, 0xd5, 0x66, 0x07, 0x9b, 0x66, 0xbb, 0x5a, 0x69, 0x9a, 0xcd, 0xca, 0x96, 0xdd, 0xb4, 0xd2, 0x1b, 0x3b, 0x8d, 0x8e, 0x09, 0x7f, 0x9d, 0xc3, 0x4e, 0xd7, 0xde, 0x35, 0x61, 0xf9, 0x7a, 0x63, 0x7b, 0xdf, 0xa9, 0x70, 0xbc, 0x6a, 0xc5, 0xe9, 0x3a, 0x8d, 0xda, 0xb6, 0x9d, 0x76, 0xb1, 0x3a, 0x8d, 0x37, 0x6d, 0x6b, 0xcf, 0x69, 0xb4, 0xba, 0x19, 0x4e, 0x20, 0x37, 0x99, 0xcb, 0xcf, 0x00, 0x4d, 0x75, 0x28, 0x53, 0x9c, 0x9e, 0xcc, 0xe3, 0xc4, 0xec, 0xc4, 0x44, 0x31, 0x97, 0x99, 0x2a, 0xcd, 0xc0, 0x14, 0xb8, 0xcd, 0xa6, 0xec, 0x56, 0x2d, 0xc5, 0x65, 0x43, 0x9b, 0x94, 0xd7, 0xb8, 0x9b, 0x81, 0x8a, 0x36, 0xca, 0x9f, 0xb5, 0x3e, 0xf7, 0x39, 0x50, 0xe1, 0xab, 0x37, 0x6d, 0xa7, 0x83, 0x0b, 0x4f, 0x4d, 0x4d, 0x42, 0xb7, 0xd2, 0x85, 0xd5, 0xb7, 0xf6, 0xbb, 0xb6, 0x79, 0xd3, 0xae, 0x96, 0xcc, 0xed, 0xbd, 0xfd, 0xcd, 0x37, 0x6c, 0xa7, 0x6b, 0x1f, 0x5c, 0x0a, 0x03, 0x8b, 0x1c, 0xb8, 0x61, 0x1f, 0xcc, 0xb7, 0xdb, 0x4e, 0x2d, 0x02, 0x9e, 0xe6, 0xe0, 0xf9, 0x76, 0xb3, 0xed, 0x20, 0x6c, 0xbf, 0xd5, 0xa8, 0xb7, 0x9d, 0x5d, 0x73, 0xb7, 0xd2, 0x15, 0x90, 0xe5, 0x76, 0xcd, 0x6e, 0xbe, 0xd1, 0xb0, 0x7b, 0xd7, 0x9c, 0xf6, 0x2f, 0xd8, 0x5c, 0x67, 0xcb, 0x15, 0xc0, 0xe7, 0x0b, 0xdd, 0xac, 0x38, 0x87, 0x8d, 0xd6, 0xb6, 0xa0, 0x53, 0x75, 0x69, 0x28, 0xa3, 0x45, 0xb3, 0xab, 0x2c, 0x7c, 0xb3, 0xdd, 0xa8, 0x01, 0xe5, 0x46, 0x2b, 0x83, 0x77, 0x59, 0xd7, 0x55, 0x38, 0xa2, 0x69, 0x05, 0x19, 0x19, 0x71, 0x11, 0x01, 0x80, 0x84, 0x32, 0xaa, 0x14, 0x59, 0x3e, 0x63, 0xbb, 0xb9, 0x79, 0xad, 0xdd, 0x69, 0x70, 0x73, 0x58, 0xc9, 0xcc, 0x9a, 0x63, 0x9c, 0xc7, 0x8c, 0xaf, 0xa7, 0x9c, 0x39, 0x55, 0x98, 0xe4, 0x74, 0x6e, 0xa5, 0x46, 0x3e, 0xff, 0x79, 0x70, 0xd0, 0x6b, 0x4b, 0x9f, 0x2d, 0x5f, 0xd5, 0x2a, 0x7b, 0x62, 0x62, 0xcf, 0xb1, 0xab, 0x0d, 0x3e, 0xb2, 0xd3, 0xd8, 0xde, 0xd9, 0x33, 0xeb, 0xcd, 0x76, 0xa5, 0x9b, 0x28, 0xab, 0xab, 0xc8, 0x4e, 0x65, 0x77, 0xaf, 0x69, 0x3b, 0xc5, 0x05, 0xb3, 0xd3, 0xde, 0x77, 0xaa, 0xb6, 0x0a, 0xe3, 0x54, 0xcc, 0xae, 0xb3, 0xbd, 0x79, 0xa0, 0x1f, 0x3e, 0xd4, 0x0f, 0xf7, 0xf4, 0xc3, 0x3b, 0xd1, 0xe1, 0x4e, 0xd5, 0xd1, 0xcd, 0xc6, 0x61, 0x98, 0xcd, 0x45, 0x33, 0xcb, 0xbb, 0xfb, 0xcd, 0x4a, 0xd7, 0xae, 0x41, 0x90, 0xed, 0xed, 0x77, 0x4d, 0xc7, 0xee, 0xb4, 0x9b, 0xfb, 0xa8, 0xba, 0x02, 0xca, 0x87, 0x72, 0xc1, 0x90, 0xc5, 0x6d, 0x50, 0xbc, 0x38, 0x53, 0x98, 0xcc, 0x4d, 0x4d, 0x4f, 0x73, 0xd5, 0x09, 0xf4, 0xc5, 0x8a, 0x53, 0x6b, 0xd9, 0x9d, 0x8e, 0xd9, 0xae, 0x03, 0xdd, 0x4a, 0xab, 0xd9, 0x68, 0xd9, 0x05, 0x01, 0x32, 0xf3, 0xaf, 0x15, 0x26, 0xc1, 0x34, 0x9d, 0x76, 0xbd, 0x2b, 0x46, 0xf2, 0x53, 0x33, 0x7c, 0x64, 0xd7, 0xae, 0x35, 0xf6, 0x77, 0x61, 0x4c, 0xf0, 0xb3, 0x03, 0x34, 0xd6, 0x01, 0xd7, 0x42, 0x04, 0x1d, 0xe1, 0xbd, 0xc6, 0x81, 0xdd, 0xec, 0xf0, 0x34, 0x10, 0x5c, 0x22, 0x5f, 0x0c, 0xaf, 0x30, 0xcd, 0x07, 0x90, 0x62, 0x80, 0xfc, 0xb5, 0xc6, 0x81, 0x95, 0x2f, 0xf9, 0xd4, 0x17, 0x1a, 0x9d, 0xbd, 0x66, 0xe5, 0xd0, 0xec, 0x55, 0x9c, 0x3d, 0x49, 0x6b, 0x92, 0x63, 0xb6, 0xda, 0x2d, 0x5b, 0xf4, 0xc1, 0x41, 0x26, 0x84, 0x00, 0xf6, 0x41, 0xd7, 0xb1, 0x77, 0x6d, 0x57, 0x1f, 0x88, 0x23, 0x14, 0x82, 0x53, 0x66, 0xa6, 0x51, 0x27, 0x70, 0x33, 0xfd, 0x1a, 0xaa, 0xc5, 0x94, 0x0b, 0xcc, 0xed, 0xb6, 0xf7, 0x5b, 0x5d, 0xae, 0x95, 0x9d, 0x4a, 0xad, 0xdd, 0x03, 0xc7, 0xef, 0x7c, 0xb1, 0xe0, 0xf1, 0x84, 0xbd, 0x85, 0x8a, 0xf3, 0x45, 0x6b, 0xb2, 0x70, 0xf1, 0x52, 0x60, 0xf4, 0x2a, 0x78, 0x58, 0xd7, 0x9a, 0xc2, 0x61, 0x4e, 0x29, 0xff, 0x8c, 0x8a, 0xe4, 0xab, 0xb3, 0x76, 0xe5, 0x75, 0xb3, 0xdb, 0x36, 0xaf, 0x82, 0x12, 0x2b, 0x8e, 0x14, 0x7d, 0xae, 0xd3, 0xd9, 0x47, 0x37, 0xde, 0xef, 0xe0, 0xbf, 0x62, 0xca, 0xe1, 0x1e, 0xf8, 0x04, 0xb8, 0x74, 0x77, 0x1f, 0xec, 0x6f, 0x76, 0x31, 0x19, 0x76, 0x76, 0xda, 0xfb, 0xcd, 0x1a, 0xa8, 0xa8, 0x6b, 0x6e, 0xd9, 0x66, 0xcb, 0xb6, 0x6b, 0x76, 0xcd, 0x17, 0x69, 0xa3, 0x2d, 0x68, 0x4e, 0x65, 0x44, 0xbf, 0x9a, 0x7d, 0xcb, 0xb1, 0x01, 0xbb, 0x95, 0xa9, 0xce, 0x82, 0x98, 0x93, 0xd3, 0x93, 0xd3, 0x17, 0xb3, 0x9f, 0xae, 0x4e, 0x4c, 0x15, 0x0b, 0x3f, 0x5b, 0xfc, 0xb9, 0xbd, 0x76, 0x2f, 0x93, 0xa9, 0x8e, 0xc3, 0xf8, 0xc5, 0x8b, 0xd9, 0x89, 0x29, 0x6c, 0x72, 0xc5, 0xc2, 0x74, 0xf6, 0xd2, 0x2d, 0xa1, 0xe6, 0x92, 0x47, 0x2f, 0xc3, 0x7b, 0x1e, 0x35, 0x9e, 0xf1, 0x32, 0xfe, 0x62, 0xd5, 0x82, 0x93, 0xcd, 0xa9, 0xdd, 0xed, 0x60, 0x77, 0x2b, 0x8b, 0x34, 0x85, 0x9c, 0x62, 0x14, 0xc5, 0x47, 0x19, 0x9f, 0xad, 0xf0, 0xeb, 0xce, 0xf6, 0x96, 0x4e, 0x74, 0x90, 0x70, 0xb2, 0x34, 0x55, 0x9a, 0x7c, 0xed, 0xd3, 0xd5, 0x31, 0x21, 0x3a, 0x17, 0x76, 0x0c, 0x15, 0x50, 0xcd, 0x4d, 0x16, 0xa6, 0xa7, 0x66, 0x66, 0x66, 0xb2, 0x79, 0xa1, 0x08, 0x55, 0x7a, 0x24, 0x18, 0x23, 0xbb, 0x58, 0x4b, 0x4a, 0xee, 0x76, 0xb6, 0xd5, 0x8e, 0x2a, 0xf5, 0x0a, 0xc8, 0x6c, 0x77, 0xba, 0xa6, 0xed, 0x46, 0xba, 0x48, 0x4a, 0xe6, 0x76, 0xe3, 0xa6, 0xdd, 0x12, 0x29, 0x01, 0x25, 0xdf, 0x6b, 0xc3, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xd2, 0xe2, 0x1a, 0xb0, 0x9b, 0xe0, 0xc3, 0xf5, 0x8e, 0xdd, 0x75, 0xb5, 0xd5, 0xec, 0xb4, 0xcd, 0x37, 0x6d, 0xa7, 0xfd, 0x33, 0x18, 0x99, 0x18, 0xf3, 0x8e, 0x6d, 0xbb, 0xb9, 0xa2, 0x64, 0x5e, 0xb6, 0xbb, 0xd5, 0x9d, 0x0c, 0x0f, 0x13, 0xa0, 0x94, 0xe3, 0x37, 0x30, 0x2d, 0xcb, 0x33, 0x3d, 0x8c, 0x58, 0xa8, 0xa1, 0xb6, 0x93, 0x81, 0xdb, 0x31, 0x60, 0x6a, 0x1c, 0x61, 0xe3, 0x3c, 0x96, 0x20, 0x10, 0x40, 0x1b, 0x17, 0xb3, 0xd9, 0x09, 0x18, 0xe7, 0x09, 0x5e, 0xca, 0xec, 0xf9, 0xc1, 0x54, 0xa1, 0x08, 0x89, 0x5c, 0x5a, 0xa5, 0xb8, 0x90, 0x11, 0x19, 0x35, 0x07, 0xa4, 0x0a, 0x07, 0x87, 0x39, 0x9e, 0x5b, 0xb2, 0x05, 0x90, 0xdf, 0x97, 0x1c, 0xa2, 0xbc, 0x5b, 0x69, 0x55, 0x6d, 0xcc, 0x1c, 0x9e, 0xf4, 0x32, 0x99, 0x80, 0x13, 0xb4, 0xa4, 0x62, 0xb8, 0x98, 0x5e, 0xba, 0x43, 0x24, 0x4f, 0x82, 0xec, 0x5b, 0xc8, 0xb4, 0xe4, 0xf6, 0x92, 0xe4, 0x28, 0x9f, 0x41, 0xfe, 0xf3, 0x9e, 0x24, 0xd9, 0x6c, 0xde, 0x15, 0x21, 0x2b, 0x4c, 0x38, 0x32, 0x22, 0x73, 0xc8, 0x82, 0x79, 0xa5, 0xb2, 0xdf, 0xe9, 0x34, 0x2a, 0x2d, 0xdf, 0x57, 0x70, 0x44, 0x3a, 0x0a, 0xea, 0xc8, 0xcd, 0xc9, 0x95, 0xa6, 0xed, 0xd9, 0xd9, 0x3e, 0xd8, 0x2b, 0x66, 0xf8, 0xd0, 0x18, 0xae, 0x8d, 0x6b, 0x78, 0x42, 0x95, 0xf2, 0xdd, 0xca, 0x9e, 0x47, 0xd6, 0xac, 0x37, 0x9a, 0x5d, 0xdb, 0x31, 0x2b, 0xcd, 0x36, 0xd8, 0x70, 0xa7, 0xed, 0xbc, 0x69, 0xba, 0xf9, 0x91, 0x1b, 0x64, 0x11, 0x46, 0x4a, 0xbe, 0x41, 0xc4, 0x62, 0x9e, 0x45, 0xf8, 0x94, 0x2d, 0x4b, 0x58, 0xcd, 0x35, 0x58, 0x26, 0x0f, 0x1e, 0x9a, 0xc3, 0x39, 0xe2, 0x41, 0x2b, 0x7c, 0x30, 0x3c, 0x09, 0xf3, 0x65, 0x78, 0x52, 0x2d, 0x32, 0x29, 0x48, 0x49, 0xac, 0x5e, 0xeb, 0x74, 0x2d, 0xae, 0x64, 0x14, 0xab, 0xc0, 0x9f, 0x7d, 0x28, 0xd7, 0x7c, 0xbb, 0x05, 0xcf, 0x5d, 0x00, 0xbb, 0x46, 0x03, 0x0b, 0xf5, 0x6c, 0xcc, 0x86, 0x05, 0x1f, 0x97, 0xeb, 0xc4, 0x92, 0x19, 0x5d, 0xa1, 0xd9, 0xdb, 0xb2, 0xb8, 0x5a, 0x81, 0x36, 0xe7, 0x5e, 0xa8, 0x53, 0x9d, 0x50, 0xf5, 0x26, 0x60, 0xd2, 0xd1, 0x4c, 0xa8, 0xf9, 0x13, 0x42, 0x14, 0x80, 0xb9, 0x35, 0x61, 0x17, 0xa1, 0x6c, 0x2f, 0x84, 0x0a, 0x8a, 0x9b, 0x66, 0xb6, 0xc6, 0x7a, 0x5b, 0xe3, 0xd5, 0xb1, 0x5e, 0x75, 0xbc, 0x36, 0xd6, 0xab, 0x65, 0x27, 0x32, 0xd0, 0x85, 0x0e, 0xdc, 0x7a, 0xa6, 0xbb, 0xf8, 0xd4, 0xa6, 0xbb, 0x98, 0x6c, 0xba, 0x4a, 0xc4, 0x74, 0xc5, 0xa8, 0x55, 0x7e, 0x74, 0xf6, 0xe5, 0x93, 0xec, 0xc8, 0xa4, 0xe2, 0x8f, 0xca, 0x09, 0x2a, 0xbe, 0x13, 0x14, 0xb5, 0x36, 0xfe, 0x61, 0x7a, 0x89, 0x9c, 0x60, 0xfb, 0x13, 0x8a, 0x1f, 0xc6, 0x8d, 0x2a, 0x63, 0xbd, 0xca, 0x78, 0xd0, 0x97, 0xc6, 0xed, 0xb1, 0x9e, 0x8d, 0x0e, 0x55, 0x19, 0x77, 0x7d, 0x6a, 0x1c, 0x06, 0x3c, 0xb7, 0x92, 0x54, 0xdd, 0xbd, 0x91, 0xa2, 0x30, 0xc1, 0x13, 0xee, 0xad, 0x62, 0xfd, 0x48, 0x67, 0x8e, 0x43, 0x35, 0xff, 0x7a, 0xe2, 0x00, 0x4a, 0xce, 0xdd, 0xaa, 0xf9, 0x8b, 0xcf, 0x35, 0x9b, 0xb0, 0xbb, 0xf1, 0x52, 0xe9, 0x0e, 0x3c, 0x0e, 0xb8, 0x1b, 0xf3, 0x0c, 0x6b, 0xd7, 0xeb, 0xb0, 0x0f, 0x17, 0x29, 0xd7, 0xf3, 0xeb, 0x0d, 0xa7, 0xa1, 0xe4, 0x57, 0xc5, 0x97, 0x45, 0xae, 0x42, 0x1e, 0xf3, 0xee, 0xee, 0xdc, 0xf5, 0x60, 0x11, 0x0b, 0x08, 0x42, 0xbf, 0x0c, 0xf8, 0xad, 0x8f, 0xe5, 0xed, 0xe9, 0x7d, 0x7f, 0xe0, 0xa2, 0x07, 0x29, 0x7a, 0xae, 0xe0, 0xc1, 0x7c, 0x92, 0x9e, 0x17, 0xf8, 0x30, 0x0f, 0x4f, 0xaa, 0x23, 0x68, 0x9f, 0xc0, 0xa3, 0xa6, 0xed, 0xf0, 0x27, 0xa7, 0xb2, 0x13, 0x06, 0x7c, 0x7c, 0x8e, 0xc2, 0xdb, 0x9d, 0x18, 0xc5, 0x67, 0x25, 0xc4, 0xfb, 0xde, 0x4e, 0xc5, 0x7b, 0xdc, 0xdc, 0x80, 0xdd, 0x64, 0x48, 0x1d, 0xee, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x84, 0x2f, 0xfa, 0x72, 0x7c, 0xcc, 0xdb, 0x78, 0x8e, 0x23, 0x7b, 0x85, 0xc3, 0x31, 0xfe, 0x6f, 0x76, 0x8c, 0x6f, 0x64, 0x0f, 0x72, 0x1e, 0xe0, 0x80, 0x03, 0x0e, 0x24, 0xe0, 0x30, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x38, 0xee, 0x3d, 0x5d, 0xfe, 0xd7, 0x83, 0xbb, 0x54, 0xae, 0xdb, 0x65, 0xe8, 0x44, 0x59, 0x2b, 0x1c, 0x8c, 0x5b, 0x62, 0x69, 0xbe, 0x9f, 0x76, 0x0d, 0x81, 0x98, 0x16, 0xdf, 0x9f, 0xb8, 0x7b, 0xdb, 0x5c, 0xe4, 0x46, 0x70, 0xc1, 0x69, 0x58, 0x75, 0xa7, 0x52, 0xed, 0x0a, 0x56, 0x27, 0x66, 0x5c, 0x1d, 0x37, 0xea, 0x62, 0x04, 0x76, 0x4d, 0xa5, 0x52, 0x29, 0xcb, 0xb9, 0x71, 0x2c, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0xdb, 0xba, 0x89, 0x1c, 0xb2, 0x15, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xa5, 0x5b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xc9, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x29, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0xba, 0x16, 0xbc, 0x97, 0x5e, 0x76, 0x2a, 0xdb, 0xfc, 0x55, 0x10, 0x36, 0x26, 0x62, 0x6b, 0xc0, 0xdf, 0xf2, 0x72, 0xe2, 0xad, 0x4e, 0x88, 0xca, 0x27, 0x17, 0x0e, 0x2d, 0xfe, 0x32, 0x96, 0x97, 0x3d, 0xbe, 0xe7, 0x1f, 0x71, 0x55, 0x6e, 0x71, 0xdf, 0xe0, 0xa0, 0x09, 0x8f, 0x4a, 0x4f, 0x50, 0xd9, 0xc9, 0x8a, 0x57, 0xb0, 0x11, 0x6f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x8f, 0x85, 0xe1, 0x85, 0xf6, 0x1a, 0xe3, 0xe6, 0x0b, 0x71, 0xe3, 0xbd, 0x3a, 0x7b, 0x38, 0xe2, 0x05, 0x7b, 0x5a, 0xee, 0x2a, 0x33, 0x61, 0x72, 0xd9, 0xd0, 0x9b, 0x72, 0xea, 0x56, 0xea, 0x7f, 0x01, 0x2f, 0xfb, 0xfe, 0x36, \ No newline at end of file diff --git a/config.lua b/config.lua index ca349dfe6..de049908e 100644 --- a/config.lua +++ b/config.lua @@ -2,10 +2,9 @@ THEME= { CURSOR= { - ARROW=-1, - HAND=-1, - IBEAM=-1, - PIXEL_PERFECT=true, + ARROW=64, + HAND=65, + IBEAM=66, }, CODE = @@ -244,6 +243,9 @@ CRT_SHADER= -- 048:c2ccccccc2222222c222ccccc2222cccc2222222c1111111cc000cccecccccec -- 049:ccc200cc22220ccec2220cee22220cee22220cee1111ccee000cceeecccceeee -- 052:000000000fffff00000000000000000000000000000000000000000000000000 +-- 064:ff000000fcf00000fccf0000fcccf000fccccf00fcccf000fcffcf000f00f000 +-- 065:000f000000fcf00000fcff000ffcccf0fcfccccf0fcccccf00fcccf0000fff00 +-- 066:0fff0000fcccf0000fcf00000fcf00000fcf00000fcf0000fcccf0000fff0000 -- 080:0000000000c0c00000c0c000000c00000cc0cc000cc0cc000000000000000000 -- 081:000000000cccc0000c00c0000c0ccc000ccc0c00000ccc000000000000000000 -- 082:0000000000ccc0000c000c000ccccc000cc0cc000ccccc000000000000000000 diff --git a/src/studio/config.c b/src/studio/config.c index 9f22d1b1c..4d06905b4 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -135,7 +135,6 @@ static void readCursorTheme(Config* config, lua_State* lua) readInteger(lua, "ARROW", &config->data.theme.cursor.arrow); readInteger(lua, "HAND", &config->data.theme.cursor.hand); readInteger(lua, "IBEAM", &config->data.theme.cursor.ibeam); - readBool(lua, "PIXEL_PERFECT", &config->data.theme.cursor.pixelPerfect); } lua_pop(lua, 1); diff --git a/src/studio/studio.c b/src/studio/studio.c index c47db3913..6cec04151 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1773,7 +1773,7 @@ static void renderStudio() sfx2ram(&tic->ram, sfx); music2ram(&tic->ram, music); - tic_core_tick_start(impl.studio.tic); + tic_core_tick_start(tic); } processShortcuts(); @@ -1827,7 +1827,7 @@ static void renderStudio() if(getConfig()->noSound) memset(tic->ram.registers, 0, sizeof tic->ram.registers); - tic_core_tick_end(impl.studio.tic); + tic_core_tick_end(tic); switch(impl.mode) { @@ -1914,6 +1914,48 @@ static void processMouseStates() } } +static void blitCursor() +{ + tic_mem* tic = impl.studio.tic; + tic80_mouse* m = &tic->ram.input.mouse; + + if(tic->input.mouse && m->x < TIC80_FULLWIDTH && m->y < TIC80_FULLHEIGHT) + { + const tic_bank* bank = &tic->cart.bank0; + + struct CursorInfo + { + tic_cursor cursor; + tic_point hot; + } info = {tic->ram.vram.vars.cursor.sprite}; + + if(tic->ram.vram.vars.cursor.system) + { + bank = &getConfig()->cart->bank0; + info = (struct CursorInfo[]) + { + {getConfig()->theme.cursor.arrow, {0, 0}}, + {getConfig()->theme.cursor.hand, {3, 0}}, + {getConfig()->theme.cursor.ibeam, {2, 3}}, + }[tic->ram.vram.vars.cursor.sprite]; + } + + const tic_palette* pal = &bank->palette.scn; + const tic_tile* tile = &bank->tiles.data[info.cursor]; + + u32 *dst = tic->screen + (m->x - info.hot.x) + (m->y - info.hot.y) * TIC80_FULLWIDTH, + *end = tic->screen + TIC80_FULLWIDTH * TIC80_FULLHEIGHT; + + for(s32 src = 0; src != TIC_SPRITESIZE * TIC_SPRITESIZE; dst += TIC80_FULLWIDTH - TIC_SPRITESIZE) + for(s32 i = 0; i != TIC_SPRITESIZE; ++i, ++dst) + { + u8 c = tic_tool_peek4(tile->data, src++); + if(dst < end && c) + *dst = tic_rgba(&pal->colors[c]); + } + } +} + static void studioTick() { tic_mem* tic = impl.studio.tic; @@ -1995,6 +2037,8 @@ static void studioTick() ? tic_core_blit_ex(tic, tic->screen_format, (tic_blit_callback){scanline, overline}, data) : tic_core_blit(tic, tic->screen_format); + blitCursor(); + #if defined(BUILD_EDITORS) if(isRecordFrame()) recordFrame(tic->screen); diff --git a/src/studio/system.h b/src/studio/system.h index c20170cea..e3faaba60 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -80,8 +80,6 @@ typedef struct s32 arrow; s32 hand; s32 ibeam; - - bool pixelPerfect; } cursor; struct diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 9848a72ff..9a40e84bd 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -68,20 +68,6 @@ enum tic_touch_size, }; -typedef enum -{ - HandCursor, - IBeamCursor, - ArrowCursor -} CursorType; - -static const SDL_SystemCursor SystemCursors[] = -{ - [HandCursor] = SDL_SYSTEM_CURSOR_HAND, - [IBeamCursor] = SDL_SYSTEM_CURSOR_IBEAM, - [ArrowCursor] = SDL_SYSTEM_CURSOR_ARROW -}; - #if defined(CRT_SHADER_SUPPORT) # define Renderer GPU_Target # define Texture GPU_Image @@ -181,9 +167,7 @@ static struct struct { - Texture* texture; - const u8* src; - SDL_Cursor* cursors[COUNT_OF(SystemCursors)]; + bool focus; } mouse; struct @@ -201,13 +185,6 @@ static struct #endif ; -#if defined(CRT_SHADER_SUPPORT) -static inline bool crtMonitorEnabled() -{ - return platform.studio->config()->crtMonitor && platform.gpu.shader; -} -#endif - static void initSound() { SDL_AudioSpec want = @@ -452,9 +429,6 @@ static void destroyGPU() { destoryTexture(platform.gpu.texture); - if(platform.mouse.texture) - destoryTexture(platform.mouse.texture); - #if defined(TOUCH_INPUT_SUPPORT) if(platform.gamepad.touch.texture) @@ -478,8 +452,6 @@ static void destroyGPU() platform.gpu.shader = 0; } - platform.mouse.src = NULL; - GPU_Quit(); #endif @@ -489,59 +461,21 @@ static void calcTextureRect(SDL_Rect* rect) { SDL_GetWindowSize(platform.window, &rect->w, &rect->h); -#if defined(CRT_SHADER_SUPPORT) - if(crtMonitorEnabled()) - { - enum{Width = TIC80_FULLWIDTH, Height = TIC80_FULLHEIGHT}; - - if (rect->w * Height < rect->h * Width) - { - rect->x = 0; - rect->y = 0; + enum{Width = TIC80_FULLWIDTH, Height = TIC80_FULLHEIGHT}; - rect->h = Height * rect->w / Width; - } - else - { - s32 width = Width * rect->h / Height; - - rect->x = (rect->w - width) / 2; - rect->y = 0; - - rect->w = width; - } + if (rect->w * Height < rect->h * Width) + { + rect->x = rect->y = 0; + rect->h = Height * rect->w / Width; } else -#endif { - enum{Width = TIC80_WIDTH, Height = TIC80_HEIGHT}; - - if (rect->w * Height < rect->h * Width) - { - s32 discreteWidth = rect->w - rect->w % Width; - s32 discreteHeight = Height * discreteWidth / Width; + s32 width = Width * rect->h / Height; - rect->x = (rect->w - discreteWidth) / 2; + rect->x = (rect->w - width) / 2; + rect->y = 0; - rect->y = rect->w > rect->h - ? (rect->h - discreteHeight) / 2 - : TIC80_OFFSET_TOP*discreteWidth/Width; - - rect->w = discreteWidth; - rect->h = discreteHeight; - - } - else - { - s32 discreteHeight = rect->h - rect->h % Height; - s32 discreteWidth = Width * discreteHeight / Height; - - rect->x = (rect->w - discreteWidth) / 2; - rect->y = (rect->h - discreteHeight) / 2; - - rect->w = discreteWidth; - rect->h = discreteHeight; - } + rect->w = width; } } @@ -562,39 +496,24 @@ static void processMouse() } else { + mouse->x = mouse->y = -1; + if(platform.mouse.focus) { - mouse->x = mouse->y = 0; - - SDL_Rect rect = {0, 0, 0, 0}; + SDL_Rect rect; calcTextureRect(&rect); -#if defined(CRT_SHADER_SUPPORT) - if(crtMonitorEnabled()) + if(rect.w && rect.h) { - if(rect.w) { - s32 temp_x = (pt.x - rect.x) * TIC80_FULLWIDTH / rect.w; - if (temp_x < 0) temp_x = 0; else if (temp_x >= TIC80_FULLWIDTH) temp_x = TIC80_FULLWIDTH-1; // clip: 0 to TIC80_FULLWIDTH-1 - mouse->x = temp_x; - } - if(rect.h) { - s32 temp_y = (pt.y - rect.y) * TIC80_FULLHEIGHT / rect.h; - if (temp_y < 0) temp_y = 0; else if (temp_y >= TIC80_FULLHEIGHT) temp_y = TIC80_FULLHEIGHT-1; // clip: 0 to TIC80_FULLHEIGHT-1 - mouse->y = temp_y; - } - } - else -#endif - { - if (rect.w) { - s32 temp_x = (pt.x - rect.x) * TIC80_WIDTH / rect.w + TIC80_OFFSET_LEFT; - if (temp_x < 0) temp_x = 0; else if (temp_x >= TIC80_FULLWIDTH) temp_x = TIC80_FULLWIDTH-1; // clip: 0 to TIC80_FULLWIDTH-1 - mouse->x = temp_x; - } - if (rect.h) { - s32 temp_y = (pt.y - rect.y) * TIC80_HEIGHT / rect.h + TIC80_OFFSET_TOP; - if (temp_y < 0) temp_y = 0; else if (temp_y >= TIC80_FULLHEIGHT) temp_y = TIC80_FULLHEIGHT-1; // clip: 0 to TIC80_FULLHEIGHT-1 - mouse->y = temp_y; + tic_point m = {(pt.x - rect.x) * TIC80_FULLWIDTH / rect.w, (pt.y - rect.y) * TIC80_FULLHEIGHT / rect.h}; + + if(m.x < 0 || m.y < 0 || m.x >= TIC80_FULLWIDTH || m.y >= TIC80_FULLHEIGHT) + SDL_ShowCursor(SDL_ENABLE); + else + { + SDL_ShowCursor(SDL_DISABLE); + mouse->x = m.x; + mouse->y = m.y; } } } @@ -1054,6 +973,12 @@ void tic_sys_poll() case SDL_WINDOWEVENT: switch(event.window.event) { + case SDL_WINDOWEVENT_ENTER: + platform.mouse.focus = true; + break; + case SDL_WINDOWEVENT_LEAVE: + platform.mouse.focus = false; + break; case SDL_WINDOWEVENT_SIZE_CHANGED: { @@ -1233,135 +1158,6 @@ static void renderGamepad() #endif -static void blitCursor(const u8* in) -{ - - if(!platform.mouse.texture) - { -#if defined(CRT_SHADER_SUPPORT) - platform.mouse.texture = GPU_CreateImage(TIC_SPRITESIZE, TIC_SPRITESIZE, STUDIO_PIXEL_FORMAT); - GPU_SetAnchor(platform.mouse.texture, 0, 0); - GPU_SetImageFilter(platform.mouse.texture, GPU_FILTER_NEAREST); -#else - platform.mouse.texture = SDL_CreateTexture(platform.gpu.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC_SPRITESIZE, TIC_SPRITESIZE); - SDL_SetTextureBlendMode(platform.mouse.texture, SDL_BLENDMODE_BLEND); -#endif - } - - if(platform.mouse.src != in) - { - platform.mouse.src = in; - - const u8* end = in + sizeof(tic_tile); - const u32* pal = tic_tool_palette_blit(&platform.studio->tic->ram.vram.palette, platform.studio->tic->screen_format); - static u32 data[TIC_SPRITESIZE*TIC_SPRITESIZE]; - u32* out = data; - - while(in != end) - { - u8 low = *in & 0x0f; - u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; - *out++ = low ? *(pal + low) : 0; - *out++ = hi ? *(pal + hi) : 0; - - in++; - } - - updateTextureBytes(platform.mouse.texture, data, TIC_SPRITESIZE, TIC_SPRITESIZE); - } - - SDL_Rect rect = {0, 0, 0, 0}; - calcTextureRect(&rect); - s32 scale = rect.w / TIC80_WIDTH; - - s32 mx, my; - SDL_GetMouseState(&mx, &my); - - if(platform.studio->config()->theme.cursor.pixelPerfect) - { - mx -= (mx - rect.x) % scale; - my -= (my - rect.y) % scale; - } - - if(SDL_GetWindowFlags(platform.window) & SDL_WINDOW_MOUSE_FOCUS) - { -#if defined(CRT_SHADER_SUPPORT) - GPU_BlitScale(platform.mouse.texture, NULL, platform.gpu.renderer, (float)mx, (float)my, (float)scale, (float)scale); -#else - SDL_Rect rect = {mx, my, TIC_SPRITESIZE * scale, TIC_SPRITESIZE * scale}; - SDL_RenderCopy(platform.gpu.renderer, platform.mouse.texture, NULL, &rect); -#endif - } -} - -static void renderCursor() -{ - if(!platform.studio->tic->input.mouse) - { - SDL_ShowCursor(SDL_DISABLE); - return; - } - - if(SDL_GetRelativeMouseMode()) - return; - - if(platform.studio->tic->ram.vram.vars.cursor.system) - { - const StudioConfig* config = platform.studio->config(); - const tic_tiles* tiles = &config->cart->bank0.tiles; - - switch(platform.studio->tic->ram.vram.vars.cursor.sprite) - { - case tic_cursor_hand: - { - if(config->theme.cursor.hand >= 0) - { - SDL_ShowCursor(SDL_DISABLE); - blitCursor(tiles->data[config->theme.cursor.hand].data); - } - else - { - SDL_ShowCursor(SDL_ENABLE); - SDL_SetCursor(platform.mouse.cursors[HandCursor]); - } - } - break; - case tic_cursor_ibeam: - { - if(config->theme.cursor.ibeam >= 0) - { - SDL_ShowCursor(SDL_DISABLE); - blitCursor(tiles->data[config->theme.cursor.ibeam].data); - } - else - { - SDL_ShowCursor(SDL_ENABLE); - SDL_SetCursor(platform.mouse.cursors[IBeamCursor]); - } - } - break; - default: - { - if(config->theme.cursor.arrow >= 0) - { - SDL_ShowCursor(SDL_DISABLE); - blitCursor(tiles->data[config->theme.cursor.arrow].data); - } - else - { - SDL_ShowCursor(SDL_ENABLE); - SDL_SetCursor(platform.mouse.cursors[ArrowCursor]); - } - } - } - } - else - { - SDL_ShowCursor(SDL_DISABLE); - blitCursor(platform.studio->tic->ram.sprites.data[platform.studio->tic->ram.vram.vars.cursor.sprite].data); - } -} - static const char* getAppFolder() { static char appFolder[TICNAME_MAX]; @@ -1597,19 +1393,11 @@ static void gpuTick() s32 width = 0; SDL_GetWindowSize(platform.window, &width, NULL); - struct RectIt {Rect src; Rect dst;} Rects[] = - { - {{0, 0, TIC80_FULLWIDTH, Header}, {0, 0, width, rect.y}}, - {{0, TIC80_FULLHEIGHT - Header, TIC80_FULLWIDTH, Header}, {0, rect.y + rect.h, width, rect.y}}, - {{0, Header, Left, TIC80_HEIGHT}, {0, rect.y, width, rect.h}}, - {{Left, Top, TIC80_WIDTH, TIC80_HEIGHT}, {rect.x, rect.y, rect.w, rect.h}}, - }; - - FOR(struct RectIt*, it, Rects) - renderCopy(platform.gpu.renderer, platform.gpu.texture, it->src, it->dst); - } + Rect src = {0, 0, TIC80_FULLWIDTH, TIC80_FULLHEIGHT}; + Rect dst = {rect.x, rect.y, rect.w, rect.h}; - renderCursor(); + renderCopy(platform.gpu.renderer, platform.gpu.texture, src, dst); + } # if defined(TOUCH_INPUT_SUPPORT) @@ -1658,12 +1446,6 @@ static void emsGpuTick() #endif -static void createMouseCursors() -{ - for(s32 i = 0; i < COUNT_OF(platform.mouse.cursors); i++) - platform.mouse.cursors[i] = SDL_CreateSystemCursor(SystemCursors[i]); -} - static s32 start(s32 argc, char **argv, const char* folder) { platform.studio = studioInit(argc, argv, TIC80_SAMPLERATE, folder); @@ -1697,8 +1479,6 @@ static s32 start(s32 argc, char **argv, const char* folder) ); setWindowIcon(); - createMouseCursors(); - initGPU(); if(platform.studio->config()->goFullscreen) @@ -1754,11 +1534,7 @@ static s32 start(s32 argc, char **argv, const char* folder) SDL_DestroyWindow(platform.window); SDL_CloseAudioDevice(platform.audio.device); - - for(s32 i = 0; i < COUNT_OF(platform.mouse.cursors); i++) - SDL_FreeCursor(platform.mouse.cursors[i]); } - } } From 326909c5ff78e893bec1c66f8ab0377811e754b3 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 29 Aug 2021 13:44:57 +0300 Subject: [PATCH 025/379] #1562: fixed UI to use system palette only --- src/api.h | 3 +- src/core/core.c | 12 +++---- src/studio/editors/map.c | 1 + src/studio/editors/sprite.c | 2 ++ src/studio/editors/world.c | 2 ++ src/studio/screens/dialog.c | 2 ++ src/studio/screens/menu.c | 2 ++ src/studio/screens/surf.c | 2 ++ src/studio/studio.c | 68 ++++++++----------------------------- src/studio/studio.h | 2 ++ 10 files changed, 36 insertions(+), 60 deletions(-) diff --git a/src/api.h b/src/api.h index 43c69ab27..38f5c0f9a 100644 --- a/src/api.h +++ b/src/api.h @@ -63,6 +63,7 @@ typedef struct tic_scanline scanline; tic_overline overline; tic_border border; + void* data; } tic_blit_callback; typedef struct @@ -700,7 +701,7 @@ void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); void tic_core_blit(tic_mem* tic, tic80_pixel_color_format fmt); -void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb, void* data); +void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb); const tic_script_config* tic_core_script_config(tic_mem* memory); typedef struct diff --git a/src/core/core.c b/src/core/core.c index b9d33a716..d7a84b2ca 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -472,7 +472,7 @@ static inline void memset4(void* dst, u32 val, u32 dwords) #endif } -void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb, void* data) +void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb) { tic_core* core = (tic_core*)tic; @@ -490,12 +490,12 @@ void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callb #define UPDBRD() \ if(clb.border) \ { \ - clb.border(tic, row, data); \ + clb.border(tic, row, clb.data); \ pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); \ } if (clb.scanline) - clb.scanline(tic, 0, data); + clb.scanline(tic, 0, clb.data); const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); @@ -521,7 +521,7 @@ void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callb if (clb.scanline && (row < TIC80_HEIGHT + TIC80_MARGIN_TOP - 1)) { - clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), data); + clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), clb.data); pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); } } @@ -544,7 +544,7 @@ void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callb memcpy(&tic->ram.vram.palette, &ovrpal, sizeof ovrpal); { - clb.overline(tic, data); + clb.overline(tic, clb.data); const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); @@ -587,7 +587,7 @@ static inline void overline(tic_mem* memory, void* data) void tic_core_blit(tic_mem* tic, tic80_pixel_color_format fmt) { - tic_core_blit_ex(tic, fmt, (tic_blit_callback){scanline, overline, border}, NULL); + tic_core_blit_ex(tic, fmt, (tic_blit_callback){scanline, overline, border, NULL}); } tic_mem* tic_core_create(s32 samplerate) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index cfcb0421b..b178c7193 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -1267,6 +1267,7 @@ static void scanline(tic_mem* tic, s32 row, void* data) static void overline(tic_mem* tic, void* data) { Map* map = (Map*)data; + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); tic_api_clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (sheetVisible(map) ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE); { diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index c08bd35cf..a664b309c 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -1915,6 +1915,8 @@ static void overline(tic_mem* tic, void* data) Sprite* sprite = (Sprite*)data; + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + for(const tic_rect* r = bg; r < bg + COUNT_OF(bg); r++) tic_api_rect(tic, r->x, r->y, r->w, r->h, tic_color_grey); diff --git a/src/studio/editors/world.c b/src/studio/editors/world.c index 4ece1f045..549d3b4a4 100644 --- a/src/studio/editors/world.c +++ b/src/studio/editors/world.c @@ -92,6 +92,8 @@ static void scanline(tic_mem* tic, s32 row, void* data) static void overline(tic_mem* tic, void* data) { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + World* world = (World*)data; drawGrid(world); diff --git a/src/studio/screens/dialog.c b/src/studio/screens/dialog.c index 09035dce4..29437ff94 100644 --- a/src/studio/screens/dialog.c +++ b/src/studio/screens/dialog.c @@ -202,6 +202,8 @@ static void scanline(tic_mem* tic, s32 row, void* data) static void overline(tic_mem* tic, void* data) { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + Dialog* dlg = (Dialog*)data; drawDialog(dlg); diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index d5372625f..282442554 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -514,6 +514,8 @@ static void scanline(tic_mem* tic, s32 row, void* data) static void overline(tic_mem* tic, void* data) { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + Menu* menu = (Menu*)data; switch(menu->mode) diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 4780d7c49..4b46d745a 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -908,6 +908,8 @@ static void scanline(tic_mem* tic, s32 row, void* data) static void overline(tic_mem* tic, void* data) { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + Surf* surf = (Surf*)data; if(surf->menu.count > 0) diff --git a/src/studio/studio.c b/src/studio/studio.c index 6cec04151..a355b11cd 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1971,61 +1971,23 @@ static void studioTick() renderStudio(); { - tic_scanline scanline = NULL; - tic_overline overline = NULL; - void* data = NULL; +#if defined(BUILD_EDITORS) + Sprite* sprite = impl.banks.sprite[impl.bank.index.sprites]; + Map* map = impl.banks.map[impl.bank.index.map]; +#endif - switch(impl.mode) + tic_blit_callback callback[TIC_MODES_COUNT] = { - case TIC_MENU_MODE: - { - overline = impl.menu->overline; - scanline = impl.menu->scanline; - data = impl.menu; - } - break; + [TIC_MENU_MODE] = {impl.menu->scanline, impl.menu->overline, NULL, impl.menu}, + #if defined(BUILD_EDITORS) - case TIC_SPRITE_MODE: - { - Sprite* sprite = impl.banks.sprite[impl.bank.index.sprites]; - overline = sprite->overline; - scanline = sprite->scanline; - data = sprite; - } - break; - case TIC_MAP_MODE: - { - Map* map = impl.banks.map[impl.bank.index.map]; - overline = map->overline; - scanline = map->scanline; - data = map; - } - break; - case TIC_WORLD_MODE: - { - overline = impl.world->overline; - scanline = impl.world->scanline; - data = impl.world; - } - break; - case TIC_DIALOG_MODE: - { - overline = impl.dialog->overline; - scanline = impl.dialog->scanline; - data = impl.dialog; - } - break; - case TIC_SURF_MODE: - { - overline = impl.surf->overline; - scanline = impl.surf->scanline; - data = impl.surf; - } - break; + [TIC_SPRITE_MODE] = {sprite->scanline, sprite->overline, NULL, sprite}, + [TIC_MAP_MODE] = {map->scanline, map->overline, NULL, map}, + [TIC_WORLD_MODE] = {impl.world->scanline, impl.world->overline, NULL, impl.world}, + [TIC_DIALOG_MODE] = {impl.dialog->scanline, impl.dialog->overline, NULL, impl.dialog}, + [TIC_SURF_MODE] = {impl.surf->scanline, impl.surf->overline, NULL, impl.surf}, #endif - default: - break; - } + }; if(impl.mode != TIC_RUN_MODE) { @@ -2033,8 +1995,8 @@ static void studioTick() memcpy(tic->ram.font.data, impl.systemFont.data, sizeof(tic_font)); } - data - ? tic_core_blit_ex(tic, tic->screen_format, (tic_blit_callback){scanline, overline}, data) + callback[impl.mode].data + ? tic_core_blit_ex(tic, tic->screen_format, callback[impl.mode]) : tic_core_blit(tic, tic->screen_format); blitCursor(); diff --git a/src/studio/studio.h b/src/studio/studio.h index f3ffb3f4b..af21c8e33 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -111,6 +111,8 @@ typedef enum TIC_DIALOG_MODE, TIC_MENU_MODE, TIC_SURF_MODE, + + TIC_MODES_COUNT } EditorMode; enum From 35298a5d3a985760e06a94c3b3a8755dfc5a9167 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 29 Aug 2021 14:08:21 +0300 Subject: [PATCH 026/379] fixed "REC" label and popup message drawing --- src/studio/studio.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index a355b11cd..50beeb287 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -827,17 +827,28 @@ static void drawPopup() s32 anim = 0; - enum{Dur = TIC80_FRAMERATE/2}; + enum{Dur = TIC80_FRAMERATE/2, Width = TIC80_WIDTH, Height = TIC_FONT_HEIGHT+1}; if(impl.popup.counter < Dur) - anim = -((Dur - impl.popup.counter) * (TIC_FONT_HEIGHT+1) / Dur); + anim = -((Dur - impl.popup.counter) * Height / Dur); else if(impl.popup.counter >= (POPUP_DUR - Dur)) - anim = (((POPUP_DUR - Dur) - impl.popup.counter) * (TIC_FONT_HEIGHT+1) / Dur); + anim = (((POPUP_DUR - Dur) - impl.popup.counter) * Height / Dur); - tic_api_rect(impl.studio.tic, 0, anim, TIC80_WIDTH, TIC_FONT_HEIGHT+1, tic_color_red); + tic_api_rect(impl.studio.tic, 0, anim, Width, Height, tic_color_red); tic_api_print(impl.studio.tic, impl.popup.message, - (s32)(TIC80_WIDTH - strlen(impl.popup.message)*TIC_FONT_WIDTH)/2, + (s32)(Width - strlen(impl.popup.message) * TIC_FONT_WIDTH)/2, anim + 1, tic_color_white, true, 1, false); + + // render popup message + { + tic_mem* tic = impl.studio.tic; + const tic_bank* bank = &getConfig()->cart->bank0; + u32* dst = tic->screen + TIC80_MARGIN_LEFT + TIC80_MARGIN_TOP * TIC80_FULLWIDTH; + + for(s32 i = 0, y = 0; y < (Height + anim); y++, dst += TIC80_MARGIN_RIGHT + TIC80_MARGIN_LEFT) + for(s32 x = 0; x < Width; x++) + *dst++ = tic_rgba(&bank->palette.scn.colors[tic_tool_peek4(tic->ram.vram.screen.data, i++)]); + } } } @@ -912,9 +923,6 @@ void drawToolbar(tic_mem* tic, bool bg) tic_api_print(tic, Names[mode], TextOffset, 1, tic_color_grey, false, 1, false); } } - - // !TODO: fix popup message drawing - drawPopup(); } void setStudioEvent(StudioEvent event) @@ -1698,11 +1706,21 @@ static void checkChanges() } } -// !TODO: fix REC icon drawing +static void drawBitIconRaw(u32* frame, s32 sx, s32 sy, s32 id, tic_color color) +{ + const tic_bank* bank = &getConfig()->cart->bank0; + + u32 *dst = frame + sx + sy * TIC80_FULLWIDTH; + for(s32 src = 0; src != TIC_SPRITESIZE * TIC_SPRITESIZE; dst += TIC80_FULLWIDTH - TIC_SPRITESIZE) + for(s32 i = 0; i != TIC_SPRITESIZE; ++i, ++dst) + if(tic_tool_peek4(&bank->tiles.data[id].data, src++)) + *dst = tic_rgba(&bank->palette.scn.colors[color]); +} + static void drawRecordLabel(u32* frame, s32 sx, s32 sy) { - drawBitIcon(tic_icon_rec, sx, sy, tic_color_red); - drawBitIcon(tic_icon_rec2, sx + TIC_SPRITESIZE, sy, tic_color_red); + drawBitIconRaw(frame, sx, sy, tic_icon_rec, tic_color_red); + drawBitIconRaw(frame, sx + TIC_SPRITESIZE, sy, tic_icon_rec2, tic_color_red); } static bool isRecordFrame(void) @@ -2004,6 +2022,8 @@ static void studioTick() #if defined(BUILD_EDITORS) if(isRecordFrame()) recordFrame(tic->screen); + + drawPopup(); #endif } From 074936c04692c8dd8003b6bc6ccd2298d83d0c8b Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 30 Aug 2021 12:15:53 +0300 Subject: [PATCH 027/379] #1553: fixed `sustain` parameter in the music() api --- src/api/lua.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/lua.c b/src/api/lua.c index 1d9d37029..5091b242f 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -768,7 +768,7 @@ static s32 lua_music(lua_State* lua) if (top >= 5) { - sustain = getLuaNumber(lua, 5); + sustain = lua_toboolean(lua, 5); if (top >= 6) { From 66656dddb1e8cdb3eea6ddf57af94fd53ff29ba4 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 31 Aug 2021 14:26:12 +0300 Subject: [PATCH 028/379] #1570: fixed music export with JUMP command --- src/core/sound.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/core/sound.c b/src/core/sound.c index ddfa8e108..acf647649 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -251,6 +251,12 @@ static void processMusic(tic_mem* memory) if (row != music_state->music.row && jumpCmd->active) { + if(!music_state->flag.music_loop) + { + stopMusic(memory); + return; + } + music_state->music.frame = jumpCmd->frame; row = jumpCmd->beat * NOTES_PER_BEAT; core->state.music.ticks = row2tick(core, track, row); From 30e0823fc483e68dd13d10d80d6e68a5ba446ffa Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 31 Aug 2021 14:54:37 +0300 Subject: [PATCH 029/379] #1556: fixed crash --- src/studio/editors/map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index b178c7193..7d0de8492 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -231,7 +231,7 @@ static void drawTileIndex(Map* map, s32 x, s32 y) if(index >= 0) { - char buf[] = "#999"; + char buf[sizeof "#9999"]; sprintf(buf, "#%03i", index); tic_api_print(map->tic, buf, x, y, tic_color_light_grey, true, 1, false); } From 1f52f07a2347ca568197f5ae64d1d71b5f329662 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 31 Aug 2021 14:56:10 +0300 Subject: [PATCH 030/379] #1580: do not show grid when dragging --- src/studio/editors/map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index 7d0de8492..4ba0dad99 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -1070,8 +1070,8 @@ static void drawMapReg(Map* map) TIC_MAP_SCREEN_WIDTH + 1, TIC_MAP_SCREEN_HEIGHT + 1, -scrollX, -scrollY, 0, 0, 1, NULL, NULL); resetBlitMode(map->tic); - if (map->canvas.grid || map->scroll.active) - drawGrid(map); + if (map->canvas.grid) + drawGrid(map); } if(handle && !space) From 2f6f31b1ec87732e68e43b3c23787f9fb0b2d5af Mon Sep 17 00:00:00 2001 From: msx80 Date: Wed, 1 Sep 2021 14:36:05 +0200 Subject: [PATCH 031/379] fix path problems with baremeta #1541 --- src/studio/fs.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/studio/fs.c b/src/studio/fs.c index b03382029..b91cb2d48 100644 --- a/src/studio/fs.c +++ b/src/studio/fs.c @@ -570,8 +570,8 @@ bool tic_fs_isdir(tic_fs* fs, const char* name) #if defined(BAREMETALPI) dbg("fsIsDirSync %s\n", name); FILINFO s; - - FRESULT res = f_stat(name, &s); + const char* path = tic_fs_path(fs, name); + FRESULT res = f_stat(path, &s); if (res != FR_OK) return false; return s.fattrib & AM_DIR; @@ -912,7 +912,8 @@ void tic_fs_makedir(tic_fs* fs, const char* name) // TODO BAREMETALPI dbg("makeDir %s\n", name); - char* path = strdup(name); + const FsString* pathString = tic_fs_path(fs, name); + char* path = strdup(pathString); if (path && *path) { // make sure result has at least if (path[strlen(path) - 1] == '/') // one character path[strlen(path) - 1] = 0; From 9ba97ef1bbf770c79ac8a88292297971be97f6bf Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 6 Sep 2021 17:23:20 +0300 Subject: [PATCH 032/379] #1059: added workaround to fix textri offset --- src/core/draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/draw.c b/src/core/draw.c index c8ebf3484..6c8d90899 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -651,7 +651,7 @@ static void ticTexLine(tic_mem* memory, TexVert* v0, TexVert* v1) step_v /= dy; } - float x = top->x; + float x = top->x + 0.5f; float y = top->y; float u = top->u; float v = top->v; From 38ec80b962427c34a43f8ce7fb76e8785ac41366 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 6 Sep 2021 17:32:23 +0300 Subject: [PATCH 033/379] #509: fixed custom cursor rendering --- build/assets/config.tic.dat | 2 +- config.lua | 13 +++---------- src/studio/config.c | 15 --------------- src/studio/studio.c | 18 +++++++----------- src/studio/system.h | 7 ------- 5 files changed, 11 insertions(+), 44 deletions(-) diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 97a520e0d..39872f3b2 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4d, 0x73, 0x1b, 0xc9, 0x75, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0x4d, 0xe7, 0x9a, 0x2a, 0xcf, 0x62, 0x0f, 0x01, 0x48, 0x00, 0x24, 0x01, 0x8a, 0xb5, 0x89, 0x38, 0xe5, 0xe2, 0x92, 0x90, 0xc8, 0xb2, 0x48, 0xaa, 0x48, 0x6a, 0xe5, 0x94, 0xcb, 0x45, 0x83, 0xc0, 0x80, 0x44, 0x0c, 0x02, 0xac, 0x01, 0x28, 0x90, 0xbb, 0x51, 0x55, 0x8e, 0x3a, 0xe4, 0x90, 0xab, 0xf7, 0xb4, 0x49, 0x2e, 0x31, 0x4b, 0x87, 0x7c, 0xfc, 0x81, 0x96, 0x94, 0xd8, 0xb1, 0xd3, 0xc6, 0x7a, 0xe3, 0x7c, 0xc7, 0x14, 0x6d, 0xe7, 0x3b, 0x81, 0x10, 0x6d, 0x9c, 0xef, 0x6c, 0x95, 0xf2, 0x5e, 0x77, 0xcf, 0x4c, 0xcf, 0x4c, 0xcf, 0x50, 0x5a, 0xcb, 0xf6, 0x86, 0x61, 0x0f, 0x5b, 0x3d, 0xdd, 0xaf, 0xdf, 0xeb, 0xf7, 0x3d, 0x3d, 0x3d, 0x28, 0x8d, 0x1a, 0x86, 0xf1, 0xdc, 0x3b, 0x9f, 0x32, 0xfa, 0x0c, 0xca, 0xed, 0xdb, 0xb7, 0xef, 0x1c, 0x1d, 0x1d, 0xdd, 0xc1, 0x16, 0xba, 0x77, 0x18, 0xf5, 0x2a, 0x63, 0x83, 0xe1, 0xed, 0xdb, 0x6c, 0x78, 0x74, 0x44, 0x87, 0xb7, 0x7f, 0x83, 0x0e, 0xd9, 0x1d, 0xca, 0xe8, 0x1d, 0x4a, 0xdd, 0xca, 0xf1, 0x47, 0x47, 0x47, 0x73, 0xe9, 0x74, 0x3a, 0x87, 0x2d, 0x74, 0x73, 0x80, 0xe7, 0x56, 0xc4, 0x1f, 0x1d, 0x65, 0xc3, 0x74, 0x9a, 0x0e, 0x47, 0x5f, 0x01, 0xfc, 0x1c, 0x1d, 0x52, 0x51, 0x07, 0x34, 0x67, 0x30, 0x8e, 0x0f, 0xb8, 0xb3, 0xa5, 0x52, 0x69, 0x16, 0x5b, 0xe8, 0xce, 0x12, 0xa8, 0x80, 0x3b, 0x2b, 0xf1, 0xd3, 0x69, 0x36, 0x2c, 0x95, 0xe8, 0x30, 0x5d, 0x04, 0xfc, 0x59, 0x3a, 0x24, 0x50, 0xe9, 0x2c, 0xe0, 0xcf, 0x4a, 0xfc, 0x5e, 0xaf, 0xd7, 0xac, 0xd7, 0xeb, 0x4d, 0x6c, 0xa1, 0xcb, 0x2b, 0x31, 0x08, 0xb6, 0x88, 0xdf, 0xeb, 0xb1, 0x61, 0xbd, 0x4e, 0x87, 0xbd, 0x6d, 0xc0, 0x6f, 0x02, 0xcd, 0x26, 0xa5, 0x06, 0x54, 0x6c, 0xbf, 0x79, 0x7c, 0xfc, 0xe2, 0x31, 0x96, 0x87, 0x0f, 0x8e, 0x8f, 0x87, 0xc3, 0xe3, 0x87, 0xc3, 0xe1, 0x03, 0xec, 0xc2, 0x3f, 0x0f, 0xbf, 0x33, 0x1c, 0xbe, 0xe4, 0xc2, 0xf9, 0x38, 0xc0, 0xf9, 0xbc, 0x08, 0xfc, 0x81, 0xc4, 0x97, 0x2d, 0xf4, 0x03, 0xf0, 0x87, 0x92, 0xfe, 0x43, 0x89, 0xff, 0xd0, 0xc7, 0xff, 0x42, 0xbd, 0xfe, 0x13, 0xf5, 0x9b, 0xdb, 0xf5, 0xfa, 0xf6, 0x4d, 0x51, 0x7b, 0x3d, 0xde, 0xc2, 0xc8, 0xcd, 0xbd, 0x5e, 0xef, 0x05, 0x33, 0x9d, 0xfe, 0x58, 0x7a, 0xf4, 0x95, 0x74, 0xfa, 0x95, 0x4f, 0xa6, 0xd5, 0x16, 0xee, 0x3e, 0xf9, 0x89, 0xd1, 0xd1, 0xe7, 0xde, 0x39, 0x3a, 0x4a, 0x1d, 0x7d, 0xf9, 0xed, 0x23, 0x5e, 0xdf, 0xfe, 0xf2, 0x91, 0x7b, 0x0f, 0x77, 0x6f, 0xff, 0xca, 0x97, 0xbe, 0x34, 0x32, 0x59, 0x2a, 0x5d, 0x28, 0x15, 0x5f, 0x2d, 0xf1, 0xfa, 0x6a, 0x1a, 0xb4, 0x8c, 0x6d, 0xb1, 0x54, 0x84, 0x7f, 0x91, 0x36, 0xb7, 0x37, 0xda, 0x9e, 0x5f, 0x5f, 0xe7, 0xf7, 0xbf, 0x0c, 0x7e, 0xc0, 0x0c, 0x8a, 0xba, 0xed, 0xb3, 0x3b, 0x06, 0x03, 0xdb, 0x0f, 0xee, 0x80, 0xfd, 0x8f, 0x64, 0x45, 0x7f, 0x30, 0xe8, 0x60, 0xc8, 0xd8, 0x70, 0xc8, 0xed, 0x8d, 0xb6, 0x4f, 0xdf, 0x83, 0x16, 0xaf, 0x74, 0xfa, 0xa7, 0xc1, 0x0f, 0x3c, 0xfc, 0x1c, 0xa5, 0x60, 0x7b, 0x5e, 0x73, 0x69, 0xca, 0xb8, 0x1f, 0x8c, 0xfa, 0xf8, 0xdc, 0xde, 0x68, 0xfb, 0xfb, 0xf7, 0xef, 0xcf, 0x96, 0x66, 0x67, 0xf1, 0x1e, 0x69, 0x78, 0xf8, 0xb3, 0x94, 0x82, 0xed, 0xe9, 0x7d, 0xa8, 0xb3, 0x25, 0xca, 0xb8, 0x1f, 0xa4, 0x7d, 0x7c, 0x6e, 0x6b, 0xb4, 0x7d, 0x1d, 0xdb, 0xaf, 0xf0, 0xfb, 0x5f, 0x04, 0x3f, 0xf0, 0xf0, 0x9b, 0x06, 0x03, 0xdb, 0x0f, 0x9a, 0x60, 0xff, 0xba, 0xac, 0xe8, 0x0f, 0x2e, 0x3e, 0x84, 0x81, 0x11, 0xe7, 0x03, 0x38, 0xae, 0xc2, 0xc3, 0x3e, 0x10, 0x84, 0x47, 0x7d, 0x20, 0x00, 0xd7, 0xf8, 0x80, 0x0b, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0x38, 0xc2, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0xae, 0x8d, 0x5f, 0x5e, 0xd2, 0xb9, 0x1c, 0xbb, 0xa7, 0x8b, 0x5f, 0x80, 0x83, 0x3d, 0xa1, 0xde, 0x83, 0x6a, 0x3c, 0x83, 0xb2, 0x7d, 0xdd, 0x7e, 0xc1, 0xf8, 0x21, 0x15, 0x74, 0xae, 0x48, 0x65, 0x84, 0x57, 0x50, 0x7f, 0x09, 0x4b, 0x04, 0xfe, 0xed, 0x17, 0xbd, 0x39, 0xa5, 0x0b, 0x86, 0xc1, 0xeb, 0xf7, 0x1f, 0x3f, 0xe6, 0xed, 0xb7, 0x5e, 0x3c, 0x2e, 0xa9, 0xc5, 0x85, 0xab, 0xf3, 0x94, 0x62, 0x7c, 0xc4, 0x8b, 0x1f, 0xbf, 0xd8, 0xde, 0x63, 0xd1, 0xf8, 0x35, 0x30, 0x66, 0x07, 0x10, 0xbb, 0xdc, 0x07, 0xc2, 0xf1, 0xfb, 0x2c, 0x78, 0x78, 0xf4, 0xf8, 0xb1, 0x71, 0x5e, 0x7e, 0x3c, 0x05, 0x35, 0xff, 0xee, 0xcb, 0x50, 0x3f, 0x80, 0xca, 0x5e, 0x86, 0xfa, 0x81, 0x68, 0x1f, 0x7f, 0x60, 0x3c, 0x32, 0x00, 0xf0, 0xc8, 0x9d, 0xf0, 0xd8, 0x78, 0x04, 0x80, 0x77, 0x61, 0xc2, 0x23, 0x26, 0x27, 0x3d, 0x7a, 0x8c, 0x7f, 0xe2, 0x16, 0xf0, 0xd5, 0x2a, 0xc1, 0xe7, 0xe5, 0xff, 0x42, 0x21, 0x44, 0x54, 0xc8, 0xe6, 0x94, 0x30, 0x5e, 0xd5, 0x42, 0x19, 0x01, 0x10, 0x54, 0x8a, 0x59, 0x01, 0x27, 0xb1, 0x50, 0x92, 0x45, 0x38, 0x5c, 0x4c, 0xe0, 0x62, 0x1b, 0x24, 0x00, 0xb4, 0x99, 0x21, 0xc6, 0x99, 0xec, 0x07, 0xf0, 0xc5, 0x18, 0x87, 0xcb, 0xb9, 0xc1, 0xf5, 0x99, 0xa0, 0xef, 0xae, 0xc1, 0x48, 0x64, 0x7d, 0xe4, 0x5f, 0xe0, 0x1b, 0xa2, 0xba, 0x20, 0x48, 0xe2, 0x71, 0xd5, 0x67, 0x4f, 0xa1, 0x8f, 0x17, 0xd1, 0xc8, 0x47, 0xdd, 0xb5, 0x19, 0xbf, 0x0f, 0x8a, 0xe7, 0xeb, 0x4c, 0xa7, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x0b, 0xf3, 0x0f, 0xf3, 0x09, 0xe5, 0x55, 0x8b, 0xcf, 0x08, 0xa8, 0x9e, 0x79, 0x15, 0xfb, 0x01, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x06, 0xe1, 0x1e, 0xdf, 0xae, 0x7d, 0x0c, 0xaa, 0xb1, 0x2f, 0x13, 0x95, 0xdb, 0x88, 0x69, 0x9c, 0x84, 0xfa, 0x35, 0x62, 0x5f, 0x29, 0x23, 0x95, 0xf6, 0x0b, 0xef, 0x0a, 0x24, 0x0c, 0xfd, 0xc7, 0x70, 0x6d, 0xac, 0xf3, 0x1f, 0x4e, 0x5b, 0x87, 0x1f, 0xf2, 0x0f, 0x1a, 0xf5, 0x0f, 0x5d, 0xab, 0x4c, 0x00, 0x25, 0xa1, 0x76, 0xf1, 0x0f, 0x1d, 0x99, 0x45, 0xfd, 0xcb, 0xb5, 0xaf, 0x6c, 0x23, 0xd2, 0x73, 0xbd, 0x68, 0x78, 0x53, 0x79, 0x64, 0x44, 0x8b, 0x8b, 0x8b, 0x4b, 0xbd, 0x11, 0x1e, 0x43, 0x46, 0x50, 0x7e, 0xd7, 0x9f, 0x5c, 0xbb, 0xd0, 0xc8, 0xb6, 0x0a, 0xd7, 0xa5, 0xc2, 0xc7, 0x35, 0xee, 0xe3, 0xe1, 0xd3, 0x18, 0x7c, 0xd5, 0x7f, 0x5d, 0x1d, 0x47, 0xe8, 0x13, 0x29, 0x1f, 0x91, 0xfc, 0x86, 0xd8, 0x67, 0x32, 0xce, 0x58, 0x14, 0xec, 0xe9, 0x5d, 0xda, 0x98, 0x6a, 0xf4, 0xeb, 0xf2, 0xe5, 0xd6, 0x88, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x18, 0x11, 0xff, 0x34, 0x7c, 0x0f, 0x89, 0xfa, 0x1f, 0xf1, 0x69, 0xf0, 0x36, 0xa2, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xd8, 0xf8, 0x60, 0xc1, 0xfc, 0x45, 0x45, 0x0e, 0x71, 0x07, 0x88, 0x77, 0x4f, 0x95, 0xf1, 0x18, 0xb5, 0xa9, 0xee, 0xe7, 0xd6, 0x38, 0xd7, 0xa1, 0x71, 0xae, 0xa5, 0xf8, 0x95, 0x9a, 0xb3, 0xd4, 0xfc, 0x96, 0xe8, 0x9b, 0xd4, 0x90, 0xb9, 0x57, 0x86, 0x1e, 0x73, 0xf3, 0xad, 0xc6, 0xb4, 0x2c, 0x6a, 0x62, 0xc8, 0x94, 0x04, 0xb2, 0x0e, 0x61, 0xea, 0x25, 0xfb, 0x6a, 0x7e, 0x85, 0x2e, 0x66, 0x2f, 0x03, 0xdb, 0x40, 0x7e, 0x95, 0xb1, 0x8d, 0x19, 0x8a, 0x40, 0x87, 0x78, 0x36, 0x24, 0x9e, 0xee, 0xb9, 0x0c, 0x8a, 0x6f, 0x04, 0x63, 0x90, 0xb8, 0xcc, 0x73, 0x39, 0x71, 0x59, 0xa2, 0xba, 0x30, 0x23, 0x7e, 0xdc, 0xb9, 0xcf, 0x31, 0xe2, 0xeb, 0x82, 0x10, 0x42, 0x24, 0x95, 0x60, 0x2b, 0xc7, 0x55, 0xe7, 0xa1, 0x82, 0x71, 0x10, 0x84, 0xf1, 0x34, 0x71, 0x5e, 0xce, 0xcb, 0x59, 0x2f, 0xfc, 0x88, 0x6c, 0x38, 0x1c, 0x0e, 0xf0, 0x4d, 0x1f, 0x0b, 0x6f, 0xfb, 0x7d, 0xd9, 0x0e, 0x25, 0xb8, 0xaf, 0x82, 0xfb, 0x7d, 0x31, 0x7d, 0x28, 0x5a, 0xbf, 0x68, 0xe8, 0x84, 0xc0, 0x11, 0x3a, 0xe7, 0x16, 0xf8, 0xf1, 0x96, 0x41, 0x1f, 0x0d, 0x09, 0x76, 0x83, 0x8a, 0x06, 0x62, 0xd1, 0x32, 0x54, 0x4a, 0x3f, 0x0c, 0x74, 0xfd, 0x04, 0xe9, 0xc4, 0xe0, 0xbb, 0x7e, 0xa2, 0xc5, 0x3f, 0xb7, 0xc0, 0x47, 0x28, 0xfe, 0x35, 0x95, 0xf9, 0x66, 0xed, 0xc7, 0x54, 0x1d, 0x3e, 0x06, 0x38, 0x8c, 0x0d, 0x86, 0x3a, 0x7c, 0x3c, 0x57, 0x1a, 0x62, 0xed, 0xc7, 0xe1, 0x0f, 0x86, 0xa2, 0x32, 0x2d, 0x3e, 0xe2, 0xf1, 0x7a, 0xea, 0xfa, 0x51, 0xfc, 0x61, 0xa8, 0x6a, 0xf0, 0x87, 0x6a, 0x4d, 0xe4, 0x5f, 0x8f, 0xef, 0xc9, 0x3e, 0x90, 0x2a, 0x54, 0xf1, 0x55, 0xd9, 0xf1, 0xfe, 0xf4, 0xf8, 0x83, 0xe0, 0x82, 0xb8, 0x91, 0x95, 0xb1, 0x98, 0x00, 0x65, 0x4f, 0x58, 0xd4, 0x60, 0x66, 0x61, 0x7b, 0xeb, 0x79, 0x51, 0x6c, 0x1d, 0xe5, 0x45, 0xca, 0x19, 0x8b, 0x2f, 0x6d, 0x9c, 0x80, 0xcf, 0x06, 0x49, 0xf8, 0x7d, 0xf6, 0x83, 0xe1, 0x2b, 0x76, 0x8a, 0xc3, 0x77, 0x6d, 0xfd, 0x83, 0xac, 0x3f, 0x48, 0xc2, 0xef, 0x27, 0xe0, 0x87, 0x4b, 0x5f, 0xf0, 0xcc, 0xeb, 0xe0, 0x09, 0x6a, 0x42, 0x5c, 0xfa, 0xf1, 0xf9, 0x14, 0xce, 0xa1, 0x8b, 0x7f, 0x96, 0x9c, 0x07, 0x92, 0xf0, 0x07, 0x49, 0xf8, 0xfd, 0x53, 0xf1, 0x07, 0xc3, 0x24, 0x7c, 0x2f, 0x7f, 0x7c, 0x88, 0xf5, 0x03, 0xf1, 0xab, 0xc7, 0xf7, 0xe2, 0xff, 0x43, 0xf2, 0x3f, 0x48, 0xc2, 0x77, 0xf3, 0x80, 0xea, 0xbb, 0x31, 0xcf, 0x4f, 0xd5, 0x77, 0x4e, 0x8d, 0xed, 0xa7, 0xc9, 0x03, 0x2c, 0xce, 0xaf, 0x82, 0xbc, 0x68, 0x7c, 0x6a, 0x10, 0x8a, 0x1f, 0x2f, 0x5f, 0x47, 0xf0, 0x87, 0x4a, 0xbe, 0xd6, 0xe3, 0x0f, 0xdc, 0xf8, 0x1b, 0x68, 0xf1, 0x65, 0x9e, 0xef, 0x27, 0xae, 0x9f, 0x80, 0x1f, 0xcd, 0xf7, 0x71, 0xf8, 0x81, 0x3c, 0x10, 0xc6, 0x8f, 0x5f, 0x7f, 0x30, 0x54, 0x72, 0xc0, 0x40, 0xc7, 0xbf, 0x9b, 0x03, 0xfa, 0x4f, 0x61, 0xcb, 0xbe, 0x94, 0xe5, 0x63, 0x5f, 0xfb, 0xd4, 0xf9, 0x26, 0xe5, 0xbc, 0x9c, 0x97, 0xf3, 0x92, 0xb0, 0x89, 0x57, 0xaa, 0x61, 0x44, 0xbf, 0x9f, 0x50, 0xc3, 0x48, 0xfa, 0x52, 0x4f, 0xc5, 0xd1, 0x74, 0xa0, 0x0d, 0x9f, 0xbf, 0x12, 0x79, 0x0c, 0x87, 0x37, 0xd1, 0xe3, 0x57, 0xff, 0xdc, 0x95, 0xba, 0xfd, 0xd0, 0x11, 0x24, 0xc7, 0x27, 0xe2, 0xec, 0x8e, 0x92, 0xe8, 0xf9, 0x32, 0x4d, 0x92, 0xcf, 0x3d, 0xd3, 0x25, 0xea, 0x71, 0x5d, 0xe4, 0xf8, 0xd8, 0xab, 0x54, 0x73, 0xfc, 0x4e, 0x88, 0x38, 0xf6, 0xe7, 0xc7, 0x7e, 0x44, 0x7f, 0x44, 0x4f, 0x59, 0xfc, 0x19, 0xae, 0xfa, 0x29, 0x23, 0x8e, 0x5f, 0xfa, 0x04, 0x6f, 0xb3, 0x94, 0x44, 0xcf, 0xef, 0x8d, 0x88, 0xfe, 0xa2, 0x74, 0x99, 0x3c, 0x3d, 0x65, 0xd1, 0xcf, 0x17, 0xde, 0xf9, 0xae, 0xeb, 0x03, 0xe1, 0xef, 0x63, 0xcc, 0xfb, 0xbe, 0x26, 0xa7, 0x44, 0xe0, 0xc4, 0xfb, 0xee, 0x46, 0x68, 0x3c, 0x7d, 0x46, 0xdd, 0xb9, 0x46, 0x04, 0x9f, 0x29, 0xeb, 0xe8, 0x3e, 0xbf, 0xb8, 0x70, 0x1d, 0xff, 0xea, 0xfa, 0x9a, 0xcf, 0x7f, 0x12, 0x9f, 0x04, 0x5a, 0x3d, 0x5c, 0x18, 0x87, 0xb2, 0x78, 0x9d, 0xeb, 0xf4, 0x1f, 0x86, 0x47, 0xec, 0xab, 0xd8, 0x46, 0xe7, 0x7f, 0xaa, 0xed, 0x75, 0x3e, 0x10, 0xc0, 0xd3, 0x7d, 0xde, 0x52, 0xe4, 0xd7, 0xc6, 0xaf, 0xf4, 0x5b, 0x7e, 0xf6, 0xad, 0x59, 0xc3, 0x95, 0x9f, 0x57, 0x26, 0xda, 0xb0, 0xfd, 0x05, 0xcc, 0x6f, 0xf5, 0xf8, 0x71, 0xf6, 0x51, 0xe8, 0x6b, 0xf0, 0x55, 0xfb, 0xc7, 0xf9, 0x57, 0x00, 0xae, 0x91, 0x9f, 0x8f, 0x53, 0xa2, 0xd8, 0x51, 0x75, 0xbf, 0xa0, 0x6c, 0x61, 0xf9, 0xa8, 0xfb, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0xa6, 0xf1, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x75, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x73, 0xf3, 0x1f, 0xd3, 0xf9, 0x07, 0x89, 0x2a, 0x41, 0x67, 0x9f, 0x38, 0xfe, 0xc3, 0x30, 0x12, 0x7d, 0x7e, 0x10, 0xe2, 0xeb, 0x90, 0x51, 0xbd, 0xfd, 0x55, 0x39, 0x83, 0xf1, 0x4b, 0x44, 0x55, 0xf9, 0x0c, 0xdb, 0x5f, 0xc9, 0x2d, 0x91, 0xcf, 0x68, 0x2c, 0xf4, 0x7c, 0x49, 0xf8, 0xbc, 0xe8, 0xdf, 0x44, 0x9f, 0x09, 0xde, 0xf3, 0x87, 0xc4, 0x7c, 0xbe, 0x7d, 0xc2, 0x6f, 0x4a, 0x61, 0xff, 0xd5, 0x2c, 0xa9, 0xc5, 0xc1, 0xdc, 0x2d, 0xf2, 0xb7, 0xc6, 0x7f, 0x43, 0x3e, 0xa0, 0xc3, 0x67, 0xee, 0x27, 0x60, 0x16, 0x4d, 0x90, 0x49, 0xf4, 0x83, 0xcf, 0x28, 0x4d, 0x0e, 0xc4, 0x3d, 0x05, 0x91, 0x7b, 0x0b, 0xed, 0xf3, 0x4f, 0xe6, 0x38, 0x19, 0x47, 0x46, 0x28, 0x46, 0x99, 0x26, 0x07, 0x45, 0x04, 0x34, 0xe2, 0xfd, 0x33, 0x9c, 0xfc, 0x89, 0x8e, 0xbe, 0x9a, 0x1f, 0x35, 0xf6, 0x55, 0xab, 0xa1, 0x91, 0xdf, 0x7d, 0x36, 0xf2, 0xf8, 0x27, 0x1a, 0x78, 0x12, 0xff, 0xa1, 0x18, 0xd6, 0x3d, 0x43, 0x4e, 0xcf, 0x01, 0x21, 0xfb, 0xd0, 0x98, 0x67, 0x80, 0x46, 0x3d, 0xaa, 0xfd, 0xb5, 0xf1, 0x1f, 0xb6, 0x9d, 0x4e, 0xfe, 0x84, 0xf8, 0x0f, 0xc7, 0xb0, 0xce, 0x97, 0x03, 0x39, 0x80, 0xea, 0xf4, 0x4b, 0xbc, 0x6f, 0xe8, 0x3a, 0x78, 0x58, 0x76, 0x9a, 0x94, 0x03, 0x62, 0xe2, 0x9f, 0xc6, 0xc4, 0xbf, 0x41, 0x34, 0x55, 0x17, 0xff, 0x2c, 0x26, 0xfe, 0xc5, 0x07, 0x67, 0xe3, 0xd9, 0xfc, 0x5a, 0xf6, 0xbc, 0x9c, 0x97, 0xf3, 0x72, 0x5e, 0x82, 0xfb, 0x03, 0xaa, 0xbc, 0x96, 0xd0, 0x68, 0xea, 0x31, 0x48, 0xc2, 0xfe, 0x81, 0x10, 0xef, 0x27, 0x94, 0x5e, 0x1b, 0xc9, 0xff, 0x6a, 0xab, 0x49, 0x8f, 0x81, 0x77, 0x57, 0x12, 0x73, 0x3c, 0xe1, 0xfe, 0x34, 0x87, 0xe8, 0xf9, 0x8f, 0x67, 0x30, 0x24, 0x23, 0xd1, 0xef, 0xcf, 0xa8, 0xa1, 0x7f, 0x7f, 0x76, 0x65, 0x74, 0xcf, 0x21, 0xe2, 0x74, 0xc8, 0x4e, 0x3b, 0x87, 0x08, 0x1d, 0x47, 0x18, 0xd1, 0x6d, 0xce, 0x13, 0xdb, 0xcb, 0x88, 0x3f, 0x02, 0xd0, 0x9e, 0x19, 0xa8, 0x3f, 0x6d, 0x62, 0x3a, 0xde, 0x15, 0xf9, 0x75, 0x8f, 0x37, 0x95, 0x7e, 0x12, 0xdc, 0xd0, 0xd0, 0x27, 0x8a, 0x6f, 0xe8, 0x9e, 0x7f, 0x8c, 0x28, 0x8f, 0x4d, 0xa2, 0xdf, 0x7e, 0x11, 0x23, 0xe8, 0x63, 0x11, 0xbd, 0x91, 0xe0, 0x31, 0x4f, 0x84, 0x3e, 0x49, 0xc6, 0x4f, 0xe2, 0xcf, 0x48, 0x88, 0x0d, 0x1d, 0x3c, 0xe1, 0x78, 0x26, 0x76, 0x2f, 0xee, 0xf2, 0xc4, 0xb4, 0x7b, 0x9b, 0xc4, 0x9f, 0x27, 0x06, 0xe4, 0xd7, 0xf1, 0x48, 0x55, 0xf9, 0x0d, 0x7d, 0xfc, 0xa8, 0xfa, 0x21, 0xba, 0xed, 0x0d, 0x09, 0xb6, 0x3a, 0xfb, 0x78, 0xc7, 0x6b, 0x31, 0xf8, 0x71, 0xfe, 0xa7, 0xda, 0x5f, 0xeb, 0x5f, 0x21, 0x38, 0x89, 0x5b, 0x3f, 0x26, 0x3f, 0x10, 0x72, 0x8a, 0x7c, 0xa1, 0xfc, 0x10, 0xe7, 0x5f, 0x46, 0xf0, 0xa7, 0x81, 0x51, 0xfa, 0x31, 0xb9, 0x32, 0xbc, 0xf5, 0xd3, 0xd1, 0x67, 0xa1, 0x18, 0x4d, 0xd2, 0x1f, 0x89, 0xb1, 0x1f, 0x89, 0xe1, 0x2f, 0x60, 0x3f, 0x9d, 0xfe, 0x42, 0x3a, 0x8a, 0xb3, 0x1f, 0x53, 0x64, 0xd4, 0xe9, 0x3f, 0x2e, 0xfe, 0xc3, 0xfa, 0x8d, 0xd3, 0xdf, 0x69, 0xf6, 0x23, 0xa7, 0xe8, 0xdf, 0xe3, 0x31, 0x06, 0x9f, 0xc6, 0xd9, 0x47, 0x81, 0xeb, 0xf8, 0x0b, 0xe7, 0x17, 0xa6, 0x3b, 0xff, 0x53, 0xe5, 0x3b, 0x25, 0x86, 0x75, 0xc7, 0xef, 0x01, 0xff, 0x8b, 0xb1, 0xcf, 0x13, 0x1f, 0xe7, 0x13, 0xe3, 0xa9, 0xdf, 0xff, 0x59, 0x28, 0x4f, 0x84, 0x79, 0x67, 0x46, 0x7c, 0xfc, 0x86, 0x73, 0x00, 0x8d, 0xf9, 0x79, 0x78, 0x9c, 0x7d, 0x03, 0x39, 0x2a, 0x0e, 0x3f, 0xe4, 0x47, 0x46, 0x42, 0x8e, 0x0b, 0x9f, 0x91, 0x12, 0x4d, 0x0c, 0xc5, 0xe5, 0x6e, 0x2d, 0x7d, 0x12, 0x0c, 0x64, 0xa2, 0xa1, 0x4f, 0x94, 0xa3, 0x23, 0x5d, 0xfc, 0x26, 0xe5, 0x17, 0x5d, 0x0e, 0x30, 0x8c, 0xe4, 0x1c, 0x60, 0x24, 0xc4, 0x30, 0x35, 0x92, 0xf1, 0x59, 0x5c, 0x0e, 0x55, 0xed, 0xa3, 0x89, 0x11, 0x16, 0xff, 0x78, 0xf4, 0x8f, 0x9f, 0xe3, 0xf6, 0x17, 0x24, 0x7e, 0xff, 0x15, 0x8e, 0x61, 0x7a, 0x1a, 0xdc, 0x88, 0x87, 0xeb, 0xe2, 0x3f, 0xbc, 0x7f, 0x23, 0x09, 0xf4, 0xe3, 0xbe, 0xcf, 0xb8, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x8d, 0x8f, 0x69, 0xfd, 0x83, 0xe8, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x0d, 0x7a, 0x57, 0x77, 0x7d, 0xe7, 0xbb, 0xba, 0xeb, 0x2c, 0xbc, 0x9c, 0xb0, 0x6f, 0xe8, 0xae, 0xc1, 0x43, 0xdd, 0x75, 0x26, 0x5e, 0xc6, 0xfe, 0x9f, 0xd9, 0xf7, 0x9b, 0xef, 0x85, 0x2f, 0xb4, 0xef, 0xa3, 0xf7, 0xc3, 0xd7, 0xb9, 0x7d, 0xcf, 0x8a, 0x7d, 0xf1, 0x8a, 0xda, 0x17, 0xaf, 0x73, 0xfb, 0x9e, 0xdb, 0xf7, 0xa3, 0x5e, 0x4e, 0x34, 0xe6, 0xed, 0xdf, 0x3d, 0xd1, 0x98, 0x77, 0x78, 0x26, 0xec, 0x7b, 0xa2, 0x31, 0xef, 0xb7, 0x1f, 0x9c, 0x68, 0xcc, 0xfb, 0xc1, 0x83, 0xb3, 0x20, 0xef, 0xd7, 0xff, 0x20, 0x6a, 0xe0, 0xe3, 0x07, 0xff, 0xf8, 0x4f, 0x51, 0x03, 0x1f, 0x9f, 0x09, 0x79, 0xff, 0xe2, 0x2f, 0x75, 0xf1, 0xfb, 0xdf, 0xff, 0x73, 0x66, 0xf3, 0x73, 0xff, 0x2e, 0xff, 0x93, 0xe5, 0xee, 0x09, 0x2f, 0x10, 0xac, 0xfc, 0x4f, 0x96, 0xef, 0x8a, 0xd1, 0x33, 0x91, 0x9f, 0xdf, 0x7d, 0x8f, 0xff, 0xc9, 0xf2, 0xde, 0xc9, 0xc9, 0xbd, 0xfb, 0x27, 0x27, 0x8f, 0xfe, 0xf9, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x27, 0x27, 0xdf, 0xfb, 0xab, 0xb3, 0x21, 0xef, 0x49, 0xa4, 0xfc, 0xe1, 0xb7, 0x4e, 0x34, 0xe5, 0x5f, 0xbe, 0x7f, 0x46, 0xe4, 0x7d, 0xe7, 0x57, 0x03, 0x72, 0x7d, 0xe5, 0xab, 0xbf, 0xfb, 0x7b, 0xbf, 0xff, 0xb5, 0x93, 0x5f, 0xfb, 0xf5, 0xc0, 0xe8, 0xdf, 0xfe, 0xdd, 0x5f, 0xff, 0xcd, 0xdf, 0xff, 0xc3, 0x99, 0x90, 0xf7, 0x37, 0x7f, 0x2b, 0x20, 0xd9, 0x9f, 0xfc, 0xe9, 0x1f, 0xfd, 0xf1, 0x9f, 0xfd, 0xf9, 0xc9, 0x6f, 0xff, 0x4e, 0x60, 0xf4, 0xdf, 0xff, 0xe3, 0x5f, 0xff, 0xed, 0x3f, 0xff, 0x6b, 0xe4, 0xae, 0x61, 0x7c, 0x9c, 0x5f, 0x2f, 0x8f, 0xe0, 0xf5, 0x93, 0xfc, 0xe2, 0xf7, 0xc6, 0x93, 0x5c, 0xfc, 0x7f, 0xc7, 0x32, 0x2e, 0xe0, 0xf5, 0x3c, 0x5c, 0x2f, 0xc0, 0x45, 0x2e, 0x90, 0x11, 0x23, 0x78, 0x91, 0xd0, 0xa5, 0x52, 0xb8, 0x00, 0x24, 0x7e, 0xc9, 0x78, 0xc9, 0x78, 0xe9, 0xb9, 0x97, 0x9e, 0x7b, 0xb2, 0x35, 0xc3, 0xd7, 0xf3, 0x1f, 0x1f, 0xf9, 0x29, 0x63, 0x63, 0xb1, 0xbc, 0x5c, 0xb6, 0x52, 0x6f, 0xa5, 0x46, 0xe6, 0xaf, 0xaf, 0xad, 0xaf, 0xae, 0x59, 0xa9, 0x11, 0xb8, 0x1f, 0x99, 0x5b, 0x5b, 0x5b, 0xbd, 0x61, 0xcd, 0x4c, 0xe7, 0xe0, 0x7e, 0x71, 0x6e, 0x65, 0xc1, 0x9a, 0xb9, 0x88, 0xb7, 0x4b, 0xaf, 0x97, 0xe7, 0x96, 0xad, 0x99, 0x19, 0xb8, 0xbf, 0x95, 0x4b, 0x01, 0xce, 0xea, 0x42, 0xd9, 0x94, 0x28, 0xaf, 0x5f, 0x31, 0xb1, 0x58, 0x53, 0x7c, 0xe6, 0x65, 0xb7, 0x57, 0xc4, 0xde, 0xfa, 0xc6, 0xda, 0xd2, 0xca, 0x15, 0xd3, 0xe2, 0xf4, 0x56, 0xae, 0x2f, 0xbf, 0x5e, 0x5e, 0x03, 0xd0, 0x14, 0xf6, 0x3e, 0x53, 0xfe, 0xf9, 0x1b, 0xab, 0x6b, 0x0b, 0x56, 0x09, 0x3b, 0x73, 0xd7, 0x96, 0x38, 0x16, 0x27, 0x31, 0xbf, 0xba, 0xbc, 0x5c, 0x5e, 0xd9, 0xb0, 0xa6, 0x38, 0xd6, 0xfa, 0xd2, 0x95, 0x15, 0x4e, 0x90, 0x4f, 0x5c, 0x2f, 0x5f, 0x2d, 0xcf, 0x6f, 0x98, 0x12, 0x26, 0x58, 0x37, 0x2d, 0xb1, 0xd6, 0xe2, 0xdc, 0xc2, 0xea, 0x0d, 0xd3, 0xea, 0x3a, 0xfb, 0x36, 0xa7, 0x79, 0x75, 0x63, 0xf3, 0xf2, 0x2a, 0xd0, 0xa9, 0x57, 0x9a, 0x1d, 0x3e, 0xb2, 0x3c, 0xb7, 0x31, 0xbf, 0xb8, 0xb9, 0x50, 0xbe, 0xba, 0xb4, 0xbc, 0xb4, 0x51, 0x5e, 0x5b, 0x77, 0xa7, 0x72, 0x91, 0xae, 0xcc, 0x2d, 0x97, 0xaf, 0xcd, 0x2d, 0x48, 0xa1, 0x36, 0x56, 0xaf, 0xcf, 0x2f, 0xc2, 0x3d, 0xef, 0x00, 0xa9, 0x6b, 0x8b, 0x73, 0xd6, 0xd4, 0x6b, 0x93, 0x48, 0xe5, 0x96, 0xc0, 0xb8, 0x95, 0x4a, 0xcd, 0x2f, 0x96, 0xe7, 0x3f, 0xb3, 0xb9, 0x52, 0xbe, 0xb1, 0xf9, 0x06, 0x50, 0x5b, 0x5a, 0x5d, 0xe1, 0x04, 0x53, 0x2b, 0xab, 0x9b, 0xeb, 0xab, 0xd7, 0x41, 0x77, 0x7c, 0xe1, 0xd4, 0x95, 0xa5, 0xcb, 0x9b, 0x57, 0xcb, 0x2b, 0x57, 0x36, 0x16, 0xad, 0xe2, 0xa4, 0x99, 0xcf, 0x9b, 0x8d, 0x96, 0xd9, 0xb1, 0xab, 0xed, 0x56, 0xad, 0x93, 0x9a, 0x5f, 0xdb, 0xd8, 0x5c, 0x5e, 0x5d, 0x59, 0xda, 0x00, 0x03, 0xf8, 0xb3, 0xd7, 0xe7, 0xe7, 0xae, 0x96, 0xad, 0x52, 0xea, 0xfa, 0x92, 0xbc, 0x9d, 0x4e, 0xa5, 0xf2, 0xf1, 0x25, 0x55, 0xdf, 0x6f, 0x55, 0xbb, 0x8d, 0x76, 0xcb, 0xdc, 0x58, 0x9a, 0xcf, 0x64, 0x53, 0x23, 0xd5, 0x66, 0x07, 0x9b, 0x66, 0xbb, 0x5a, 0x69, 0x9a, 0xcd, 0xca, 0x96, 0xdd, 0xb4, 0xd2, 0x1b, 0x3b, 0x8d, 0x8e, 0x09, 0x7f, 0x9d, 0xc3, 0x4e, 0xd7, 0xde, 0x35, 0x61, 0xf9, 0x7a, 0x63, 0x7b, 0xdf, 0xa9, 0x70, 0xbc, 0x6a, 0xc5, 0xe9, 0x3a, 0x8d, 0xda, 0xb6, 0x9d, 0x76, 0xb1, 0x3a, 0x8d, 0x37, 0x6d, 0x6b, 0xcf, 0x69, 0xb4, 0xba, 0x19, 0x4e, 0x20, 0x37, 0x99, 0xcb, 0xcf, 0x00, 0x4d, 0x75, 0x28, 0x53, 0x9c, 0x9e, 0xcc, 0xe3, 0xc4, 0xec, 0xc4, 0x44, 0x31, 0x97, 0x99, 0x2a, 0xcd, 0xc0, 0x14, 0xb8, 0xcd, 0xa6, 0xec, 0x56, 0x2d, 0xc5, 0x65, 0x43, 0x9b, 0x94, 0xd7, 0xb8, 0x9b, 0x81, 0x8a, 0x36, 0xca, 0x9f, 0xb5, 0x3e, 0xf7, 0x39, 0x50, 0xe1, 0xab, 0x37, 0x6d, 0xa7, 0x83, 0x0b, 0x4f, 0x4d, 0x4d, 0x42, 0xb7, 0xd2, 0x85, 0xd5, 0xb7, 0xf6, 0xbb, 0xb6, 0x79, 0xd3, 0xae, 0x96, 0xcc, 0xed, 0xbd, 0xfd, 0xcd, 0x37, 0x6c, 0xa7, 0x6b, 0x1f, 0x5c, 0x0a, 0x03, 0x8b, 0x1c, 0xb8, 0x61, 0x1f, 0xcc, 0xb7, 0xdb, 0x4e, 0x2d, 0x02, 0x9e, 0xe6, 0xe0, 0xf9, 0x76, 0xb3, 0xed, 0x20, 0x6c, 0xbf, 0xd5, 0xa8, 0xb7, 0x9d, 0x5d, 0x73, 0xb7, 0xd2, 0x15, 0x90, 0xe5, 0x76, 0xcd, 0x6e, 0xbe, 0xd1, 0xb0, 0x7b, 0xd7, 0x9c, 0xf6, 0x2f, 0xd8, 0x5c, 0x67, 0xcb, 0x15, 0xc0, 0xe7, 0x0b, 0xdd, 0xac, 0x38, 0x87, 0x8d, 0xd6, 0xb6, 0xa0, 0x53, 0x75, 0x69, 0x28, 0xa3, 0x45, 0xb3, 0xab, 0x2c, 0x7c, 0xb3, 0xdd, 0xa8, 0x01, 0xe5, 0x46, 0x2b, 0x83, 0x77, 0x59, 0xd7, 0x55, 0x38, 0xa2, 0x69, 0x05, 0x19, 0x19, 0x71, 0x11, 0x01, 0x80, 0x84, 0x32, 0xaa, 0x14, 0x59, 0x3e, 0x63, 0xbb, 0xb9, 0x79, 0xad, 0xdd, 0x69, 0x70, 0x73, 0x58, 0xc9, 0xcc, 0x9a, 0x63, 0x9c, 0xc7, 0x8c, 0xaf, 0xa7, 0x9c, 0x39, 0x55, 0x98, 0xe4, 0x74, 0x6e, 0xa5, 0x46, 0x3e, 0xff, 0x79, 0x70, 0xd0, 0x6b, 0x4b, 0x9f, 0x2d, 0x5f, 0xd5, 0x2a, 0x7b, 0x62, 0x62, 0xcf, 0xb1, 0xab, 0x0d, 0x3e, 0xb2, 0xd3, 0xd8, 0xde, 0xd9, 0x33, 0xeb, 0xcd, 0x76, 0xa5, 0x9b, 0x28, 0xab, 0xab, 0xc8, 0x4e, 0x65, 0x77, 0xaf, 0x69, 0x3b, 0xc5, 0x05, 0xb3, 0xd3, 0xde, 0x77, 0xaa, 0xb6, 0x0a, 0xe3, 0x54, 0xcc, 0xae, 0xb3, 0xbd, 0x79, 0xa0, 0x1f, 0x3e, 0xd4, 0x0f, 0xf7, 0xf4, 0xc3, 0x3b, 0xd1, 0xe1, 0x4e, 0xd5, 0xd1, 0xcd, 0xc6, 0x61, 0x98, 0xcd, 0x45, 0x33, 0xcb, 0xbb, 0xfb, 0xcd, 0x4a, 0xd7, 0xae, 0x41, 0x90, 0xed, 0xed, 0x77, 0x4d, 0xc7, 0xee, 0xb4, 0x9b, 0xfb, 0xa8, 0xba, 0x02, 0xca, 0x87, 0x72, 0xc1, 0x90, 0xc5, 0x6d, 0x50, 0xbc, 0x38, 0x53, 0x98, 0xcc, 0x4d, 0x4d, 0x4f, 0x73, 0xd5, 0x09, 0xf4, 0xc5, 0x8a, 0x53, 0x6b, 0xd9, 0x9d, 0x8e, 0xd9, 0xae, 0x03, 0xdd, 0x4a, 0xab, 0xd9, 0x68, 0xd9, 0x05, 0x01, 0x32, 0xf3, 0xaf, 0x15, 0x26, 0xc1, 0x34, 0x9d, 0x76, 0xbd, 0x2b, 0x46, 0xf2, 0x53, 0x33, 0x7c, 0x64, 0xd7, 0xae, 0x35, 0xf6, 0x77, 0x61, 0x4c, 0xf0, 0xb3, 0x03, 0x34, 0xd6, 0x01, 0xd7, 0x42, 0x04, 0x1d, 0xe1, 0xbd, 0xc6, 0x81, 0xdd, 0xec, 0xf0, 0x34, 0x10, 0x5c, 0x22, 0x5f, 0x0c, 0xaf, 0x30, 0xcd, 0x07, 0x90, 0x62, 0x80, 0xfc, 0xb5, 0xc6, 0x81, 0x95, 0x2f, 0xf9, 0xd4, 0x17, 0x1a, 0x9d, 0xbd, 0x66, 0xe5, 0xd0, 0xec, 0x55, 0x9c, 0x3d, 0x49, 0x6b, 0x92, 0x63, 0xb6, 0xda, 0x2d, 0x5b, 0xf4, 0xc1, 0x41, 0x26, 0x84, 0x00, 0xf6, 0x41, 0xd7, 0xb1, 0x77, 0x6d, 0x57, 0x1f, 0x88, 0x23, 0x14, 0x82, 0x53, 0x66, 0xa6, 0x51, 0x27, 0x70, 0x33, 0xfd, 0x1a, 0xaa, 0xc5, 0x94, 0x0b, 0xcc, 0xed, 0xb6, 0xf7, 0x5b, 0x5d, 0xae, 0x95, 0x9d, 0x4a, 0xad, 0xdd, 0x03, 0xc7, 0xef, 0x7c, 0xb1, 0xe0, 0xf1, 0x84, 0xbd, 0x85, 0x8a, 0xf3, 0x45, 0x6b, 0xb2, 0x70, 0xf1, 0x52, 0x60, 0xf4, 0x2a, 0x78, 0x58, 0xd7, 0x9a, 0xc2, 0x61, 0x4e, 0x29, 0xff, 0x8c, 0x8a, 0xe4, 0xab, 0xb3, 0x76, 0xe5, 0x75, 0xb3, 0xdb, 0x36, 0xaf, 0x82, 0x12, 0x2b, 0x8e, 0x14, 0x7d, 0xae, 0xd3, 0xd9, 0x47, 0x37, 0xde, 0xef, 0xe0, 0xbf, 0x62, 0xca, 0xe1, 0x1e, 0xf8, 0x04, 0xb8, 0x74, 0x77, 0x1f, 0xec, 0x6f, 0x76, 0x31, 0x19, 0x76, 0x76, 0xda, 0xfb, 0xcd, 0x1a, 0xa8, 0xa8, 0x6b, 0x6e, 0xd9, 0x66, 0xcb, 0xb6, 0x6b, 0x76, 0xcd, 0x17, 0x69, 0xa3, 0x2d, 0x68, 0x4e, 0x65, 0x44, 0xbf, 0x9a, 0x7d, 0xcb, 0xb1, 0x01, 0xbb, 0x95, 0xa9, 0xce, 0x82, 0x98, 0x93, 0xd3, 0x93, 0xd3, 0x17, 0xb3, 0x9f, 0xae, 0x4e, 0x4c, 0x15, 0x0b, 0x3f, 0x5b, 0xfc, 0xb9, 0xbd, 0x76, 0x2f, 0x93, 0xa9, 0x8e, 0xc3, 0xf8, 0xc5, 0x8b, 0xd9, 0x89, 0x29, 0x6c, 0x72, 0xc5, 0xc2, 0x74, 0xf6, 0xd2, 0x2d, 0xa1, 0xe6, 0x92, 0x47, 0x2f, 0xc3, 0x7b, 0x1e, 0x35, 0x9e, 0xf1, 0x32, 0xfe, 0x62, 0xd5, 0x82, 0x93, 0xcd, 0xa9, 0xdd, 0xed, 0x60, 0x77, 0x2b, 0x8b, 0x34, 0x85, 0x9c, 0x62, 0x14, 0xc5, 0x47, 0x19, 0x9f, 0xad, 0xf0, 0xeb, 0xce, 0xf6, 0x96, 0x4e, 0x74, 0x90, 0x70, 0xb2, 0x34, 0x55, 0x9a, 0x7c, 0xed, 0xd3, 0xd5, 0x31, 0x21, 0x3a, 0x17, 0x76, 0x0c, 0x15, 0x50, 0xcd, 0x4d, 0x16, 0xa6, 0xa7, 0x66, 0x66, 0x66, 0xb2, 0x79, 0xa1, 0x08, 0x55, 0x7a, 0x24, 0x18, 0x23, 0xbb, 0x58, 0x4b, 0x4a, 0xee, 0x76, 0xb6, 0xd5, 0x8e, 0x2a, 0xf5, 0x0a, 0xc8, 0x6c, 0x77, 0xba, 0xa6, 0xed, 0x46, 0xba, 0x48, 0x4a, 0xe6, 0x76, 0xe3, 0xa6, 0xdd, 0x12, 0x29, 0x01, 0x25, 0xdf, 0x6b, 0xc3, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xd2, 0xe2, 0x1a, 0xb0, 0x9b, 0xe0, 0xc3, 0xf5, 0x8e, 0xdd, 0x75, 0xb5, 0xd5, 0xec, 0xb4, 0xcd, 0x37, 0x6d, 0xa7, 0xfd, 0x33, 0x18, 0x99, 0x18, 0xf3, 0x8e, 0x6d, 0xbb, 0xb9, 0xa2, 0x64, 0x5e, 0xb6, 0xbb, 0xd5, 0x9d, 0x0c, 0x0f, 0x13, 0xa0, 0x94, 0xe3, 0x37, 0x30, 0x2d, 0xcb, 0x33, 0x3d, 0x8c, 0x58, 0xa8, 0xa1, 0xb6, 0x93, 0x81, 0xdb, 0x31, 0x60, 0x6a, 0x1c, 0x61, 0xe3, 0x3c, 0x96, 0x20, 0x10, 0x40, 0x1b, 0x17, 0xb3, 0xd9, 0x09, 0x18, 0xe7, 0x09, 0x5e, 0xca, 0xec, 0xf9, 0xc1, 0x54, 0xa1, 0x08, 0x89, 0x5c, 0x5a, 0xa5, 0xb8, 0x90, 0x11, 0x19, 0x35, 0x07, 0xa4, 0x0a, 0x07, 0x87, 0x39, 0x9e, 0x5b, 0xb2, 0x05, 0x90, 0xdf, 0x97, 0x1c, 0xa2, 0xbc, 0x5b, 0x69, 0x55, 0x6d, 0xcc, 0x1c, 0x9e, 0xf4, 0x32, 0x99, 0x80, 0x13, 0xb4, 0xa4, 0x62, 0xb8, 0x98, 0x5e, 0xba, 0x43, 0x24, 0x4f, 0x82, 0xec, 0x5b, 0xc8, 0xb4, 0xe4, 0xf6, 0x92, 0xe4, 0x28, 0x9f, 0x41, 0xfe, 0xf3, 0x9e, 0x24, 0xd9, 0x6c, 0xde, 0x15, 0x21, 0x2b, 0x4c, 0x38, 0x32, 0x22, 0x73, 0xc8, 0x82, 0x79, 0xa5, 0xb2, 0xdf, 0xe9, 0x34, 0x2a, 0x2d, 0xdf, 0x57, 0x70, 0x44, 0x3a, 0x0a, 0xea, 0xc8, 0xcd, 0xc9, 0x95, 0xa6, 0xed, 0xd9, 0xd9, 0x3e, 0xd8, 0x2b, 0x66, 0xf8, 0xd0, 0x18, 0xae, 0x8d, 0x6b, 0x78, 0x42, 0x95, 0xf2, 0xdd, 0xca, 0x9e, 0x47, 0xd6, 0xac, 0x37, 0x9a, 0x5d, 0xdb, 0x31, 0x2b, 0xcd, 0x36, 0xd8, 0x70, 0xa7, 0xed, 0xbc, 0x69, 0xba, 0xf9, 0x91, 0x1b, 0x64, 0x11, 0x46, 0x4a, 0xbe, 0x41, 0xc4, 0x62, 0x9e, 0x45, 0xf8, 0x94, 0x2d, 0x4b, 0x58, 0xcd, 0x35, 0x58, 0x26, 0x0f, 0x1e, 0x9a, 0xc3, 0x39, 0xe2, 0x41, 0x2b, 0x7c, 0x30, 0x3c, 0x09, 0xf3, 0x65, 0x78, 0x52, 0x2d, 0x32, 0x29, 0x48, 0x49, 0xac, 0x5e, 0xeb, 0x74, 0x2d, 0xae, 0x64, 0x14, 0xab, 0xc0, 0x9f, 0x7d, 0x28, 0xd7, 0x7c, 0xbb, 0x05, 0xcf, 0x5d, 0x00, 0xbb, 0x46, 0x03, 0x0b, 0xf5, 0x6c, 0xcc, 0x86, 0x05, 0x1f, 0x97, 0xeb, 0xc4, 0x92, 0x19, 0x5d, 0xa1, 0xd9, 0xdb, 0xb2, 0xb8, 0x5a, 0x81, 0x36, 0xe7, 0x5e, 0xa8, 0x53, 0x9d, 0x50, 0xf5, 0x26, 0x60, 0xd2, 0xd1, 0x4c, 0xa8, 0xf9, 0x13, 0x42, 0x14, 0x80, 0xb9, 0x35, 0x61, 0x17, 0xa1, 0x6c, 0x2f, 0x84, 0x0a, 0x8a, 0x9b, 0x66, 0xb6, 0xc6, 0x7a, 0x5b, 0xe3, 0xd5, 0xb1, 0x5e, 0x75, 0xbc, 0x36, 0xd6, 0xab, 0x65, 0x27, 0x32, 0xd0, 0x85, 0x0e, 0xdc, 0x7a, 0xa6, 0xbb, 0xf8, 0xd4, 0xa6, 0xbb, 0x98, 0x6c, 0xba, 0x4a, 0xc4, 0x74, 0xc5, 0xa8, 0x55, 0x7e, 0x74, 0xf6, 0xe5, 0x93, 0xec, 0xc8, 0xa4, 0xe2, 0x8f, 0xca, 0x09, 0x2a, 0xbe, 0x13, 0x14, 0xb5, 0x36, 0xfe, 0x61, 0x7a, 0x89, 0x9c, 0x60, 0xfb, 0x13, 0x8a, 0x1f, 0xc6, 0x8d, 0x2a, 0x63, 0xbd, 0xca, 0x78, 0xd0, 0x97, 0xc6, 0xed, 0xb1, 0x9e, 0x8d, 0x0e, 0x55, 0x19, 0x77, 0x7d, 0x6a, 0x1c, 0x06, 0x3c, 0xb7, 0x92, 0x54, 0xdd, 0xbd, 0x91, 0xa2, 0x30, 0xc1, 0x13, 0xee, 0xad, 0x62, 0xfd, 0x48, 0x67, 0x8e, 0x43, 0x35, 0xff, 0x7a, 0xe2, 0x00, 0x4a, 0xce, 0xdd, 0xaa, 0xf9, 0x8b, 0xcf, 0x35, 0x9b, 0xb0, 0xbb, 0xf1, 0x52, 0xe9, 0x0e, 0x3c, 0x0e, 0xb8, 0x1b, 0xf3, 0x0c, 0x6b, 0xd7, 0xeb, 0xb0, 0x0f, 0x17, 0x29, 0xd7, 0xf3, 0xeb, 0x0d, 0xa7, 0xa1, 0xe4, 0x57, 0xc5, 0x97, 0x45, 0xae, 0x42, 0x1e, 0xf3, 0xee, 0xee, 0xdc, 0xf5, 0x60, 0x11, 0x0b, 0x08, 0x42, 0xbf, 0x0c, 0xf8, 0xad, 0x8f, 0xe5, 0xed, 0xe9, 0x7d, 0x7f, 0xe0, 0xa2, 0x07, 0x29, 0x7a, 0xae, 0xe0, 0xc1, 0x7c, 0x92, 0x9e, 0x17, 0xf8, 0x30, 0x0f, 0x4f, 0xaa, 0x23, 0x68, 0x9f, 0xc0, 0xa3, 0xa6, 0xed, 0xf0, 0x27, 0xa7, 0xb2, 0x13, 0x06, 0x7c, 0x7c, 0x8e, 0xc2, 0xdb, 0x9d, 0x18, 0xc5, 0x67, 0x25, 0xc4, 0xfb, 0xde, 0x4e, 0xc5, 0x7b, 0xdc, 0xdc, 0x80, 0xdd, 0x64, 0x48, 0x1d, 0xee, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x84, 0x2f, 0xfa, 0x72, 0x7c, 0xcc, 0xdb, 0x78, 0x8e, 0x23, 0x7b, 0x85, 0xc3, 0x31, 0xfe, 0x6f, 0x76, 0x8c, 0x6f, 0x64, 0x0f, 0x72, 0x1e, 0xe0, 0x80, 0x03, 0x0e, 0x24, 0xe0, 0x30, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x38, 0xee, 0x3d, 0x5d, 0xfe, 0xd7, 0x83, 0xbb, 0x54, 0xae, 0xdb, 0x65, 0xe8, 0x44, 0x59, 0x2b, 0x1c, 0x8c, 0x5b, 0x62, 0x69, 0xbe, 0x9f, 0x76, 0x0d, 0x81, 0x98, 0x16, 0xdf, 0x9f, 0xb8, 0x7b, 0xdb, 0x5c, 0xe4, 0x46, 0x70, 0xc1, 0x69, 0x58, 0x75, 0xa7, 0x52, 0xed, 0x0a, 0x56, 0x27, 0x66, 0x5c, 0x1d, 0x37, 0xea, 0x62, 0x04, 0x76, 0x4d, 0xa5, 0x52, 0x29, 0xcb, 0xb9, 0x71, 0x2c, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0xdb, 0xba, 0x89, 0x1c, 0xb2, 0x15, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xa5, 0x5b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xc9, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x29, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0xba, 0x16, 0xbc, 0x97, 0x5e, 0x76, 0x2a, 0xdb, 0xfc, 0x55, 0x10, 0x36, 0x26, 0x62, 0x6b, 0xc0, 0xdf, 0xf2, 0x72, 0xe2, 0xad, 0x4e, 0x88, 0xca, 0x27, 0x17, 0x0e, 0x2d, 0xfe, 0x32, 0x96, 0x97, 0x3d, 0xbe, 0xe7, 0x1f, 0x71, 0x55, 0x6e, 0x71, 0xdf, 0xe0, 0xa0, 0x09, 0x8f, 0x4a, 0x4f, 0x50, 0xd9, 0xc9, 0x8a, 0x57, 0xb0, 0x11, 0x6f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x8f, 0x85, 0xe1, 0x85, 0xf6, 0x1a, 0xe3, 0xe6, 0x0b, 0x71, 0xe3, 0xbd, 0x3a, 0x7b, 0x38, 0xe2, 0x05, 0x7b, 0x5a, 0xee, 0x2a, 0x33, 0x61, 0x72, 0xd9, 0xd0, 0x9b, 0x72, 0xea, 0x56, 0xea, 0x7f, 0x01, 0x2f, 0xfb, 0xfe, 0x36, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x64, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x12, 0x59, 0x16, 0x49, 0x15, 0x49, 0xed, 0x3a, 0xe5, 0x72, 0x31, 0x20, 0x38, 0x20, 0x11, 0x83, 0x00, 0x6b, 0x00, 0x0a, 0xe4, 0x6e, 0x54, 0x95, 0xa3, 0x0e, 0x39, 0xe4, 0xea, 0x3d, 0x6d, 0x92, 0x4b, 0xcc, 0xd2, 0x21, 0x8f, 0x3f, 0xd0, 0x92, 0x12, 0x3b, 0x76, 0x3a, 0x58, 0xaf, 0x1f, 0x79, 0x5a, 0xa2, 0x9f, 0x79, 0x42, 0x88, 0x36, 0xce, 0x3b, 0x5b, 0xa5, 0x7c, 0x5f, 0x3f, 0x66, 0x7a, 0x66, 0x7a, 0x86, 0xd2, 0x5a, 0xb6, 0x37, 0x0c, 0x7b, 0xd8, 0xea, 0xe9, 0xfe, 0xfa, 0xfb, 0xfa, 0x7b, 0x4f, 0x4f, 0x0f, 0x4a, 0xc3, 0x96, 0x65, 0x3d, 0xf3, 0xce, 0x27, 0xac, 0x1e, 0x83, 0x72, 0xf3, 0xe6, 0xcd, 0x5b, 0xc7, 0xc7, 0xc7, 0xb7, 0xb0, 0x85, 0xee, 0x2d, 0x46, 0xbd, 0xca, 0x58, 0x7f, 0x70, 0xf3, 0x26, 0x1b, 0x1c, 0x1f, 0xd3, 0xc1, 0xcd, 0xdf, 0xa5, 0x03, 0x76, 0x8b, 0x32, 0x7a, 0x8b, 0x52, 0x55, 0x39, 0xfe, 0xf0, 0xf0, 0x70, 0x2e, 0x9d, 0x4e, 0xe7, 0xb0, 0x85, 0x6e, 0x0e, 0xf0, 0x54, 0x45, 0xfc, 0xe1, 0x61, 0x36, 0x48, 0xa7, 0xe9, 0x60, 0xf8, 0x65, 0xc0, 0xcf, 0xd1, 0x01, 0x15, 0xb5, 0x4f, 0x73, 0x16, 0xe3, 0xf8, 0x80, 0x3b, 0x5b, 0x2c, 0x16, 0x67, 0xb1, 0x85, 0xee, 0x2c, 0x81, 0x0a, 0xb8, 0xb3, 0x12, 0x3f, 0x9d, 0x66, 0x83, 0x62, 0x91, 0x0e, 0xd2, 0x05, 0xc0, 0x9f, 0xa5, 0x03, 0x02, 0x95, 0xce, 0x02, 0xfe, 0xac, 0xc4, 0xef, 0x76, 0xbb, 0x8d, 0x5a, 0xad, 0xd6, 0xc0, 0x16, 0xba, 0xbc, 0x12, 0x8b, 0x60, 0x8b, 0xf8, 0xdd, 0x2e, 0x1b, 0xd4, 0x6a, 0x74, 0xd0, 0xdd, 0x01, 0xfc, 0x06, 0xd0, 0x6c, 0x50, 0x6a, 0x41, 0xc5, 0xf6, 0xab, 0xf7, 0xee, 0x3d, 0x7f, 0x0f, 0xcb, 0x83, 0xfb, 0xf7, 0xee, 0x0d, 0x06, 0xf7, 0x1e, 0x0c, 0x06, 0xf7, 0xb1, 0x0b, 0xff, 0x3c, 0xf8, 0xf6, 0x60, 0xf0, 0x82, 0x82, 0xf3, 0x71, 0x80, 0xf3, 0x79, 0x11, 0xf8, 0x7d, 0x89, 0x2f, 0x5b, 0xe8, 0x07, 0xe0, 0x0f, 0x24, 0xfd, 0x07, 0x12, 0xff, 0x81, 0x8f, 0xff, 0x2b, 0xb5, 0xda, 0xcf, 0xd4, 0xae, 0xef, 0xd4, 0x6a, 0x3b, 0xd7, 0x45, 0xed, 0x76, 0x79, 0x0b, 0x23, 0xd7, 0xf7, 0xbb, 0xdd, 0xe7, 0xec, 0x74, 0xfa, 0x63, 0xe9, 0xe1, 0x97, 0xd3, 0xe9, 0x97, 0x5f, 0x4a, 0xeb, 0x2d, 0xdc, 0xbd, 0xf4, 0x73, 0xc3, 0xc3, 0xcf, 0xbc, 0x73, 0x7c, 0x9c, 0x3a, 0xfe, 0xc2, 0xdb, 0xc7, 0xbc, 0xbe, 0xfd, 0x85, 0x63, 0x75, 0x0f, 0x77, 0x6f, 0xff, 0xe6, 0xe7, 0x3f, 0x3f, 0x34, 0x51, 0x2c, 0x5e, 0x28, 0x16, 0x5e, 0x29, 0xf2, 0xfa, 0x4a, 0x1a, 0xb4, 0x8c, 0x6d, 0xa1, 0x58, 0x80, 0x7f, 0x91, 0x36, 0xb7, 0x37, 0xda, 0x9e, 0x5f, 0x5f, 0xe1, 0xf7, 0xbf, 0x01, 0x7e, 0xc0, 0x2c, 0x8a, 0xba, 0xed, 0xb1, 0x5b, 0x16, 0x03, 0xdb, 0xf7, 0x6f, 0x81, 0xfd, 0x8f, 0x65, 0x45, 0x7f, 0xb0, 0x68, 0x7f, 0xc0, 0xd8, 0x60, 0xc0, 0xed, 0x8d, 0xb6, 0x4f, 0xdf, 0x81, 0x16, 0xaf, 0x74, 0xfa, 0xe7, 0xc1, 0x0f, 0x3c, 0xfc, 0x1c, 0xa5, 0x60, 0x7b, 0x5e, 0x73, 0x69, 0xca, 0xb8, 0x1f, 0x0c, 0xfb, 0xf8, 0xdc, 0xde, 0x68, 0xfb, 0xbb, 0x77, 0xef, 0xce, 0x16, 0x67, 0x67, 0xf1, 0x1e, 0x69, 0x78, 0xf8, 0xb3, 0x94, 0x82, 0xed, 0xe9, 0x5d, 0xa8, 0xb3, 0x45, 0xca, 0xb8, 0x1f, 0xa4, 0x7d, 0x7c, 0x6e, 0x6b, 0xb4, 0x7d, 0x0d, 0xdb, 0x2f, 0xf2, 0xfb, 0x5f, 0x03, 0x3f, 0xf0, 0xf0, 0x1b, 0x16, 0x03, 0xdb, 0xf7, 0x1b, 0x60, 0xff, 0x9a, 0xac, 0xe8, 0x0f, 0x0a, 0x1f, 0xc2, 0xc0, 0x8a, 0xf3, 0x01, 0x1c, 0xd7, 0xe1, 0x61, 0x1f, 0x08, 0xc2, 0xa3, 0x3e, 0x10, 0x80, 0x1b, 0x7c, 0x40, 0xc1, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0x8e, 0xf0, 0x38, 0x1f, 0xc0, 0x71, 0x84, 0xc7, 0xf9, 0x00, 0x8e, 0x1b, 0xe3, 0x97, 0x97, 0x74, 0x2e, 0xc7, 0xee, 0x98, 0xe2, 0x17, 0xe0, 0x60, 0x4f, 0xa8, 0x77, 0xa0, 0x5a, 0x4f, 0xa1, 0xec, 0x5c, 0x73, 0x9e, 0xb3, 0x7e, 0x4c, 0x05, 0x9d, 0x2b, 0x52, 0x19, 0xe1, 0x15, 0xd4, 0x5f, 0xc4, 0x12, 0x81, 0x7f, 0xeb, 0x79, 0x6f, 0x4e, 0xf1, 0x82, 0x65, 0xf1, 0xfa, 0xc3, 0x47, 0x8f, 0x78, 0xfb, 0xf5, 0xe7, 0xef, 0x15, 0xf5, 0xa2, 0xe0, 0xfa, 0x3c, 0xad, 0x58, 0x1f, 0xf1, 0xe2, 0xc7, 0x2f, 0xb6, 0x77, 0x58, 0x34, 0x7e, 0x2d, 0x8c, 0xd9, 0x3e, 0xc4, 0x2e, 0xf7, 0x81, 0x70, 0xfc, 0x3e, 0x0d, 0x1e, 0x1e, 0x3e, 0x7a, 0x64, 0x9d, 0x97, 0xf3, 0x72, 0x5e, 0x7e, 0x4a, 0x85, 0x10, 0x51, 0x21, 0x9b, 0x53, 0xc2, 0x78, 0xd5, 0x0b, 0x65, 0x04, 0x40, 0x50, 0x29, 0x66, 0x05, 0x9c, 0xc4, 0x42, 0x49, 0x16, 0xe1, 0x70, 0x31, 0x81, 0x8b, 0x6d, 0x90, 0x00, 0xd0, 0x66, 0x96, 0x18, 0x67, 0xb2, 0x1f, 0xc0, 0x17, 0x63, 0x1c, 0x2e, 0xe7, 0x06, 0xd7, 0x67, 0x82, 0xbe, 0x5a, 0x83, 0x91, 0xc8, 0xfa, 0xc8, 0xbf, 0xc0, 0xb7, 0x44, 0x55, 0x20, 0x48, 0xe2, 0x71, 0xd5, 0x67, 0x4f, 0xa3, 0x8f, 0x17, 0x31, 0xc8, 0x47, 0xd5, 0xda, 0x8c, 0xdf, 0x07, 0xc5, 0xf3, 0x75, 0x66, 0xd2, 0x9f, 0x90, 0x89, 0x0a, 0xdd, 0x71, 0xfd, 0x85, 0xf9, 0x87, 0xf9, 0x84, 0xf2, 0x6a, 0xc4, 0x67, 0x04, 0x54, 0xcf, 0xbc, 0x8a, 0xfd, 0x80, 0xf9, 0x28, 0x41, 0x96, 0x08, 0xb4, 0x04, 0x5b, 0x4a, 0x83, 0x70, 0x8f, 0x6f, 0x65, 0x1f, 0x8b, 0x1a, 0xec, 0xcb, 0x44, 0xe5, 0x36, 0x62, 0x06, 0x27, 0xa1, 0x7e, 0x8d, 0xd8, 0x57, 0xca, 0x48, 0xa5, 0xfd, 0xc2, 0xbb, 0x02, 0x09, 0x43, 0xff, 0xb1, 0x94, 0x8d, 0x4d, 0xfe, 0xc3, 0x69, 0x9b, 0xf0, 0x43, 0xfe, 0x41, 0xa3, 0xfe, 0x61, 0x6a, 0xb5, 0x09, 0xa0, 0x24, 0xd4, 0x2e, 0xfe, 0xa1, 0x23, 0xb3, 0xa8, 0x7f, 0x29, 0xfb, 0xca, 0x36, 0x22, 0x3d, 0xd7, 0x8b, 0x81, 0x37, 0x9d, 0x47, 0x46, 0x8c, 0xb8, 0xb8, 0xb8, 0xd4, 0x1b, 0xe1, 0x31, 0x64, 0x05, 0xe5, 0x57, 0xfe, 0xa4, 0xec, 0x42, 0x23, 0xdb, 0x2a, 0x5c, 0x97, 0x0a, 0x1f, 0x37, 0xb8, 0x8f, 0x87, 0x4f, 0x63, 0xf0, 0x75, 0xff, 0x55, 0x3a, 0x8e, 0xd0, 0x27, 0x52, 0x3e, 0x22, 0xf9, 0x0d, 0xb1, 0xcf, 0x64, 0x9c, 0xb1, 0x28, 0xd8, 0xd3, 0xbb, 0xb4, 0x31, 0x35, 0xe8, 0x57, 0xf1, 0xa5, 0x6a, 0x44, 0x77, 0x32, 0xbf, 0x08, 0x5e, 0xac, 0x88, 0x7f, 0x5a, 0xbe, 0x87, 0x44, 0xfd, 0x8f, 0xf8, 0x34, 0x78, 0x1b, 0xd1, 0x0f, 0x56, 0x99, 0xbf, 0xa8, 0xd0, 0x61, 0x6c, 0x7c, 0xb0, 0x60, 0xfe, 0xa2, 0x22, 0x87, 0xa8, 0x01, 0xe2, 0xdd, 0x53, 0x6d, 0x3c, 0x46, 0x6d, 0xba, 0xfb, 0xa9, 0x1a, 0xe7, 0x3a, 0x34, 0xce, 0xb5, 0x34, 0xbf, 0xd2, 0x73, 0x96, 0x9e, 0xdf, 0x12, 0x7d, 0x93, 0x5a, 0x32, 0xf7, 0xca, 0xd0, 0x63, 0x2a, 0xdf, 0x1a, 0x4c, 0xcb, 0xa2, 0x26, 0x86, 0x4c, 0x49, 0x20, 0xeb, 0x10, 0xa6, 0x5f, 0xb2, 0xaf, 0xe7, 0x57, 0xe8, 0x62, 0xf6, 0xb2, 0xb0, 0x0d, 0xe4, 0x57, 0x19, 0xdb, 0x98, 0xa1, 0x08, 0x74, 0x88, 0x67, 0x43, 0xe2, 0xe9, 0x9e, 0xcb, 0xa0, 0xf9, 0x46, 0x30, 0x06, 0x89, 0x62, 0x9e, 0xcb, 0x89, 0xcb, 0x12, 0xdd, 0x85, 0x19, 0xf1, 0xe3, 0x4e, 0x3d, 0xc7, 0x88, 0xaf, 0x0b, 0x42, 0x08, 0x91, 0x54, 0x82, 0xad, 0x1c, 0xd7, 0x9d, 0x87, 0x0a, 0xc6, 0x41, 0x10, 0xc6, 0xd3, 0xc4, 0x79, 0x39, 0x2f, 0x67, 0xbd, 0xf0, 0x23, 0xb2, 0xc1, 0x60, 0xd0, 0xc7, 0x37, 0x7d, 0x2c, 0xbc, 0xed, 0xf5, 0x64, 0x3b, 0x90, 0xe0, 0x9e, 0x0e, 0xee, 0xf5, 0xc4, 0xf4, 0x81, 0x68, 0xfd, 0x62, 0xa0, 0x13, 0x02, 0x47, 0xe8, 0x9c, 0x5b, 0xe0, 0xa7, 0x5b, 0xfa, 0x3d, 0x34, 0x24, 0xd8, 0x0d, 0x2a, 0x1a, 0x88, 0x45, 0xcb, 0x40, 0x2b, 0xbd, 0x30, 0x50, 0xf9, 0x09, 0xd2, 0x89, 0xc1, 0x57, 0x7e, 0x62, 0xc4, 0x3f, 0xb7, 0xc0, 0x47, 0x28, 0xfe, 0x0d, 0x95, 0xf9, 0x66, 0xed, 0xc5, 0x54, 0x13, 0x3e, 0x06, 0x38, 0x8c, 0xf5, 0x07, 0x26, 0x7c, 0x3c, 0x57, 0x1a, 0x60, 0xed, 0xc5, 0xe1, 0xf7, 0x07, 0xa2, 0x32, 0x23, 0x3e, 0xe2, 0xf1, 0x7a, 0xea, 0xfa, 0x51, 0xfc, 0x41, 0xa8, 0x1a, 0xf0, 0x07, 0x7a, 0x4d, 0xe4, 0xdf, 0x8c, 0xef, 0xc9, 0xde, 0x97, 0x2a, 0xd4, 0xf1, 0x75, 0xd9, 0xf1, 0xfe, 0xf4, 0xf8, 0x83, 0xe0, 0x82, 0xb8, 0x91, 0x95, 0xb1, 0x98, 0x00, 0x65, 0x8f, 0x59, 0xf4, 0x60, 0x66, 0x61, 0x7b, 0x9b, 0x79, 0xd1, 0x6c, 0x1d, 0xe5, 0x45, 0xca, 0x19, 0x8b, 0x2f, 0x6d, 0x9c, 0x80, 0xcf, 0xfa, 0x49, 0xf8, 0x3d, 0xf6, 0xa3, 0xe1, 0x6b, 0x76, 0x8a, 0xc3, 0x57, 0xb6, 0xfe, 0x51, 0xd6, 0xef, 0x27, 0xe1, 0xf7, 0x12, 0xf0, 0xc3, 0xa5, 0x27, 0x78, 0xe6, 0xb5, 0xff, 0x18, 0x35, 0x21, 0x2e, 0xfd, 0xf8, 0x7c, 0x02, 0xe7, 0x30, 0xc5, 0x3f, 0x4b, 0xce, 0x03, 0x49, 0xf8, 0xfd, 0x24, 0xfc, 0xde, 0xa9, 0xf8, 0xfd, 0x41, 0x12, 0xbe, 0x97, 0x3f, 0x3e, 0xc4, 0xfa, 0x81, 0xf8, 0x35, 0xe3, 0x7b, 0xf1, 0xff, 0x21, 0xf9, 0xef, 0x27, 0xe1, 0xab, 0x3c, 0xa0, 0xfb, 0x6e, 0xcc, 0xf3, 0x53, 0xf7, 0x9d, 0x53, 0x63, 0xfb, 0x49, 0xf2, 0x00, 0x8b, 0xf3, 0xab, 0x20, 0x2f, 0x06, 0x9f, 0xea, 0x87, 0xe2, 0xc7, 0xcb, 0xd7, 0x11, 0xfc, 0x81, 0x96, 0xaf, 0xcd, 0xf8, 0x7d, 0x15, 0x7f, 0x7d, 0x23, 0xbe, 0xcc, 0xf3, 0xbd, 0xc4, 0xf5, 0x13, 0xf0, 0xa3, 0xf9, 0x3e, 0x0e, 0x3f, 0x90, 0x07, 0xc2, 0xf8, 0xf1, 0xeb, 0xf7, 0x07, 0x5a, 0x0e, 0xe8, 0x9b, 0xf8, 0x57, 0x39, 0xa0, 0xf7, 0x04, 0xb6, 0xec, 0x49, 0x59, 0x3e, 0xf6, 0xe5, 0x4f, 0x58, 0xf8, 0x75, 0xe4, 0xdd, 0x17, 0xa1, 0x7e, 0x00, 0x95, 0xbd, 0x08, 0xf5, 0x03, 0xd1, 0x3e, 0xfa, 0xc0, 0x7a, 0x68, 0x01, 0xe0, 0xa1, 0x9a, 0xf0, 0xc8, 0x7a, 0x08, 0x80, 0x77, 0x61, 0xc2, 0x43, 0x26, 0x27, 0x3d, 0x7c, 0x84, 0x7f, 0xe2, 0x16, 0xf0, 0xf5, 0x2a, 0xc1, 0xe7, 0xe5, 0xbc, 0x9c, 0x97, 0xff, 0xd3, 0x9b, 0x78, 0xad, 0x5a, 0x56, 0xf4, 0xfb, 0x09, 0xb5, 0xac, 0xa4, 0x2f, 0xf5, 0x54, 0x1c, 0x4d, 0x07, 0xda, 0xf0, 0xf9, 0x2b, 0x91, 0xc7, 0x70, 0x78, 0x13, 0x3d, 0x7e, 0xf5, 0xcf, 0x5d, 0xa9, 0xea, 0x87, 0x8e, 0x20, 0x39, 0x3e, 0x11, 0x67, 0x77, 0x94, 0x44, 0xcf, 0x97, 0x69, 0x92, 0x7c, 0xea, 0x4c, 0x97, 0xe8, 0xc7, 0x75, 0x91, 0xe3, 0x63, 0xaf, 0x52, 0xc3, 0xf1, 0x3b, 0x21, 0xe2, 0xd8, 0x9f, 0x1f, 0xfb, 0x11, 0xf3, 0x11, 0x3d, 0x65, 0xf1, 0x67, 0xb8, 0xfa, 0xa7, 0x8c, 0x38, 0x7e, 0xe9, 0x63, 0xbc, 0xcd, 0x52, 0x12, 0x3d, 0xbf, 0xb7, 0x22, 0xfa, 0x8b, 0xd2, 0x65, 0xf2, 0xf4, 0x94, 0x45, 0x3f, 0x5f, 0x78, 0xe7, 0xbb, 0xca, 0x07, 0xc2, 0xdf, 0xc7, 0x98, 0xf7, 0x7d, 0x4d, 0x4e, 0x89, 0xc0, 0x89, 0xf7, 0xdd, 0x8d, 0xd0, 0x78, 0xfa, 0x8c, 0xaa, 0xb9, 0x56, 0x04, 0x9f, 0x69, 0xeb, 0x98, 0x3e, 0xbf, 0x28, 0xb8, 0x89, 0x7f, 0x7d, 0x7d, 0xc3, 0xe7, 0x3f, 0x89, 0x4f, 0x02, 0xad, 0x19, 0x2e, 0x8c, 0x43, 0x59, 0xbc, 0xce, 0x4d, 0xfa, 0x0f, 0xc3, 0x23, 0xf6, 0xd5, 0x6c, 0x63, 0xf2, 0x3f, 0xdd, 0xf6, 0x26, 0x1f, 0x08, 0xe0, 0x99, 0x3e, 0x6f, 0x69, 0xf2, 0x1b, 0xe3, 0x57, 0xfa, 0x2d, 0x3f, 0xfb, 0x36, 0xac, 0xa1, 0xe4, 0xe7, 0x95, 0x89, 0x36, 0x6c, 0x7f, 0x01, 0xf3, 0x5b, 0x33, 0x7e, 0x9c, 0x7d, 0x34, 0xfa, 0x06, 0x7c, 0xdd, 0xfe, 0x71, 0xfe, 0x15, 0x80, 0x1b, 0xe4, 0xe7, 0xe3, 0x94, 0x68, 0x76, 0xd4, 0xdd, 0x2f, 0x28, 0x5b, 0x58, 0x3e, 0xaa, 0x3e, 0x5a, 0xc4, 0xfa, 0x3f, 0xf1, 0x8c, 0xcc, 0x0c, 0xfe, 0xcd, 0x69, 0xca, 0x6f, 0x0a, 0xbc, 0x0d, 0xeb, 0x2f, 0x5c, 0xc3, 0xf4, 0xa9, 0xe4, 0x8d, 0xe7, 0x49, 0x12, 0xc9, 0x7f, 0x9c, 0x3e, 0x91, 0x73, 0xa8, 0x89, 0xff, 0xa0, 0x7e, 0x13, 0xf5, 0xcf, 0xe2, 0xe3, 0x23, 0x88, 0x4f, 0x12, 0xf0, 0xa3, 0xfa, 0x63, 0x2a, 0xff, 0x31, 0x93, 0x7f, 0x90, 0xa8, 0x12, 0x4c, 0xf6, 0x89, 0xe3, 0x3f, 0x0c, 0x23, 0xd1, 0xe7, 0x07, 0x21, 0xbe, 0x0e, 0x19, 0x35, 0xdb, 0x5f, 0x97, 0x33, 0x18, 0xbf, 0x44, 0x54, 0x9d, 0xcf, 0xb0, 0xfd, 0xb5, 0xdc, 0x12, 0xf9, 0x8c, 0xc6, 0x42, 0xcf, 0x97, 0x84, 0xcf, 0x8b, 0xfe, 0x4d, 0xf4, 0x99, 0xe0, 0x3d, 0x7f, 0x48, 0xcc, 0xe7, 0xdb, 0xc7, 0xfc, 0xa6, 0x14, 0xf6, 0x5f, 0xc3, 0x92, 0x46, 0x1c, 0xcc, 0xdd, 0x22, 0x7f, 0x1b, 0xfc, 0x37, 0xe4, 0x03, 0x26, 0x7c, 0xa6, 0x3e, 0x01, 0xb3, 0x68, 0x82, 0x4c, 0xa2, 0x1f, 0x7c, 0x46, 0x19, 0x72, 0x20, 0xee, 0x29, 0x88, 0xdc, 0x5b, 0x18, 0x9f, 0x7f, 0x32, 0xc7, 0xc9, 0x38, 0xb2, 0x42, 0x31, 0xca, 0x0c, 0x39, 0x28, 0x22, 0xa0, 0x15, 0xef, 0x9f, 0xe1, 0xe4, 0x4f, 0x4c, 0xf4, 0xf5, 0xfc, 0x68, 0xb0, 0xaf, 0x5e, 0x2d, 0x83, 0xfc, 0xea, 0xd9, 0xc8, 0xe3, 0x9f, 0x18, 0xe0, 0x49, 0xfc, 0x87, 0x62, 0xd8, 0xf4, 0x0c, 0x39, 0x3d, 0x07, 0x84, 0xec, 0x43, 0x63, 0x9e, 0x01, 0x06, 0xf5, 0xe8, 0xf6, 0x37, 0xc6, 0x7f, 0xd8, 0x76, 0x26, 0xf9, 0x13, 0xe2, 0x3f, 0x1c, 0xc3, 0x26, 0x5f, 0x0e, 0xe4, 0x00, 0x6a, 0xd2, 0x2f, 0xf1, 0xbe, 0xa1, 0x9b, 0xe0, 0x61, 0xd9, 0x69, 0x52, 0x0e, 0x88, 0x89, 0x7f, 0x1a, 0x13, 0xff, 0x16, 0x31, 0x54, 0x53, 0xfc, 0xb3, 0x98, 0xf8, 0x17, 0x1f, 0x9c, 0xad, 0xa7, 0xf3, 0x6b, 0xd9, 0xf3, 0x72, 0x5e, 0xce, 0xcb, 0x79, 0x09, 0xee, 0x0f, 0xa8, 0xf6, 0x5a, 0x42, 0xa3, 0xa9, 0xc7, 0x22, 0x09, 0xfb, 0x07, 0x42, 0xbc, 0x9f, 0x50, 0x7a, 0x6d, 0x24, 0xff, 0xeb, 0xad, 0x21, 0x3d, 0x06, 0xde, 0x5d, 0x49, 0xcc, 0xf1, 0x84, 0xfa, 0x69, 0x0e, 0x31, 0xf3, 0x1f, 0xcf, 0x60, 0x48, 0x46, 0x62, 0xde, 0x9f, 0x51, 0xcb, 0xfc, 0xfe, 0xac, 0x64, 0x54, 0xe7, 0x10, 0x71, 0x3a, 0x64, 0xa7, 0x9d, 0x43, 0x84, 0x8e, 0x23, 0xac, 0xe8, 0x36, 0xe7, 0xb1, 0xed, 0x65, 0xc5, 0x1f, 0x01, 0x18, 0xcf, 0x0c, 0xf4, 0x9f, 0x36, 0x31, 0x13, 0xef, 0x9a, 0xfc, 0xa6, 0xc7, 0x9b, 0x4e, 0x3f, 0x09, 0x6e, 0x19, 0xe8, 0x13, 0xcd, 0x37, 0x4c, 0xcf, 0x3f, 0x46, 0xb4, 0xc7, 0x26, 0x31, 0x6f, 0xbf, 0x88, 0x15, 0xf4, 0xb1, 0x88, 0xde, 0x48, 0xf0, 0x98, 0x27, 0x42, 0x9f, 0x24, 0xe3, 0x27, 0xf1, 0x67, 0x25, 0xc4, 0x86, 0x09, 0x9e, 0x70, 0x3c, 0x13, 0xbb, 0x17, 0x57, 0x3c, 0x31, 0xe3, 0xde, 0x26, 0xf1, 0xe7, 0x89, 0x01, 0xf9, 0x4d, 0x3c, 0x52, 0x5d, 0x7e, 0xcb, 0x1c, 0x3f, 0xba, 0x7e, 0x88, 0x69, 0x7b, 0x43, 0x82, 0xad, 0xc9, 0x3e, 0xde, 0xf1, 0x5a, 0x0c, 0x7e, 0x9c, 0xff, 0xe9, 0xf6, 0x37, 0xfa, 0x57, 0x08, 0x4e, 0xe2, 0xd6, 0x8f, 0xc9, 0x0f, 0x84, 0x9c, 0x22, 0x5f, 0x28, 0x3f, 0xc4, 0xf9, 0x97, 0x15, 0xfc, 0x69, 0x60, 0x94, 0x7e, 0x4c, 0xae, 0x0c, 0x6f, 0xfd, 0x4c, 0xf4, 0x59, 0x28, 0x46, 0x93, 0xf4, 0x47, 0x62, 0xec, 0x47, 0x62, 0xf8, 0x0b, 0xd8, 0xcf, 0xa4, 0xbf, 0x90, 0x8e, 0xe2, 0xec, 0xc7, 0x34, 0x19, 0x4d, 0xfa, 0x8f, 0x8b, 0xff, 0xb0, 0x7e, 0xe3, 0xf4, 0x77, 0x9a, 0xfd, 0xc8, 0x29, 0xfa, 0xf7, 0x78, 0x8c, 0xc1, 0xa7, 0x71, 0xf6, 0xd1, 0xe0, 0x26, 0xfe, 0xc2, 0xf9, 0x85, 0x99, 0xce, 0xff, 0x74, 0xf9, 0x4e, 0x89, 0x61, 0xd3, 0xf1, 0x7b, 0xc0, 0xff, 0x62, 0xec, 0xf3, 0xd8, 0xc7, 0xf9, 0xc4, 0x7a, 0xe2, 0xf7, 0x7f, 0x16, 0xca, 0x13, 0x61, 0xde, 0x99, 0x15, 0x1f, 0xbf, 0xe1, 0x1c, 0x40, 0x63, 0x7e, 0x1e, 0x1e, 0x67, 0xdf, 0x40, 0x8e, 0x8a, 0xc3, 0x0f, 0xf9, 0x91, 0x95, 0x90, 0xe3, 0xc2, 0x67, 0xa4, 0xc4, 0x10, 0x43, 0x71, 0xb9, 0xdb, 0x48, 0x9f, 0x04, 0x03, 0x99, 0x18, 0xe8, 0x13, 0xed, 0xe8, 0xc8, 0x14, 0xbf, 0x49, 0xf9, 0xc5, 0x94, 0x03, 0x2c, 0x2b, 0x39, 0x07, 0x58, 0x09, 0x31, 0x4c, 0xad, 0x64, 0x7c, 0x16, 0x97, 0x43, 0x75, 0xfb, 0x18, 0x62, 0x84, 0xc5, 0x3f, 0x1e, 0xfd, 0xe3, 0xe7, 0xb8, 0xfd, 0x05, 0x89, 0xdf, 0x7f, 0x85, 0x63, 0x98, 0x9e, 0x06, 0xb7, 0xe2, 0xe1, 0xa6, 0xf8, 0x0f, 0xef, 0xdf, 0x48, 0x02, 0xfd, 0xb8, 0xef, 0x33, 0x2a, 0x2f, 0x26, 0xc5, 0x3f, 0x8b, 0x89, 0x7f, 0x6a, 0xf0, 0x31, 0xa3, 0x7f, 0x10, 0x73, 0xfc, 0x7b, 0xfa, 0x7d, 0x36, 0xf7, 0xa2, 0x45, 0x6f, 0x9b, 0xae, 0x6f, 0x7f, 0xc7, 0x74, 0x9d, 0x85, 0x97, 0x13, 0xf6, 0x67, 0xa6, 0xab, 0xff, 0xc0, 0x74, 0x9d, 0x89, 0x97, 0xb1, 0xff, 0x67, 0xf6, 0xfd, 0xea, 0x7b, 0xe1, 0x0b, 0xed, 0xfb, 0xf0, 0xfd, 0xf0, 0x75, 0x6e, 0xdf, 0xb3, 0x62, 0x5f, 0xbc, 0xa2, 0xf6, 0xc5, 0xeb, 0xdc, 0xbe, 0xe7, 0xf6, 0xfd, 0xa8, 0x97, 0x13, 0x83, 0x79, 0x7b, 0xb7, 0x4f, 0x0c, 0xe6, 0x1d, 0x9c, 0x09, 0xfb, 0x9e, 0x18, 0xcc, 0xfb, 0xad, 0xfb, 0x27, 0x06, 0xf3, 0x7e, 0x70, 0xff, 0x2c, 0xc8, 0xfb, 0x95, 0x3f, 0x8d, 0x1a, 0xf8, 0xde, 0xfd, 0x7f, 0xfc, 0xa7, 0xa8, 0x81, 0xef, 0x9d, 0x09, 0x79, 0xff, 0xfa, 0x6f, 0x4c, 0xf1, 0xfb, 0xdf, 0xff, 0x73, 0x66, 0xf3, 0x73, 0xef, 0x36, 0xff, 0x93, 0xe5, 0xf6, 0x09, 0x2f, 0x10, 0xac, 0xfc, 0x4f, 0x96, 0xef, 0x88, 0xd1, 0x33, 0x91, 0x9f, 0xdf, 0x7d, 0x8f, 0xff, 0xc9, 0xf2, 0xde, 0xc9, 0xc9, 0x9d, 0xbb, 0x27, 0x27, 0x0f, 0xff, 0xf9, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x27, 0x27, 0xdf, 0xfd, 0xde, 0xd9, 0x90, 0xf7, 0x24, 0x52, 0xbe, 0xf6, 0xf5, 0x13, 0x43, 0xf9, 0x97, 0x1f, 0x9e, 0x11, 0x79, 0xdf, 0xf9, 0xad, 0x80, 0x5c, 0x5f, 0xfc, 0xd2, 0x1f, 0xfd, 0xf1, 0x9f, 0x7c, 0xf9, 0xe4, 0xb7, 0x7f, 0x27, 0x30, 0xfa, 0xb7, 0x7f, 0xf7, 0xfd, 0x1f, 0xfc, 0xfd, 0x3f, 0x9c, 0x09, 0x79, 0x7f, 0xef, 0xf7, 0x03, 0x92, 0xfd, 0xf9, 0x5f, 0x7c, 0xe3, 0x9b, 0x7f, 0xf9, 0x57, 0x27, 0x7f, 0xf0, 0x87, 0x81, 0xd1, 0x7f, 0xff, 0x8f, 0x7f, 0xfd, 0xb7, 0xff, 0xfc, 0xaf, 0xa1, 0xdb, 0x96, 0xf5, 0x71, 0x7e, 0xbd, 0x38, 0x84, 0xd7, 0xcf, 0xf2, 0x8b, 0xdf, 0x5b, 0x8f, 0x73, 0xf1, 0xff, 0x1d, 0xcb, 0xba, 0x80, 0xd7, 0xb3, 0x70, 0x3d, 0x07, 0x17, 0xb9, 0x40, 0x86, 0xac, 0xe0, 0x45, 0x42, 0x97, 0x4e, 0xe1, 0x02, 0x90, 0xf8, 0x75, 0xeb, 0x05, 0xeb, 0x85, 0x67, 0x5e, 0x78, 0xe6, 0xf1, 0xd6, 0x0c, 0x5f, 0xcf, 0x7e, 0xfc, 0x9b, 0x2f, 0x59, 0x1b, 0x8b, 0xe5, 0xe5, 0x72, 0x29, 0xf5, 0x56, 0x6a, 0x68, 0x7e, 0x75, 0xa1, 0x6c, 0x97, 0x52, 0x43, 0x70, 0x3b, 0xf4, 0xda, 0x65, 0x1b, 0x4b, 0x69, 0x72, 0x3a, 0x07, 0xbd, 0x4b, 0xaa, 0x57, 0xc0, 0xde, 0xfa, 0xc6, 0xda, 0xd2, 0xca, 0x65, 0xbb, 0x34, 0x85, 0x9d, 0x95, 0x6b, 0xcb, 0xaf, 0x95, 0xd7, 0x00, 0x34, 0x89, 0xbd, 0x4f, 0x95, 0x7f, 0xf9, 0x8d, 0xd5, 0xb5, 0x85, 0x52, 0x11, 0x3b, 0x73, 0x57, 0x97, 0x38, 0x16, 0x27, 0x31, 0xbf, 0xba, 0xbc, 0x5c, 0x5e, 0xd9, 0x28, 0x4d, 0x72, 0xac, 0xf5, 0xa5, 0xcb, 0x2b, 0x9c, 0x20, 0x9f, 0xb8, 0x5e, 0xbe, 0x52, 0x9e, 0xdf, 0xb0, 0x25, 0x6c, 0xfe, 0xda, 0xda, 0xfa, 0x2a, 0x50, 0x14, 0x6b, 0x2d, 0xce, 0x2d, 0xac, 0xbe, 0x61, 0x97, 0x3a, 0xee, 0x81, 0xc3, 0x69, 0x5e, 0xd9, 0xd8, 0xbc, 0xb4, 0x0a, 0x74, 0x6a, 0x95, 0x46, 0x9b, 0x8f, 0x2c, 0xcf, 0x6d, 0xcc, 0x2f, 0x6e, 0x2e, 0x94, 0xaf, 0x2c, 0x2d, 0x2f, 0x6d, 0x94, 0xd7, 0xd6, 0xd5, 0xd4, 0x1b, 0xb9, 0x54, 0x6a, 0xe8, 0xf2, 0xdc, 0x72, 0xf9, 0xea, 0xdc, 0x82, 0x14, 0x6a, 0x63, 0xf5, 0xda, 0xfc, 0x22, 0xdc, 0xf3, 0x0e, 0x90, 0xba, 0xba, 0x38, 0x57, 0x9a, 0x7c, 0x75, 0x02, 0xa9, 0xdc, 0x10, 0x18, 0x37, 0x52, 0xa9, 0xf9, 0xc5, 0xf2, 0xfc, 0xa7, 0x36, 0x57, 0xca, 0x6f, 0x6c, 0xbe, 0x0e, 0xd4, 0x96, 0x56, 0x57, 0x38, 0xc1, 0xd4, 0xca, 0xea, 0xe6, 0xfa, 0xea, 0xb5, 0x95, 0x05, 0xb1, 0x70, 0xea, 0xf2, 0xd2, 0xa5, 0xcd, 0x2b, 0xe5, 0x95, 0xcb, 0x1b, 0x8b, 0xa5, 0xc2, 0x84, 0x3d, 0x36, 0x66, 0xd7, 0x9b, 0x76, 0xdb, 0xa9, 0xb6, 0x9a, 0xdb, 0xed, 0xd4, 0xfc, 0xda, 0xc6, 0xe6, 0xf2, 0xea, 0xca, 0xd2, 0xc6, 0xea, 0x9a, 0x36, 0x7b, 0x7d, 0x7e, 0xee, 0x4a, 0xb9, 0x54, 0x4c, 0x5d, 0x5b, 0x92, 0xb7, 0x53, 0xa9, 0xd4, 0x58, 0x7c, 0x49, 0xd5, 0x0e, 0x9a, 0xd5, 0x4e, 0xbd, 0xd5, 0xb4, 0x37, 0x96, 0xe6, 0x33, 0xd9, 0xd4, 0x50, 0xb5, 0xd1, 0xc6, 0xa6, 0xd1, 0xaa, 0x56, 0x1a, 0x76, 0xa3, 0xb2, 0xe5, 0x34, 0x4a, 0xe9, 0x8d, 0xdd, 0x7a, 0xdb, 0x86, 0xbf, 0xf6, 0x51, 0xbb, 0xe3, 0xec, 0xd9, 0xb0, 0x7c, 0xad, 0xbe, 0x73, 0xe0, 0x56, 0x38, 0x5e, 0xb5, 0xe2, 0x76, 0xdc, 0xfa, 0xf6, 0x8e, 0x93, 0x56, 0x58, 0xed, 0xfa, 0x9b, 0x4e, 0x69, 0xdf, 0xad, 0x37, 0x3b, 0x19, 0x4e, 0x20, 0x37, 0x91, 0x1b, 0x9b, 0x01, 0x9a, 0xfa, 0x50, 0xa6, 0x30, 0x35, 0x31, 0x86, 0x13, 0xb3, 0xe3, 0xe3, 0x85, 0x5c, 0x66, 0xb2, 0x38, 0x03, 0x53, 0xe0, 0x36, 0x9b, 0x72, 0x9a, 0xdb, 0x29, 0x2e, 0x1b, 0xda, 0xa4, 0xbc, 0xc6, 0x5d, 0x06, 0x54, 0xb4, 0x51, 0xfe, 0x74, 0xe9, 0x33, 0x9f, 0x01, 0x15, 0xbe, 0x72, 0xdd, 0x71, 0xdb, 0xb8, 0xf0, 0xe4, 0xe4, 0x04, 0x74, 0x2b, 0x1d, 0x58, 0x7d, 0xeb, 0xa0, 0xe3, 0xd8, 0xd7, 0x9d, 0x6a, 0xd1, 0xde, 0xd9, 0x3f, 0xd8, 0x7c, 0xdd, 0x71, 0x3b, 0xce, 0xe1, 0xc5, 0x30, 0xb0, 0xc0, 0x81, 0x1b, 0xce, 0xe1, 0x7c, 0xab, 0xe5, 0x6e, 0x47, 0xc0, 0x53, 0x1c, 0x3c, 0xdf, 0x6a, 0xb4, 0x5c, 0x84, 0x1d, 0x34, 0xeb, 0xb5, 0x96, 0xbb, 0x67, 0xef, 0x55, 0x3a, 0x02, 0xb2, 0xdc, 0xda, 0x76, 0x1a, 0xaf, 0xd7, 0x9d, 0xee, 0x55, 0xb7, 0xf5, 0xab, 0x0e, 0xd7, 0xd9, 0x72, 0x05, 0xf0, 0xf9, 0x42, 0xd7, 0x2b, 0xee, 0x51, 0xbd, 0xb9, 0x23, 0xe8, 0x54, 0x15, 0x0d, 0x6d, 0xb4, 0x60, 0x77, 0xb4, 0x85, 0xaf, 0xb7, 0xea, 0xdb, 0x40, 0xb9, 0xde, 0xcc, 0xe0, 0x5d, 0x56, 0xb9, 0x0a, 0x47, 0xb4, 0x4b, 0x41, 0x46, 0x86, 0x14, 0x22, 0x00, 0x90, 0x50, 0x46, 0x97, 0x22, 0xcb, 0x67, 0xec, 0x34, 0x36, 0xaf, 0xb6, 0xda, 0x75, 0x6e, 0x8e, 0x52, 0x32, 0xb3, 0xf6, 0x08, 0xe7, 0x31, 0xe3, 0xeb, 0x29, 0x67, 0x4f, 0xe6, 0x27, 0x38, 0x9d, 0x1b, 0xa9, 0xa1, 0xcf, 0x7e, 0x16, 0x1c, 0xf4, 0xea, 0xd2, 0xa7, 0xcb, 0x57, 0x8c, 0xca, 0x1e, 0x1f, 0xdf, 0x77, 0x9d, 0x6a, 0x9d, 0x8f, 0xec, 0xd6, 0x77, 0x76, 0xf7, 0xed, 0x5a, 0xa3, 0x55, 0xe9, 0x24, 0xca, 0xaa, 0x14, 0xd9, 0xae, 0xec, 0xed, 0x37, 0x1c, 0xb7, 0xb0, 0x60, 0xb7, 0x5b, 0x07, 0x6e, 0xd5, 0xd1, 0x61, 0x9c, 0x8a, 0xdd, 0x71, 0x77, 0x36, 0x0f, 0xcd, 0xc3, 0x47, 0xe6, 0xe1, 0xae, 0x79, 0x78, 0x37, 0x3a, 0xdc, 0xae, 0xba, 0xa6, 0xd9, 0x38, 0x0c, 0xb3, 0xb9, 0x68, 0x76, 0x79, 0xef, 0xa0, 0x51, 0xe9, 0x38, 0xdb, 0x10, 0x64, 0xfb, 0x07, 0x1d, 0xdb, 0x75, 0xda, 0xad, 0xc6, 0x01, 0xaa, 0x2e, 0x8f, 0xf2, 0xa1, 0x5c, 0x30, 0x54, 0xe2, 0x36, 0x28, 0x4c, 0xcf, 0xe4, 0x27, 0x72, 0x93, 0x53, 0x53, 0x5c, 0x75, 0x02, 0x7d, 0xb1, 0xe2, 0x6e, 0x37, 0x9d, 0x76, 0xdb, 0x6e, 0xd5, 0x80, 0x6e, 0xa5, 0xd9, 0xa8, 0x37, 0x9d, 0xbc, 0x00, 0xd9, 0x63, 0xaf, 0xe6, 0x27, 0xc0, 0x34, 0xed, 0x56, 0xad, 0x23, 0x46, 0xc6, 0x26, 0x67, 0xf8, 0xc8, 0x9e, 0xb3, 0x5d, 0x3f, 0xd8, 0x83, 0x31, 0xc1, 0xcf, 0x2e, 0xd0, 0x58, 0x07, 0xdc, 0x12, 0x22, 0x98, 0x08, 0xef, 0xd7, 0x0f, 0x9d, 0x46, 0x9b, 0xa7, 0x81, 0xe0, 0x12, 0x63, 0x85, 0xf0, 0x0a, 0x53, 0x7c, 0x00, 0x29, 0x06, 0xc8, 0x5f, 0xad, 0x1f, 0x96, 0xc6, 0x8a, 0x3e, 0xf5, 0x85, 0x7a, 0x7b, 0xbf, 0x51, 0x39, 0xb2, 0xbb, 0x15, 0x77, 0x5f, 0xd2, 0x9a, 0xe0, 0x98, 0xcd, 0x56, 0xd3, 0x11, 0x7d, 0x70, 0x90, 0x71, 0x21, 0x80, 0x73, 0xd8, 0x71, 0x9d, 0x3d, 0x47, 0xe9, 0x03, 0x71, 0x84, 0x42, 0x70, 0xca, 0xcc, 0x14, 0xea, 0x04, 0x6e, 0xa6, 0x5e, 0x45, 0xb5, 0xd8, 0x72, 0x81, 0xb9, 0xbd, 0xd6, 0x41, 0xb3, 0xc3, 0xb5, 0xb2, 0x5b, 0xd9, 0x6e, 0x75, 0xc1, 0xf1, 0xdb, 0x9f, 0xcb, 0x7b, 0x3c, 0x61, 0x6f, 0xa1, 0xe2, 0x7e, 0xae, 0x34, 0x91, 0x9f, 0xbe, 0x18, 0x18, 0xbd, 0x02, 0x1e, 0xd6, 0x29, 0x4d, 0xe2, 0x30, 0xa7, 0x34, 0xf6, 0x94, 0x8a, 0xe4, 0xab, 0xbd, 0x76, 0xf9, 0x35, 0xbb, 0xd3, 0xb2, 0xaf, 0x80, 0x12, 0x2b, 0xae, 0x14, 0x7d, 0xae, 0xdd, 0x3e, 0x40, 0x37, 0x3e, 0x68, 0xe3, 0xbf, 0x62, 0xca, 0xd1, 0x3e, 0xf8, 0x04, 0xb8, 0x74, 0xe7, 0x00, 0xec, 0x6f, 0x77, 0x30, 0x19, 0xb6, 0x77, 0x5b, 0x07, 0x8d, 0x6d, 0x50, 0x51, 0xc7, 0xde, 0x72, 0xec, 0xa6, 0xe3, 0x6c, 0x3b, 0xdb, 0xbe, 0x48, 0x1b, 0x2d, 0x41, 0x73, 0x32, 0x23, 0xfa, 0xd5, 0xec, 0x5b, 0xae, 0x03, 0xd8, 0xcd, 0x4c, 0x75, 0x16, 0xc4, 0x9c, 0x98, 0x9a, 0x98, 0x9a, 0xce, 0x7e, 0xb2, 0x3a, 0x3e, 0x59, 0xc8, 0xff, 0x62, 0xe1, 0x97, 0xf6, 0x5b, 0xdd, 0x4c, 0xa6, 0x3a, 0x0a, 0xe3, 0xd3, 0xd3, 0xd9, 0xf1, 0x49, 0x6c, 0x72, 0x85, 0xfc, 0x54, 0xf6, 0xe2, 0x0d, 0xa1, 0xe6, 0xa2, 0x47, 0x2f, 0xc3, 0x7b, 0x1e, 0x35, 0x9e, 0xf1, 0x32, 0xfe, 0x62, 0xd5, 0xbc, 0x9b, 0xcd, 0xe9, 0xdd, 0x9d, 0x60, 0x77, 0x2b, 0x8b, 0x34, 0x85, 0x9c, 0x62, 0x14, 0xc5, 0x47, 0x19, 0x9f, 0xae, 0xf0, 0xeb, 0xee, 0xce, 0x96, 0x49, 0x74, 0x90, 0x70, 0xa2, 0x38, 0x59, 0x9c, 0x78, 0xf5, 0x93, 0xd5, 0x11, 0x21, 0x3a, 0x17, 0x76, 0x04, 0x15, 0x50, 0xcd, 0x4d, 0xe4, 0xa7, 0x26, 0x67, 0x66, 0x66, 0xb2, 0x63, 0x42, 0x11, 0xba, 0xf4, 0x48, 0x30, 0x46, 0x76, 0xb1, 0x96, 0x94, 0x5c, 0x75, 0x76, 0xf4, 0x8e, 0x2e, 0xf5, 0x0a, 0xc8, 0xec, 0xb4, 0x3b, 0xb6, 0xa3, 0x22, 0x5d, 0x24, 0x25, 0x7b, 0xa7, 0x7e, 0xdd, 0x69, 0x8a, 0x94, 0x80, 0x92, 0xef, 0xb7, 0xe0, 0x41, 0x05, 0xff, 0xca, 0x94, 0x5a, 0x69, 0x72, 0x0d, 0x38, 0x0d, 0xf0, 0xe1, 0x5a, 0xdb, 0xe9, 0x28, 0x6d, 0x35, 0xda, 0x2d, 0xfb, 0x4d, 0xc7, 0x6d, 0xfd, 0x02, 0x46, 0x26, 0xc6, 0xbc, 0xeb, 0x38, 0x2a, 0x57, 0x14, 0xed, 0x4b, 0x4e, 0xa7, 0xba, 0x9b, 0xe1, 0x61, 0x02, 0x94, 0x72, 0xfc, 0x06, 0xa6, 0x65, 0x79, 0xa6, 0x87, 0x91, 0x12, 0x6a, 0xa8, 0xe5, 0x66, 0xe0, 0x76, 0x04, 0x98, 0x1a, 0x45, 0xd8, 0x28, 0x8f, 0x25, 0x08, 0x04, 0xd0, 0xc6, 0x74, 0x36, 0x3b, 0x0e, 0xe3, 0x3c, 0xc1, 0x4b, 0x99, 0x3d, 0x3f, 0x98, 0xcc, 0x17, 0x20, 0x91, 0x4b, 0xab, 0x14, 0x16, 0x32, 0x22, 0xa3, 0xe6, 0x80, 0x54, 0xfe, 0xf0, 0x28, 0xc7, 0x73, 0x4b, 0x36, 0x0f, 0xf2, 0xfb, 0x92, 0x43, 0x94, 0x77, 0x2a, 0xcd, 0xaa, 0x83, 0x99, 0xc3, 0x93, 0x5e, 0x26, 0x13, 0x70, 0x82, 0xa6, 0x54, 0x0c, 0x17, 0xd3, 0x4b, 0x77, 0x88, 0xe4, 0x49, 0x90, 0x7d, 0x0b, 0x99, 0x96, 0xdc, 0x5e, 0x94, 0x1c, 0x8d, 0x65, 0x90, 0xff, 0x31, 0x4f, 0x92, 0x6c, 0x76, 0x4c, 0x89, 0x90, 0x15, 0x26, 0x1c, 0x1a, 0x92, 0x39, 0x64, 0xc1, 0xbe, 0x5c, 0x39, 0x68, 0xb7, 0xeb, 0x95, 0xa6, 0xef, 0x2b, 0x38, 0x22, 0x1d, 0x05, 0x75, 0xa4, 0x72, 0x72, 0xa5, 0xe1, 0x78, 0x76, 0x76, 0x0e, 0xf7, 0x0b, 0x19, 0x3e, 0x34, 0x82, 0x6b, 0xe3, 0x1a, 0x9e, 0x50, 0xc5, 0xb1, 0x4e, 0x65, 0xdf, 0x23, 0x6b, 0xd7, 0xea, 0x8d, 0x8e, 0xe3, 0xda, 0x95, 0x46, 0x0b, 0x6c, 0xb8, 0xdb, 0x72, 0xdf, 0xb4, 0x55, 0x7e, 0xe4, 0x06, 0x59, 0x84, 0x91, 0xa2, 0x6f, 0x10, 0xb1, 0x98, 0x67, 0x11, 0x3e, 0x65, 0xab, 0x24, 0xac, 0xa6, 0x0c, 0x96, 0x19, 0x03, 0x0f, 0xcd, 0xe1, 0x1c, 0xf1, 0xa0, 0x15, 0x3e, 0x18, 0x9e, 0x84, 0xf9, 0x32, 0x3c, 0x69, 0x3b, 0x32, 0x29, 0x48, 0x49, 0xac, 0xbe, 0xdd, 0xee, 0x94, 0xb8, 0x92, 0x51, 0xac, 0x3c, 0x7f, 0xf6, 0xa1, 0x5c, 0xf3, 0xad, 0x26, 0x3c, 0x77, 0x01, 0xac, 0x8c, 0x06, 0x16, 0xea, 0x3a, 0x98, 0x0d, 0xf3, 0x3e, 0x2e, 0xd7, 0x49, 0x49, 0x66, 0x74, 0x8d, 0x66, 0x77, 0xab, 0xc4, 0xd5, 0x0a, 0xb4, 0x39, 0xf7, 0x42, 0x9d, 0xfa, 0x84, 0xaa, 0x37, 0x01, 0x93, 0x8e, 0x61, 0xc2, 0xb6, 0x3f, 0x21, 0x44, 0x01, 0x98, 0x5b, 0x13, 0x76, 0x11, 0xca, 0xf6, 0x42, 0x28, 0xaf, 0xb9, 0x69, 0x66, 0x6b, 0xa4, 0xbb, 0x35, 0x5a, 0x1d, 0xe9, 0x56, 0x47, 0xb7, 0x47, 0xba, 0xdb, 0xd9, 0xf1, 0x0c, 0x74, 0xa1, 0x03, 0xb7, 0x9e, 0xe9, 0xa6, 0x9f, 0xd8, 0x74, 0xd3, 0xc9, 0xa6, 0xab, 0x44, 0x4c, 0x57, 0x88, 0x5a, 0xe5, 0x27, 0x67, 0x5f, 0x3e, 0xc9, 0x89, 0x4c, 0x2a, 0xfc, 0xa4, 0x9c, 0xa0, 0xe2, 0x3b, 0x41, 0xc1, 0x68, 0xe3, 0x1f, 0xa7, 0x97, 0xc8, 0x09, 0x8e, 0x3f, 0xa1, 0xf0, 0x61, 0xdc, 0xa8, 0x32, 0xd2, 0xad, 0x8c, 0x06, 0x7d, 0x69, 0xd4, 0x19, 0xe9, 0x3a, 0xe8, 0x50, 0x95, 0x51, 0xe5, 0x53, 0xa3, 0x30, 0xe0, 0xb9, 0x95, 0xa4, 0xaa, 0xf6, 0x46, 0x9a, 0xc2, 0x04, 0x4f, 0xb8, 0xb7, 0x8a, 0xf5, 0x23, 0x93, 0x39, 0x8e, 0xf4, 0xfc, 0xeb, 0x89, 0x03, 0x28, 0x39, 0xb5, 0x55, 0xf3, 0x17, 0x9f, 0x6b, 0x34, 0x60, 0x77, 0xe3, 0xa5, 0xd2, 0x5d, 0x78, 0x1c, 0x70, 0x37, 0xe6, 0x19, 0xd6, 0xa9, 0xd5, 0x60, 0x1f, 0x2e, 0x52, 0xae, 0xe7, 0xd7, 0x1b, 0x6e, 0x5d, 0xcb, 0xaf, 0x9a, 0x2f, 0x8b, 0x5c, 0x85, 0x3c, 0x8e, 0xa9, 0xdd, 0xb9, 0xf2, 0x60, 0x11, 0x0b, 0x08, 0x42, 0xbf, 0x0c, 0xf8, 0xad, 0x8f, 0xe5, 0xed, 0xe9, 0x7d, 0x7f, 0xe0, 0xa2, 0x07, 0x29, 0x7a, 0xae, 0xe0, 0xc1, 0x7c, 0x92, 0x9e, 0x17, 0xf8, 0x30, 0x0f, 0x4f, 0xaa, 0x23, 0x68, 0x9f, 0xc0, 0xa3, 0xa6, 0xe5, 0xf2, 0x27, 0xa7, 0xb6, 0x13, 0x06, 0x7c, 0x7c, 0x8e, 0xc2, 0xdb, 0x9d, 0x18, 0xc5, 0x67, 0x25, 0xc4, 0xfb, 0xfe, 0x6e, 0xc5, 0x7b, 0xdc, 0xbc, 0x01, 0xbb, 0xc9, 0x90, 0x3a, 0xd4, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x88, 0x2f, 0xfa, 0x72, 0x7c, 0xc4, 0xdb, 0x78, 0x8e, 0x22, 0x7b, 0xf9, 0xa3, 0x11, 0xfe, 0x6f, 0x76, 0x84, 0x6f, 0x64, 0x0f, 0x73, 0x1e, 0xe0, 0x90, 0x03, 0x0e, 0x25, 0xe0, 0x28, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x28, 0xee, 0x3d, 0x15, 0xff, 0xeb, 0xc1, 0x5d, 0x2a, 0xd7, 0xed, 0x32, 0x74, 0xa2, 0xac, 0xe5, 0x0f, 0x47, 0x4b, 0x62, 0x69, 0xbe, 0x9f, 0x56, 0x86, 0x40, 0xcc, 0x12, 0xdf, 0x9f, 0xa8, 0xbd, 0x6d, 0x2e, 0x72, 0x23, 0xb8, 0xe0, 0x34, 0x4a, 0x35, 0xb7, 0x52, 0xed, 0x08, 0x56, 0xc7, 0x67, 0x94, 0x8e, 0xeb, 0x35, 0x31, 0x02, 0xbb, 0xa6, 0x62, 0xb1, 0x98, 0xe5, 0xdc, 0xb8, 0x25, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0x3b, 0xa6, 0x89, 0x1c, 0xb2, 0x15, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xc5, 0x1b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xcd, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x21, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0x3b, 0x25, 0x78, 0x2f, 0xbd, 0xe4, 0x56, 0x76, 0xf8, 0xab, 0x20, 0x6c, 0x4c, 0xc4, 0xd6, 0x80, 0xbf, 0xe5, 0xe5, 0xc4, 0x5b, 0x9d, 0x10, 0x95, 0x4f, 0xce, 0x1f, 0x95, 0xf8, 0xcb, 0xd8, 0x98, 0xec, 0xf1, 0x3d, 0xff, 0x90, 0x52, 0x79, 0x89, 0xfb, 0x06, 0x07, 0x8d, 0x7b, 0x54, 0xba, 0x82, 0xca, 0x6e, 0x56, 0xbc, 0x82, 0x0d, 0x79, 0xcb, 0xc1, 0x9b, 0x33, 0xee, 0x7e, 0x4a, 0x18, 0x5e, 0x68, 0xaf, 0x11, 0x6e, 0xbe, 0x10, 0x37, 0xde, 0xab, 0xb3, 0x87, 0x23, 0x5e, 0xb0, 0xa7, 0xe4, 0xae, 0x32, 0x13, 0x26, 0x97, 0x0d, 0xbd, 0x29, 0xa7, 0x6e, 0xa4, 0xfe, 0x17, 0x05, 0x9f, 0xf4, 0xab, \ No newline at end of file diff --git a/config.lua b/config.lua index de049908e..3e2d35341 100644 --- a/config.lua +++ b/config.lua @@ -1,12 +1,5 @@ THEME= { - CURSOR= - { - ARROW=64, - HAND=65, - IBEAM=66, - }, - CODE = { BG =15, @@ -243,9 +236,6 @@ CRT_SHADER= -- 048:c2ccccccc2222222c222ccccc2222cccc2222222c1111111cc000cccecccccec -- 049:ccc200cc22220ccec2220cee22220cee22220cee1111ccee000cceeecccceeee -- 052:000000000fffff00000000000000000000000000000000000000000000000000 --- 064:ff000000fcf00000fccf0000fcccf000fccccf00fcccf000fcffcf000f00f000 --- 065:000f000000fcf00000fcff000ffcccf0fcfccccf0fcccccf00fcccf0000fff00 --- 066:0fff0000fcccf0000fcf00000fcf00000fcf00000fcf0000fcccf0000fff0000 -- 080:0000000000c0c00000c0c000000c00000cc0cc000cc0cc000000000000000000 -- 081:000000000cccc0000c00c0000c0ccc000ccc0c00000ccc000000000000000000 -- 082:0000000000ccc0000c000c000ccccc000cc0cc000ccccc000000000000000000 @@ -375,6 +365,9 @@ CRT_SHADER= -- -- +-- 000:ff000000fcf00000fccf0000fcccf000fccccf00fcccf000fcffcf000f00f000 +-- 001:000f000000fcf00000fcff000ffcccf0fcfccccf0fcccccf00fcccf0000fff00 +-- 002:0fff0000fcccf0000fcf00000fcf00000fcf00000fcf0000fcccf0000fff0000 -- 033:00cc000000cc000000cc00000000000000cc0000000000000000000000000000 -- 034:0c0c00000c0c0000000000000000000000000000000000000000000000000000 -- 035:0c0c0000ccccc0000c0c0000ccccc0000c0c0000000000000000000000000000 diff --git a/src/studio/config.c b/src/studio/config.c index 4d06905b4..48e3d84ab 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -126,20 +126,6 @@ static void readConfigCrtShader(Config* config, lua_State* lua) #endif -static void readCursorTheme(Config* config, lua_State* lua) -{ - lua_getfield(lua, -1, "CURSOR"); - - if(lua_type(lua, -1) == LUA_TTABLE) - { - readInteger(lua, "ARROW", &config->data.theme.cursor.arrow); - readInteger(lua, "HAND", &config->data.theme.cursor.hand); - readInteger(lua, "IBEAM", &config->data.theme.cursor.ibeam); - } - - lua_pop(lua, 1); -} - static void readCodeTheme(Config* config, lua_State* lua) { lua_getfield(lua, -1, "CODE"); @@ -187,7 +173,6 @@ static void readTheme(Config* config, lua_State* lua) if(lua_type(lua, -1) == LUA_TTABLE) { - readCursorTheme(config, lua); readCodeTheme(config, lua); readGamepadTheme(config, lua); } diff --git a/src/studio/studio.c b/src/studio/studio.c index 50beeb287..fe797930a 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1941,27 +1941,23 @@ static void blitCursor() { const tic_bank* bank = &tic->cart.bank0; - struct CursorInfo - { - tic_cursor cursor; - tic_point hot; - } info = {tic->ram.vram.vars.cursor.sprite}; + tic_point hot = {0}; if(tic->ram.vram.vars.cursor.system) { bank = &getConfig()->cart->bank0; - info = (struct CursorInfo[]) + hot = (tic_point[]) { - {getConfig()->theme.cursor.arrow, {0, 0}}, - {getConfig()->theme.cursor.hand, {3, 0}}, - {getConfig()->theme.cursor.ibeam, {2, 3}}, + {0, 0}, + {3, 0}, + {2, 3}, }[tic->ram.vram.vars.cursor.sprite]; } const tic_palette* pal = &bank->palette.scn; - const tic_tile* tile = &bank->tiles.data[info.cursor]; + const tic_tile* tile = &bank->sprites.data[tic->ram.vram.vars.cursor.sprite]; - u32 *dst = tic->screen + (m->x - info.hot.x) + (m->y - info.hot.y) * TIC80_FULLWIDTH, + u32 *dst = tic->screen + (m->x - hot.x) + (m->y - hot.y) * TIC80_FULLWIDTH, *end = tic->screen + TIC80_FULLWIDTH * TIC80_FULLHEIGHT; for(s32 src = 0; src != TIC_SPRITESIZE * TIC_SPRITESIZE; dst += TIC80_FULLWIDTH - TIC_SPRITESIZE) diff --git a/src/studio/system.h b/src/studio/system.h index e3faaba60..a8767da7f 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -77,13 +77,6 @@ typedef struct { struct { - s32 arrow; - s32 hand; - s32 ibeam; - } cursor; - - struct - { #define CODE_COLOR_DEF(VAR) u8 VAR; CODE_COLORS_LIST(CODE_COLOR_DEF) #undef CODE_COLOR_DEF From b1d24e60ebe6cc928c47efa2643e34d62cdfa9d1 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 6 Sep 2021 19:57:56 +0300 Subject: [PATCH 034/379] #509: fixed custom cursor rendering --- src/studio/studio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index fe797930a..cb5e06f22 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1937,7 +1937,7 @@ static void blitCursor() tic_mem* tic = impl.studio.tic; tic80_mouse* m = &tic->ram.input.mouse; - if(tic->input.mouse && m->x < TIC80_FULLWIDTH && m->y < TIC80_FULLHEIGHT) + if(tic->input.mouse && !m->relative && m->x < TIC80_FULLWIDTH && m->y < TIC80_FULLHEIGHT) { const tic_bank* bank = &tic->cart.bank0; From d07ad7fd775ceb001c86ffe8f41cc19f3221329f Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 8 Sep 2021 14:03:08 +0300 Subject: [PATCH 035/379] #1566: fixed CRT_MONITOR option, added --soft cmd option to enable software rendering using SDL2 only --- .github/workflows/build.yml | 166 ++++------------- build/assets/config.tic.dat | 2 +- config.lua | 1 + src/studio/config.c | 3 +- src/studio/studio.c | 19 +- src/studio/studio.h | 3 +- src/studio/system.h | 3 +- src/system/sdl/main.c | 359 +++++++++++++++++++++++------------- 8 files changed, 288 insertions(+), 268 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5eb3d868a..329d904c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,8 +7,8 @@ env: jobs: -# === Windows XP SDL2 === - winxp-sdl: +# === Windows XP === + winxp: runs-on: windows-latest steps: @@ -27,17 +27,17 @@ jobs: - name: Deploy uses: actions/upload-artifact@v2 with: - name: 'tic80-winxp-sdl' + name: 'tic80-winxp' path: build/bin/tic80.exe - name: Deploy stubs uses: actions/upload-artifact@v2 with: - name: 'tic80-winxp-sdl-stub' + name: 'tic80-winxp-stub' path: build/bin/tic80*.exe -# === Windows SDL2 === - windows-sdl: +# === Windows === + windows: runs-on: windows-latest steps: @@ -50,46 +50,23 @@ jobs: shell: cmd run: | cd build - cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. + cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. cmake --build . --config %BUILD_TYPE% --parallel - name: Deploy uses: actions/upload-artifact@v2 with: - name: 'tic80-windows-sdl' + name: 'tic80-windows' path: build/bin/tic80.exe - name: Deploy stubs uses: actions/upload-artifact@v2 with: - name: 'tic80-windows-sdl-stub' + name: 'tic80-windows-stub' path: build/bin/tic80*.exe -# === Windows SDLGPU === - windows-sdlgpu: - runs-on: windows-latest - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Build - shell: cmd - run: | - cd build - cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. - cmake --build . --config %BUILD_TYPE% --parallel - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-windows-sdlgpu' - path: build/bin/tic80.exe - -# === Windows SDLGPU PRO === - windows-sdlgpu-pro: +# === Windows PRO === + windows-pro: runs-on: windows-latest steps: @@ -129,42 +106,8 @@ jobs: name: 'tic80-windows-sokol' path: build/bin/tic80.exe -# === Ubuntu SDLGPU === - linux-sdlgpu: - runs-on: ubuntu-16.04 - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install - run: | - sudo apt-get update - sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SDLGPU=On -DBUILD_STUB=On .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - - - name: Deploy DEB - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux-sdlgpu-deb' - path: build/tic80.deb - - - name: Deploy ZIP - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux-sdlgpu' - path: build/bin/tic80 - -# === Ubuntu SDLGPU PRO === - linux-sdlgpu-pro: +# === Ubuntu PRO === + linux-pro: runs-on: ubuntu-16.04 steps: @@ -185,8 +128,8 @@ jobs: cmake --build . --config $BUILD_TYPE --parallel cpack -# === Ubuntu SDL2 === - linux-sdl: +# === Ubuntu === + linux: runs-on: ubuntu-16.04 steps: @@ -203,26 +146,26 @@ jobs: - name: Build run: | cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_STUB=On .. + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE DBUILD_SDLGPU=On -DBUILD_STUB=On .. cmake --build . --config $BUILD_TYPE --parallel cpack - name: Deploy DEB uses: actions/upload-artifact@v2 with: - name: 'tic80-linux-sdl-deb' + name: 'tic80-linux-deb' path: build/tic80.deb - name: Deploy ZIP uses: actions/upload-artifact@v2 with: - name: 'tic80-linux-sdl' + name: 'tic80-linux' path: build/bin/tic80 - name: Deploy stubs uses: actions/upload-artifact@v2 with: - name: 'tic80-linux-sdl-stub' + name: 'tic80-linux-stub' path: build/bin/tic80* # === Raspberry PI === @@ -387,8 +330,8 @@ jobs: name: 'tic80-nintendo-3ds' path: build/bin/tic80.3dsx -# === MacOS 10.15 SDL2 === - macos-sdl: +# === MacOS 10.15 === + macos: runs-on: macos-10.15 steps: @@ -403,7 +346,7 @@ jobs: - name: Build run: | cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_STUB=On .. + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE DBUILD_SDLGPU=On -DBUILD_STUB=On .. cmake --build . --config $BUILD_TYPE --parallel cpack cp *.dmg tic80.dmg @@ -411,50 +354,23 @@ jobs: - name: Deploy DMG uses: actions/upload-artifact@v2 with: - name: 'tic80-macos-sdl-dmg' + name: 'tic80-macos-dmg' path: build/tic80.dmg - name: Deploy uses: actions/upload-artifact@v2 with: - name: 'tic80-macos-sdl' + name: 'tic80-macos' path: build/bin/tic80 - name: Deploy stubs uses: actions/upload-artifact@v2 with: - name: 'tic80-macos-sdl-stub' + name: 'tic80-macos-stub' path: build/bin/tic80* -# === MacOS 10.15 SDLGPU === - macos-sdlgpu: - runs-on: macos-10.15 - - steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install - run: brew uninstall --ignore-dependencies libidn2 - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SDLGPU=On -DBUILD_STUB=On .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - cp *.dmg tic80.dmg - - - name: Deploy DMG - uses: actions/upload-artifact@v2 - with: - name: 'tic80-macos-sdlgpu-dmg' - path: build/tic80.dmg - -# === MacOS 10.15 SDLGPU PRO === - macos-sdlgpu-pro: +# === MacOS 10.15 PRO === + macos-pro: runs-on: macos-10.15 steps: @@ -552,26 +468,26 @@ jobs: # === Export === export: - needs: [winxp-sdl, windows-sdl, linux-sdl, rpi, macos-sdl, wasm] + needs: [winxp, windows, linux, rpi, macos, wasm] runs-on: ubuntu-latest steps: - name: Download Windows XP artifact uses: actions/download-artifact@v2 with: - name: tic80-winxp-sdl + name: tic80-winxp path: winxpdir - name: Download Windows artifact uses: actions/download-artifact@v2 with: - name: tic80-windows-sdl + name: tic80-windows path: windir - name: Download Ubuntu artifact uses: actions/download-artifact@v2 with: - name: tic80-linux-sdl + name: tic80-linux path: linuxdir - name: Download RPI artifact @@ -583,7 +499,7 @@ jobs: - name: Download MacOS artifact uses: actions/download-artifact@v2 with: - name: tic80-macos-sdl + name: tic80-macos path: macdir - name: Download WASM artifact @@ -625,19 +541,19 @@ jobs: - name: Download Windows XP artifact uses: actions/download-artifact@v2 with: - name: tic80-winxp-sdl-stub + name: tic80-winxp-stub path: winxpdir - name: Download Windows artifact uses: actions/download-artifact@v2 with: - name: tic80-windows-sdl-stub + name: tic80-windows-stub path: windir - name: Download Ubuntu artifact uses: actions/download-artifact@v2 with: - name: tic80-linux-sdl-stub + name: tic80-linux-stub path: linuxdir - name: Download RPI artifact @@ -649,7 +565,7 @@ jobs: - name: Download MacOS artifact uses: actions/download-artifact@v2 with: - name: tic80-macos-sdl-stub + name: tic80-macos-stub path: macdir - name: Download WASM artifact @@ -691,10 +607,10 @@ jobs: with: name: | tic80-rpi - tic80-macos-sdl - tic80-winxp-sdl-stub - tic80-windows-sdl-stub - tic80-linux-sdl-stub + tic80-macos + tic80-winxp-stub + tic80-windows-stub + tic80-linux-stub tic80-rpi-stub - tic80-macos-sdl-stub + tic80-macos-stub tic80-wasm-stub diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 39872f3b2..a8f67f8c0 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x64, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x12, 0x59, 0x16, 0x49, 0x15, 0x49, 0xed, 0x3a, 0xe5, 0x72, 0x31, 0x20, 0x38, 0x20, 0x11, 0x83, 0x00, 0x6b, 0x00, 0x0a, 0xe4, 0x6e, 0x54, 0x95, 0xa3, 0x0e, 0x39, 0xe4, 0xea, 0x3d, 0x6d, 0x92, 0x4b, 0xcc, 0xd2, 0x21, 0x8f, 0x3f, 0xd0, 0x92, 0x12, 0x3b, 0x76, 0x3a, 0x58, 0xaf, 0x1f, 0x79, 0x5a, 0xa2, 0x9f, 0x79, 0x42, 0x88, 0x36, 0xce, 0x3b, 0x5b, 0xa5, 0x7c, 0x5f, 0x3f, 0x66, 0x7a, 0x66, 0x7a, 0x86, 0xd2, 0x5a, 0xb6, 0x37, 0x0c, 0x7b, 0xd8, 0xea, 0xe9, 0xfe, 0xfa, 0xfb, 0xfa, 0x7b, 0x4f, 0x4f, 0x0f, 0x4a, 0xc3, 0x96, 0x65, 0x3d, 0xf3, 0xce, 0x27, 0xac, 0x1e, 0x83, 0x72, 0xf3, 0xe6, 0xcd, 0x5b, 0xc7, 0xc7, 0xc7, 0xb7, 0xb0, 0x85, 0xee, 0x2d, 0x46, 0xbd, 0xca, 0x58, 0x7f, 0x70, 0xf3, 0x26, 0x1b, 0x1c, 0x1f, 0xd3, 0xc1, 0xcd, 0xdf, 0xa5, 0x03, 0x76, 0x8b, 0x32, 0x7a, 0x8b, 0x52, 0x55, 0x39, 0xfe, 0xf0, 0xf0, 0x70, 0x2e, 0x9d, 0x4e, 0xe7, 0xb0, 0x85, 0x6e, 0x0e, 0xf0, 0x54, 0x45, 0xfc, 0xe1, 0x61, 0x36, 0x48, 0xa7, 0xe9, 0x60, 0xf8, 0x65, 0xc0, 0xcf, 0xd1, 0x01, 0x15, 0xb5, 0x4f, 0x73, 0x16, 0xe3, 0xf8, 0x80, 0x3b, 0x5b, 0x2c, 0x16, 0x67, 0xb1, 0x85, 0xee, 0x2c, 0x81, 0x0a, 0xb8, 0xb3, 0x12, 0x3f, 0x9d, 0x66, 0x83, 0x62, 0x91, 0x0e, 0xd2, 0x05, 0xc0, 0x9f, 0xa5, 0x03, 0x02, 0x95, 0xce, 0x02, 0xfe, 0xac, 0xc4, 0xef, 0x76, 0xbb, 0x8d, 0x5a, 0xad, 0xd6, 0xc0, 0x16, 0xba, 0xbc, 0x12, 0x8b, 0x60, 0x8b, 0xf8, 0xdd, 0x2e, 0x1b, 0xd4, 0x6a, 0x74, 0xd0, 0xdd, 0x01, 0xfc, 0x06, 0xd0, 0x6c, 0x50, 0x6a, 0x41, 0xc5, 0xf6, 0xab, 0xf7, 0xee, 0x3d, 0x7f, 0x0f, 0xcb, 0x83, 0xfb, 0xf7, 0xee, 0x0d, 0x06, 0xf7, 0x1e, 0x0c, 0x06, 0xf7, 0xb1, 0x0b, 0xff, 0x3c, 0xf8, 0xf6, 0x60, 0xf0, 0x82, 0x82, 0xf3, 0x71, 0x80, 0xf3, 0x79, 0x11, 0xf8, 0x7d, 0x89, 0x2f, 0x5b, 0xe8, 0x07, 0xe0, 0x0f, 0x24, 0xfd, 0x07, 0x12, 0xff, 0x81, 0x8f, 0xff, 0x2b, 0xb5, 0xda, 0xcf, 0xd4, 0xae, 0xef, 0xd4, 0x6a, 0x3b, 0xd7, 0x45, 0xed, 0x76, 0x79, 0x0b, 0x23, 0xd7, 0xf7, 0xbb, 0xdd, 0xe7, 0xec, 0x74, 0xfa, 0x63, 0xe9, 0xe1, 0x97, 0xd3, 0xe9, 0x97, 0x5f, 0x4a, 0xeb, 0x2d, 0xdc, 0xbd, 0xf4, 0x73, 0xc3, 0xc3, 0xcf, 0xbc, 0x73, 0x7c, 0x9c, 0x3a, 0xfe, 0xc2, 0xdb, 0xc7, 0xbc, 0xbe, 0xfd, 0x85, 0x63, 0x75, 0x0f, 0x77, 0x6f, 0xff, 0xe6, 0xe7, 0x3f, 0x3f, 0x34, 0x51, 0x2c, 0x5e, 0x28, 0x16, 0x5e, 0x29, 0xf2, 0xfa, 0x4a, 0x1a, 0xb4, 0x8c, 0x6d, 0xa1, 0x58, 0x80, 0x7f, 0x91, 0x36, 0xb7, 0x37, 0xda, 0x9e, 0x5f, 0x5f, 0xe1, 0xf7, 0xbf, 0x01, 0x7e, 0xc0, 0x2c, 0x8a, 0xba, 0xed, 0xb1, 0x5b, 0x16, 0x03, 0xdb, 0xf7, 0x6f, 0x81, 0xfd, 0x8f, 0x65, 0x45, 0x7f, 0xb0, 0x68, 0x7f, 0xc0, 0xd8, 0x60, 0xc0, 0xed, 0x8d, 0xb6, 0x4f, 0xdf, 0x81, 0x16, 0xaf, 0x74, 0xfa, 0xe7, 0xc1, 0x0f, 0x3c, 0xfc, 0x1c, 0xa5, 0x60, 0x7b, 0x5e, 0x73, 0x69, 0xca, 0xb8, 0x1f, 0x0c, 0xfb, 0xf8, 0xdc, 0xde, 0x68, 0xfb, 0xbb, 0x77, 0xef, 0xce, 0x16, 0x67, 0x67, 0xf1, 0x1e, 0x69, 0x78, 0xf8, 0xb3, 0x94, 0x82, 0xed, 0xe9, 0x5d, 0xa8, 0xb3, 0x45, 0xca, 0xb8, 0x1f, 0xa4, 0x7d, 0x7c, 0x6e, 0x6b, 0xb4, 0x7d, 0x0d, 0xdb, 0x2f, 0xf2, 0xfb, 0x5f, 0x03, 0x3f, 0xf0, 0xf0, 0x1b, 0x16, 0x03, 0xdb, 0xf7, 0x1b, 0x60, 0xff, 0x9a, 0xac, 0xe8, 0x0f, 0x0a, 0x1f, 0xc2, 0xc0, 0x8a, 0xf3, 0x01, 0x1c, 0xd7, 0xe1, 0x61, 0x1f, 0x08, 0xc2, 0xa3, 0x3e, 0x10, 0x80, 0x1b, 0x7c, 0x40, 0xc1, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0x8e, 0xf0, 0x38, 0x1f, 0xc0, 0x71, 0x84, 0xc7, 0xf9, 0x00, 0x8e, 0x1b, 0xe3, 0x97, 0x97, 0x74, 0x2e, 0xc7, 0xee, 0x98, 0xe2, 0x17, 0xe0, 0x60, 0x4f, 0xa8, 0x77, 0xa0, 0x5a, 0x4f, 0xa1, 0xec, 0x5c, 0x73, 0x9e, 0xb3, 0x7e, 0x4c, 0x05, 0x9d, 0x2b, 0x52, 0x19, 0xe1, 0x15, 0xd4, 0x5f, 0xc4, 0x12, 0x81, 0x7f, 0xeb, 0x79, 0x6f, 0x4e, 0xf1, 0x82, 0x65, 0xf1, 0xfa, 0xc3, 0x47, 0x8f, 0x78, 0xfb, 0xf5, 0xe7, 0xef, 0x15, 0xf5, 0xa2, 0xe0, 0xfa, 0x3c, 0xad, 0x58, 0x1f, 0xf1, 0xe2, 0xc7, 0x2f, 0xb6, 0x77, 0x58, 0x34, 0x7e, 0x2d, 0x8c, 0xd9, 0x3e, 0xc4, 0x2e, 0xf7, 0x81, 0x70, 0xfc, 0x3e, 0x0d, 0x1e, 0x1e, 0x3e, 0x7a, 0x64, 0x9d, 0x97, 0xf3, 0x72, 0x5e, 0x7e, 0x4a, 0x85, 0x10, 0x51, 0x21, 0x9b, 0x53, 0xc2, 0x78, 0xd5, 0x0b, 0x65, 0x04, 0x40, 0x50, 0x29, 0x66, 0x05, 0x9c, 0xc4, 0x42, 0x49, 0x16, 0xe1, 0x70, 0x31, 0x81, 0x8b, 0x6d, 0x90, 0x00, 0xd0, 0x66, 0x96, 0x18, 0x67, 0xb2, 0x1f, 0xc0, 0x17, 0x63, 0x1c, 0x2e, 0xe7, 0x06, 0xd7, 0x67, 0x82, 0xbe, 0x5a, 0x83, 0x91, 0xc8, 0xfa, 0xc8, 0xbf, 0xc0, 0xb7, 0x44, 0x55, 0x20, 0x48, 0xe2, 0x71, 0xd5, 0x67, 0x4f, 0xa3, 0x8f, 0x17, 0x31, 0xc8, 0x47, 0xd5, 0xda, 0x8c, 0xdf, 0x07, 0xc5, 0xf3, 0x75, 0x66, 0xd2, 0x9f, 0x90, 0x89, 0x0a, 0xdd, 0x71, 0xfd, 0x85, 0xf9, 0x87, 0xf9, 0x84, 0xf2, 0x6a, 0xc4, 0x67, 0x04, 0x54, 0xcf, 0xbc, 0x8a, 0xfd, 0x80, 0xf9, 0x28, 0x41, 0x96, 0x08, 0xb4, 0x04, 0x5b, 0x4a, 0x83, 0x70, 0x8f, 0x6f, 0x65, 0x1f, 0x8b, 0x1a, 0xec, 0xcb, 0x44, 0xe5, 0x36, 0x62, 0x06, 0x27, 0xa1, 0x7e, 0x8d, 0xd8, 0x57, 0xca, 0x48, 0xa5, 0xfd, 0xc2, 0xbb, 0x02, 0x09, 0x43, 0xff, 0xb1, 0x94, 0x8d, 0x4d, 0xfe, 0xc3, 0x69, 0x9b, 0xf0, 0x43, 0xfe, 0x41, 0xa3, 0xfe, 0x61, 0x6a, 0xb5, 0x09, 0xa0, 0x24, 0xd4, 0x2e, 0xfe, 0xa1, 0x23, 0xb3, 0xa8, 0x7f, 0x29, 0xfb, 0xca, 0x36, 0x22, 0x3d, 0xd7, 0x8b, 0x81, 0x37, 0x9d, 0x47, 0x46, 0x8c, 0xb8, 0xb8, 0xb8, 0xd4, 0x1b, 0xe1, 0x31, 0x64, 0x05, 0xe5, 0x57, 0xfe, 0xa4, 0xec, 0x42, 0x23, 0xdb, 0x2a, 0x5c, 0x97, 0x0a, 0x1f, 0x37, 0xb8, 0x8f, 0x87, 0x4f, 0x63, 0xf0, 0x75, 0xff, 0x55, 0x3a, 0x8e, 0xd0, 0x27, 0x52, 0x3e, 0x22, 0xf9, 0x0d, 0xb1, 0xcf, 0x64, 0x9c, 0xb1, 0x28, 0xd8, 0xd3, 0xbb, 0xb4, 0x31, 0x35, 0xe8, 0x57, 0xf1, 0xa5, 0x6a, 0x44, 0x77, 0x32, 0xbf, 0x08, 0x5e, 0xac, 0x88, 0x7f, 0x5a, 0xbe, 0x87, 0x44, 0xfd, 0x8f, 0xf8, 0x34, 0x78, 0x1b, 0xd1, 0x0f, 0x56, 0x99, 0xbf, 0xa8, 0xd0, 0x61, 0x6c, 0x7c, 0xb0, 0x60, 0xfe, 0xa2, 0x22, 0x87, 0xa8, 0x01, 0xe2, 0xdd, 0x53, 0x6d, 0x3c, 0x46, 0x6d, 0xba, 0xfb, 0xa9, 0x1a, 0xe7, 0x3a, 0x34, 0xce, 0xb5, 0x34, 0xbf, 0xd2, 0x73, 0x96, 0x9e, 0xdf, 0x12, 0x7d, 0x93, 0x5a, 0x32, 0xf7, 0xca, 0xd0, 0x63, 0x2a, 0xdf, 0x1a, 0x4c, 0xcb, 0xa2, 0x26, 0x86, 0x4c, 0x49, 0x20, 0xeb, 0x10, 0xa6, 0x5f, 0xb2, 0xaf, 0xe7, 0x57, 0xe8, 0x62, 0xf6, 0xb2, 0xb0, 0x0d, 0xe4, 0x57, 0x19, 0xdb, 0x98, 0xa1, 0x08, 0x74, 0x88, 0x67, 0x43, 0xe2, 0xe9, 0x9e, 0xcb, 0xa0, 0xf9, 0x46, 0x30, 0x06, 0x89, 0x62, 0x9e, 0xcb, 0x89, 0xcb, 0x12, 0xdd, 0x85, 0x19, 0xf1, 0xe3, 0x4e, 0x3d, 0xc7, 0x88, 0xaf, 0x0b, 0x42, 0x08, 0x91, 0x54, 0x82, 0xad, 0x1c, 0xd7, 0x9d, 0x87, 0x0a, 0xc6, 0x41, 0x10, 0xc6, 0xd3, 0xc4, 0x79, 0x39, 0x2f, 0x67, 0xbd, 0xf0, 0x23, 0xb2, 0xc1, 0x60, 0xd0, 0xc7, 0x37, 0x7d, 0x2c, 0xbc, 0xed, 0xf5, 0x64, 0x3b, 0x90, 0xe0, 0x9e, 0x0e, 0xee, 0xf5, 0xc4, 0xf4, 0x81, 0x68, 0xfd, 0x62, 0xa0, 0x13, 0x02, 0x47, 0xe8, 0x9c, 0x5b, 0xe0, 0xa7, 0x5b, 0xfa, 0x3d, 0x34, 0x24, 0xd8, 0x0d, 0x2a, 0x1a, 0x88, 0x45, 0xcb, 0x40, 0x2b, 0xbd, 0x30, 0x50, 0xf9, 0x09, 0xd2, 0x89, 0xc1, 0x57, 0x7e, 0x62, 0xc4, 0x3f, 0xb7, 0xc0, 0x47, 0x28, 0xfe, 0x0d, 0x95, 0xf9, 0x66, 0xed, 0xc5, 0x54, 0x13, 0x3e, 0x06, 0x38, 0x8c, 0xf5, 0x07, 0x26, 0x7c, 0x3c, 0x57, 0x1a, 0x60, 0xed, 0xc5, 0xe1, 0xf7, 0x07, 0xa2, 0x32, 0x23, 0x3e, 0xe2, 0xf1, 0x7a, 0xea, 0xfa, 0x51, 0xfc, 0x41, 0xa8, 0x1a, 0xf0, 0x07, 0x7a, 0x4d, 0xe4, 0xdf, 0x8c, 0xef, 0xc9, 0xde, 0x97, 0x2a, 0xd4, 0xf1, 0x75, 0xd9, 0xf1, 0xfe, 0xf4, 0xf8, 0x83, 0xe0, 0x82, 0xb8, 0x91, 0x95, 0xb1, 0x98, 0x00, 0x65, 0x8f, 0x59, 0xf4, 0x60, 0x66, 0x61, 0x7b, 0x9b, 0x79, 0xd1, 0x6c, 0x1d, 0xe5, 0x45, 0xca, 0x19, 0x8b, 0x2f, 0x6d, 0x9c, 0x80, 0xcf, 0xfa, 0x49, 0xf8, 0x3d, 0xf6, 0xa3, 0xe1, 0x6b, 0x76, 0x8a, 0xc3, 0x57, 0xb6, 0xfe, 0x51, 0xd6, 0xef, 0x27, 0xe1, 0xf7, 0x12, 0xf0, 0xc3, 0xa5, 0x27, 0x78, 0xe6, 0xb5, 0xff, 0x18, 0x35, 0x21, 0x2e, 0xfd, 0xf8, 0x7c, 0x02, 0xe7, 0x30, 0xc5, 0x3f, 0x4b, 0xce, 0x03, 0x49, 0xf8, 0xfd, 0x24, 0xfc, 0xde, 0xa9, 0xf8, 0xfd, 0x41, 0x12, 0xbe, 0x97, 0x3f, 0x3e, 0xc4, 0xfa, 0x81, 0xf8, 0x35, 0xe3, 0x7b, 0xf1, 0xff, 0x21, 0xf9, 0xef, 0x27, 0xe1, 0xab, 0x3c, 0xa0, 0xfb, 0x6e, 0xcc, 0xf3, 0x53, 0xf7, 0x9d, 0x53, 0x63, 0xfb, 0x49, 0xf2, 0x00, 0x8b, 0xf3, 0xab, 0x20, 0x2f, 0x06, 0x9f, 0xea, 0x87, 0xe2, 0xc7, 0xcb, 0xd7, 0x11, 0xfc, 0x81, 0x96, 0xaf, 0xcd, 0xf8, 0x7d, 0x15, 0x7f, 0x7d, 0x23, 0xbe, 0xcc, 0xf3, 0xbd, 0xc4, 0xf5, 0x13, 0xf0, 0xa3, 0xf9, 0x3e, 0x0e, 0x3f, 0x90, 0x07, 0xc2, 0xf8, 0xf1, 0xeb, 0xf7, 0x07, 0x5a, 0x0e, 0xe8, 0x9b, 0xf8, 0x57, 0x39, 0xa0, 0xf7, 0x04, 0xb6, 0xec, 0x49, 0x59, 0x3e, 0xf6, 0xe5, 0x4f, 0x58, 0xf8, 0x75, 0xe4, 0xdd, 0x17, 0xa1, 0x7e, 0x00, 0x95, 0xbd, 0x08, 0xf5, 0x03, 0xd1, 0x3e, 0xfa, 0xc0, 0x7a, 0x68, 0x01, 0xe0, 0xa1, 0x9a, 0xf0, 0xc8, 0x7a, 0x08, 0x80, 0x77, 0x61, 0xc2, 0x43, 0x26, 0x27, 0x3d, 0x7c, 0x84, 0x7f, 0xe2, 0x16, 0xf0, 0xf5, 0x2a, 0xc1, 0xe7, 0xe5, 0xbc, 0x9c, 0x97, 0xff, 0xd3, 0x9b, 0x78, 0xad, 0x5a, 0x56, 0xf4, 0xfb, 0x09, 0xb5, 0xac, 0xa4, 0x2f, 0xf5, 0x54, 0x1c, 0x4d, 0x07, 0xda, 0xf0, 0xf9, 0x2b, 0x91, 0xc7, 0x70, 0x78, 0x13, 0x3d, 0x7e, 0xf5, 0xcf, 0x5d, 0xa9, 0xea, 0x87, 0x8e, 0x20, 0x39, 0x3e, 0x11, 0x67, 0x77, 0x94, 0x44, 0xcf, 0x97, 0x69, 0x92, 0x7c, 0xea, 0x4c, 0x97, 0xe8, 0xc7, 0x75, 0x91, 0xe3, 0x63, 0xaf, 0x52, 0xc3, 0xf1, 0x3b, 0x21, 0xe2, 0xd8, 0x9f, 0x1f, 0xfb, 0x11, 0xf3, 0x11, 0x3d, 0x65, 0xf1, 0x67, 0xb8, 0xfa, 0xa7, 0x8c, 0x38, 0x7e, 0xe9, 0x63, 0xbc, 0xcd, 0x52, 0x12, 0x3d, 0xbf, 0xb7, 0x22, 0xfa, 0x8b, 0xd2, 0x65, 0xf2, 0xf4, 0x94, 0x45, 0x3f, 0x5f, 0x78, 0xe7, 0xbb, 0xca, 0x07, 0xc2, 0xdf, 0xc7, 0x98, 0xf7, 0x7d, 0x4d, 0x4e, 0x89, 0xc0, 0x89, 0xf7, 0xdd, 0x8d, 0xd0, 0x78, 0xfa, 0x8c, 0xaa, 0xb9, 0x56, 0x04, 0x9f, 0x69, 0xeb, 0x98, 0x3e, 0xbf, 0x28, 0xb8, 0x89, 0x7f, 0x7d, 0x7d, 0xc3, 0xe7, 0x3f, 0x89, 0x4f, 0x02, 0xad, 0x19, 0x2e, 0x8c, 0x43, 0x59, 0xbc, 0xce, 0x4d, 0xfa, 0x0f, 0xc3, 0x23, 0xf6, 0xd5, 0x6c, 0x63, 0xf2, 0x3f, 0xdd, 0xf6, 0x26, 0x1f, 0x08, 0xe0, 0x99, 0x3e, 0x6f, 0x69, 0xf2, 0x1b, 0xe3, 0x57, 0xfa, 0x2d, 0x3f, 0xfb, 0x36, 0xac, 0xa1, 0xe4, 0xe7, 0x95, 0x89, 0x36, 0x6c, 0x7f, 0x01, 0xf3, 0x5b, 0x33, 0x7e, 0x9c, 0x7d, 0x34, 0xfa, 0x06, 0x7c, 0xdd, 0xfe, 0x71, 0xfe, 0x15, 0x80, 0x1b, 0xe4, 0xe7, 0xe3, 0x94, 0x68, 0x76, 0xd4, 0xdd, 0x2f, 0x28, 0x5b, 0x58, 0x3e, 0xaa, 0x3e, 0x5a, 0xc4, 0xfa, 0x3f, 0xf1, 0x8c, 0xcc, 0x0c, 0xfe, 0xcd, 0x69, 0xca, 0x6f, 0x0a, 0xbc, 0x0d, 0xeb, 0x2f, 0x5c, 0xc3, 0xf4, 0xa9, 0xe4, 0x8d, 0xe7, 0x49, 0x12, 0xc9, 0x7f, 0x9c, 0x3e, 0x91, 0x73, 0xa8, 0x89, 0xff, 0xa0, 0x7e, 0x13, 0xf5, 0xcf, 0xe2, 0xe3, 0x23, 0x88, 0x4f, 0x12, 0xf0, 0xa3, 0xfa, 0x63, 0x2a, 0xff, 0x31, 0x93, 0x7f, 0x90, 0xa8, 0x12, 0x4c, 0xf6, 0x89, 0xe3, 0x3f, 0x0c, 0x23, 0xd1, 0xe7, 0x07, 0x21, 0xbe, 0x0e, 0x19, 0x35, 0xdb, 0x5f, 0x97, 0x33, 0x18, 0xbf, 0x44, 0x54, 0x9d, 0xcf, 0xb0, 0xfd, 0xb5, 0xdc, 0x12, 0xf9, 0x8c, 0xc6, 0x42, 0xcf, 0x97, 0x84, 0xcf, 0x8b, 0xfe, 0x4d, 0xf4, 0x99, 0xe0, 0x3d, 0x7f, 0x48, 0xcc, 0xe7, 0xdb, 0xc7, 0xfc, 0xa6, 0x14, 0xf6, 0x5f, 0xc3, 0x92, 0x46, 0x1c, 0xcc, 0xdd, 0x22, 0x7f, 0x1b, 0xfc, 0x37, 0xe4, 0x03, 0x26, 0x7c, 0xa6, 0x3e, 0x01, 0xb3, 0x68, 0x82, 0x4c, 0xa2, 0x1f, 0x7c, 0x46, 0x19, 0x72, 0x20, 0xee, 0x29, 0x88, 0xdc, 0x5b, 0x18, 0x9f, 0x7f, 0x32, 0xc7, 0xc9, 0x38, 0xb2, 0x42, 0x31, 0xca, 0x0c, 0x39, 0x28, 0x22, 0xa0, 0x15, 0xef, 0x9f, 0xe1, 0xe4, 0x4f, 0x4c, 0xf4, 0xf5, 0xfc, 0x68, 0xb0, 0xaf, 0x5e, 0x2d, 0x83, 0xfc, 0xea, 0xd9, 0xc8, 0xe3, 0x9f, 0x18, 0xe0, 0x49, 0xfc, 0x87, 0x62, 0xd8, 0xf4, 0x0c, 0x39, 0x3d, 0x07, 0x84, 0xec, 0x43, 0x63, 0x9e, 0x01, 0x06, 0xf5, 0xe8, 0xf6, 0x37, 0xc6, 0x7f, 0xd8, 0x76, 0x26, 0xf9, 0x13, 0xe2, 0x3f, 0x1c, 0xc3, 0x26, 0x5f, 0x0e, 0xe4, 0x00, 0x6a, 0xd2, 0x2f, 0xf1, 0xbe, 0xa1, 0x9b, 0xe0, 0x61, 0xd9, 0x69, 0x52, 0x0e, 0x88, 0x89, 0x7f, 0x1a, 0x13, 0xff, 0x16, 0x31, 0x54, 0x53, 0xfc, 0xb3, 0x98, 0xf8, 0x17, 0x1f, 0x9c, 0xad, 0xa7, 0xf3, 0x6b, 0xd9, 0xf3, 0x72, 0x5e, 0xce, 0xcb, 0x79, 0x09, 0xee, 0x0f, 0xa8, 0xf6, 0x5a, 0x42, 0xa3, 0xa9, 0xc7, 0x22, 0x09, 0xfb, 0x07, 0x42, 0xbc, 0x9f, 0x50, 0x7a, 0x6d, 0x24, 0xff, 0xeb, 0xad, 0x21, 0x3d, 0x06, 0xde, 0x5d, 0x49, 0xcc, 0xf1, 0x84, 0xfa, 0x69, 0x0e, 0x31, 0xf3, 0x1f, 0xcf, 0x60, 0x48, 0x46, 0x62, 0xde, 0x9f, 0x51, 0xcb, 0xfc, 0xfe, 0xac, 0x64, 0x54, 0xe7, 0x10, 0x71, 0x3a, 0x64, 0xa7, 0x9d, 0x43, 0x84, 0x8e, 0x23, 0xac, 0xe8, 0x36, 0xe7, 0xb1, 0xed, 0x65, 0xc5, 0x1f, 0x01, 0x18, 0xcf, 0x0c, 0xf4, 0x9f, 0x36, 0x31, 0x13, 0xef, 0x9a, 0xfc, 0xa6, 0xc7, 0x9b, 0x4e, 0x3f, 0x09, 0x6e, 0x19, 0xe8, 0x13, 0xcd, 0x37, 0x4c, 0xcf, 0x3f, 0x46, 0xb4, 0xc7, 0x26, 0x31, 0x6f, 0xbf, 0x88, 0x15, 0xf4, 0xb1, 0x88, 0xde, 0x48, 0xf0, 0x98, 0x27, 0x42, 0x9f, 0x24, 0xe3, 0x27, 0xf1, 0x67, 0x25, 0xc4, 0x86, 0x09, 0x9e, 0x70, 0x3c, 0x13, 0xbb, 0x17, 0x57, 0x3c, 0x31, 0xe3, 0xde, 0x26, 0xf1, 0xe7, 0x89, 0x01, 0xf9, 0x4d, 0x3c, 0x52, 0x5d, 0x7e, 0xcb, 0x1c, 0x3f, 0xba, 0x7e, 0x88, 0x69, 0x7b, 0x43, 0x82, 0xad, 0xc9, 0x3e, 0xde, 0xf1, 0x5a, 0x0c, 0x7e, 0x9c, 0xff, 0xe9, 0xf6, 0x37, 0xfa, 0x57, 0x08, 0x4e, 0xe2, 0xd6, 0x8f, 0xc9, 0x0f, 0x84, 0x9c, 0x22, 0x5f, 0x28, 0x3f, 0xc4, 0xf9, 0x97, 0x15, 0xfc, 0x69, 0x60, 0x94, 0x7e, 0x4c, 0xae, 0x0c, 0x6f, 0xfd, 0x4c, 0xf4, 0x59, 0x28, 0x46, 0x93, 0xf4, 0x47, 0x62, 0xec, 0x47, 0x62, 0xf8, 0x0b, 0xd8, 0xcf, 0xa4, 0xbf, 0x90, 0x8e, 0xe2, 0xec, 0xc7, 0x34, 0x19, 0x4d, 0xfa, 0x8f, 0x8b, 0xff, 0xb0, 0x7e, 0xe3, 0xf4, 0x77, 0x9a, 0xfd, 0xc8, 0x29, 0xfa, 0xf7, 0x78, 0x8c, 0xc1, 0xa7, 0x71, 0xf6, 0xd1, 0xe0, 0x26, 0xfe, 0xc2, 0xf9, 0x85, 0x99, 0xce, 0xff, 0x74, 0xf9, 0x4e, 0x89, 0x61, 0xd3, 0xf1, 0x7b, 0xc0, 0xff, 0x62, 0xec, 0xf3, 0xd8, 0xc7, 0xf9, 0xc4, 0x7a, 0xe2, 0xf7, 0x7f, 0x16, 0xca, 0x13, 0x61, 0xde, 0x99, 0x15, 0x1f, 0xbf, 0xe1, 0x1c, 0x40, 0x63, 0x7e, 0x1e, 0x1e, 0x67, 0xdf, 0x40, 0x8e, 0x8a, 0xc3, 0x0f, 0xf9, 0x91, 0x95, 0x90, 0xe3, 0xc2, 0x67, 0xa4, 0xc4, 0x10, 0x43, 0x71, 0xb9, 0xdb, 0x48, 0x9f, 0x04, 0x03, 0x99, 0x18, 0xe8, 0x13, 0xed, 0xe8, 0xc8, 0x14, 0xbf, 0x49, 0xf9, 0xc5, 0x94, 0x03, 0x2c, 0x2b, 0x39, 0x07, 0x58, 0x09, 0x31, 0x4c, 0xad, 0x64, 0x7c, 0x16, 0x97, 0x43, 0x75, 0xfb, 0x18, 0x62, 0x84, 0xc5, 0x3f, 0x1e, 0xfd, 0xe3, 0xe7, 0xb8, 0xfd, 0x05, 0x89, 0xdf, 0x7f, 0x85, 0x63, 0x98, 0x9e, 0x06, 0xb7, 0xe2, 0xe1, 0xa6, 0xf8, 0x0f, 0xef, 0xdf, 0x48, 0x02, 0xfd, 0xb8, 0xef, 0x33, 0x2a, 0x2f, 0x26, 0xc5, 0x3f, 0x8b, 0x89, 0x7f, 0x6a, 0xf0, 0x31, 0xa3, 0x7f, 0x10, 0x73, 0xfc, 0x7b, 0xfa, 0x7d, 0x36, 0xf7, 0xa2, 0x45, 0x6f, 0x9b, 0xae, 0x6f, 0x7f, 0xc7, 0x74, 0x9d, 0x85, 0x97, 0x13, 0xf6, 0x67, 0xa6, 0xab, 0xff, 0xc0, 0x74, 0x9d, 0x89, 0x97, 0xb1, 0xff, 0x67, 0xf6, 0xfd, 0xea, 0x7b, 0xe1, 0x0b, 0xed, 0xfb, 0xf0, 0xfd, 0xf0, 0x75, 0x6e, 0xdf, 0xb3, 0x62, 0x5f, 0xbc, 0xa2, 0xf6, 0xc5, 0xeb, 0xdc, 0xbe, 0xe7, 0xf6, 0xfd, 0xa8, 0x97, 0x13, 0x83, 0x79, 0x7b, 0xb7, 0x4f, 0x0c, 0xe6, 0x1d, 0x9c, 0x09, 0xfb, 0x9e, 0x18, 0xcc, 0xfb, 0xad, 0xfb, 0x27, 0x06, 0xf3, 0x7e, 0x70, 0xff, 0x2c, 0xc8, 0xfb, 0x95, 0x3f, 0x8d, 0x1a, 0xf8, 0xde, 0xfd, 0x7f, 0xfc, 0xa7, 0xa8, 0x81, 0xef, 0x9d, 0x09, 0x79, 0xff, 0xfa, 0x6f, 0x4c, 0xf1, 0xfb, 0xdf, 0xff, 0x73, 0x66, 0xf3, 0x73, 0xef, 0x36, 0xff, 0x93, 0xe5, 0xf6, 0x09, 0x2f, 0x10, 0xac, 0xfc, 0x4f, 0x96, 0xef, 0x88, 0xd1, 0x33, 0x91, 0x9f, 0xdf, 0x7d, 0x8f, 0xff, 0xc9, 0xf2, 0xde, 0xc9, 0xc9, 0x9d, 0xbb, 0x27, 0x27, 0x0f, 0xff, 0xf9, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x27, 0x27, 0xdf, 0xfd, 0xde, 0xd9, 0x90, 0xf7, 0x24, 0x52, 0xbe, 0xf6, 0xf5, 0x13, 0x43, 0xf9, 0x97, 0x1f, 0x9e, 0x11, 0x79, 0xdf, 0xf9, 0xad, 0x80, 0x5c, 0x5f, 0xfc, 0xd2, 0x1f, 0xfd, 0xf1, 0x9f, 0x7c, 0xf9, 0xe4, 0xb7, 0x7f, 0x27, 0x30, 0xfa, 0xb7, 0x7f, 0xf7, 0xfd, 0x1f, 0xfc, 0xfd, 0x3f, 0x9c, 0x09, 0x79, 0x7f, 0xef, 0xf7, 0x03, 0x92, 0xfd, 0xf9, 0x5f, 0x7c, 0xe3, 0x9b, 0x7f, 0xf9, 0x57, 0x27, 0x7f, 0xf0, 0x87, 0x81, 0xd1, 0x7f, 0xff, 0x8f, 0x7f, 0xfd, 0xb7, 0xff, 0xfc, 0xaf, 0xa1, 0xdb, 0x96, 0xf5, 0x71, 0x7e, 0xbd, 0x38, 0x84, 0xd7, 0xcf, 0xf2, 0x8b, 0xdf, 0x5b, 0x8f, 0x73, 0xf1, 0xff, 0x1d, 0xcb, 0xba, 0x80, 0xd7, 0xb3, 0x70, 0x3d, 0x07, 0x17, 0xb9, 0x40, 0x86, 0xac, 0xe0, 0x45, 0x42, 0x97, 0x4e, 0xe1, 0x02, 0x90, 0xf8, 0x75, 0xeb, 0x05, 0xeb, 0x85, 0x67, 0x5e, 0x78, 0xe6, 0xf1, 0xd6, 0x0c, 0x5f, 0xcf, 0x7e, 0xfc, 0x9b, 0x2f, 0x59, 0x1b, 0x8b, 0xe5, 0xe5, 0x72, 0x29, 0xf5, 0x56, 0x6a, 0x68, 0x7e, 0x75, 0xa1, 0x6c, 0x97, 0x52, 0x43, 0x70, 0x3b, 0xf4, 0xda, 0x65, 0x1b, 0x4b, 0x69, 0x72, 0x3a, 0x07, 0xbd, 0x4b, 0xaa, 0x57, 0xc0, 0xde, 0xfa, 0xc6, 0xda, 0xd2, 0xca, 0x65, 0xbb, 0x34, 0x85, 0x9d, 0x95, 0x6b, 0xcb, 0xaf, 0x95, 0xd7, 0x00, 0x34, 0x89, 0xbd, 0x4f, 0x95, 0x7f, 0xf9, 0x8d, 0xd5, 0xb5, 0x85, 0x52, 0x11, 0x3b, 0x73, 0x57, 0x97, 0x38, 0x16, 0x27, 0x31, 0xbf, 0xba, 0xbc, 0x5c, 0x5e, 0xd9, 0x28, 0x4d, 0x72, 0xac, 0xf5, 0xa5, 0xcb, 0x2b, 0x9c, 0x20, 0x9f, 0xb8, 0x5e, 0xbe, 0x52, 0x9e, 0xdf, 0xb0, 0x25, 0x6c, 0xfe, 0xda, 0xda, 0xfa, 0x2a, 0x50, 0x14, 0x6b, 0x2d, 0xce, 0x2d, 0xac, 0xbe, 0x61, 0x97, 0x3a, 0xee, 0x81, 0xc3, 0x69, 0x5e, 0xd9, 0xd8, 0xbc, 0xb4, 0x0a, 0x74, 0x6a, 0x95, 0x46, 0x9b, 0x8f, 0x2c, 0xcf, 0x6d, 0xcc, 0x2f, 0x6e, 0x2e, 0x94, 0xaf, 0x2c, 0x2d, 0x2f, 0x6d, 0x94, 0xd7, 0xd6, 0xd5, 0xd4, 0x1b, 0xb9, 0x54, 0x6a, 0xe8, 0xf2, 0xdc, 0x72, 0xf9, 0xea, 0xdc, 0x82, 0x14, 0x6a, 0x63, 0xf5, 0xda, 0xfc, 0x22, 0xdc, 0xf3, 0x0e, 0x90, 0xba, 0xba, 0x38, 0x57, 0x9a, 0x7c, 0x75, 0x02, 0xa9, 0xdc, 0x10, 0x18, 0x37, 0x52, 0xa9, 0xf9, 0xc5, 0xf2, 0xfc, 0xa7, 0x36, 0x57, 0xca, 0x6f, 0x6c, 0xbe, 0x0e, 0xd4, 0x96, 0x56, 0x57, 0x38, 0xc1, 0xd4, 0xca, 0xea, 0xe6, 0xfa, 0xea, 0xb5, 0x95, 0x05, 0xb1, 0x70, 0xea, 0xf2, 0xd2, 0xa5, 0xcd, 0x2b, 0xe5, 0x95, 0xcb, 0x1b, 0x8b, 0xa5, 0xc2, 0x84, 0x3d, 0x36, 0x66, 0xd7, 0x9b, 0x76, 0xdb, 0xa9, 0xb6, 0x9a, 0xdb, 0xed, 0xd4, 0xfc, 0xda, 0xc6, 0xe6, 0xf2, 0xea, 0xca, 0xd2, 0xc6, 0xea, 0x9a, 0x36, 0x7b, 0x7d, 0x7e, 0xee, 0x4a, 0xb9, 0x54, 0x4c, 0x5d, 0x5b, 0x92, 0xb7, 0x53, 0xa9, 0xd4, 0x58, 0x7c, 0x49, 0xd5, 0x0e, 0x9a, 0xd5, 0x4e, 0xbd, 0xd5, 0xb4, 0x37, 0x96, 0xe6, 0x33, 0xd9, 0xd4, 0x50, 0xb5, 0xd1, 0xc6, 0xa6, 0xd1, 0xaa, 0x56, 0x1a, 0x76, 0xa3, 0xb2, 0xe5, 0x34, 0x4a, 0xe9, 0x8d, 0xdd, 0x7a, 0xdb, 0x86, 0xbf, 0xf6, 0x51, 0xbb, 0xe3, 0xec, 0xd9, 0xb0, 0x7c, 0xad, 0xbe, 0x73, 0xe0, 0x56, 0x38, 0x5e, 0xb5, 0xe2, 0x76, 0xdc, 0xfa, 0xf6, 0x8e, 0x93, 0x56, 0x58, 0xed, 0xfa, 0x9b, 0x4e, 0x69, 0xdf, 0xad, 0x37, 0x3b, 0x19, 0x4e, 0x20, 0x37, 0x91, 0x1b, 0x9b, 0x01, 0x9a, 0xfa, 0x50, 0xa6, 0x30, 0x35, 0x31, 0x86, 0x13, 0xb3, 0xe3, 0xe3, 0x85, 0x5c, 0x66, 0xb2, 0x38, 0x03, 0x53, 0xe0, 0x36, 0x9b, 0x72, 0x9a, 0xdb, 0x29, 0x2e, 0x1b, 0xda, 0xa4, 0xbc, 0xc6, 0x5d, 0x06, 0x54, 0xb4, 0x51, 0xfe, 0x74, 0xe9, 0x33, 0x9f, 0x01, 0x15, 0xbe, 0x72, 0xdd, 0x71, 0xdb, 0xb8, 0xf0, 0xe4, 0xe4, 0x04, 0x74, 0x2b, 0x1d, 0x58, 0x7d, 0xeb, 0xa0, 0xe3, 0xd8, 0xd7, 0x9d, 0x6a, 0xd1, 0xde, 0xd9, 0x3f, 0xd8, 0x7c, 0xdd, 0x71, 0x3b, 0xce, 0xe1, 0xc5, 0x30, 0xb0, 0xc0, 0x81, 0x1b, 0xce, 0xe1, 0x7c, 0xab, 0xe5, 0x6e, 0x47, 0xc0, 0x53, 0x1c, 0x3c, 0xdf, 0x6a, 0xb4, 0x5c, 0x84, 0x1d, 0x34, 0xeb, 0xb5, 0x96, 0xbb, 0x67, 0xef, 0x55, 0x3a, 0x02, 0xb2, 0xdc, 0xda, 0x76, 0x1a, 0xaf, 0xd7, 0x9d, 0xee, 0x55, 0xb7, 0xf5, 0xab, 0x0e, 0xd7, 0xd9, 0x72, 0x05, 0xf0, 0xf9, 0x42, 0xd7, 0x2b, 0xee, 0x51, 0xbd, 0xb9, 0x23, 0xe8, 0x54, 0x15, 0x0d, 0x6d, 0xb4, 0x60, 0x77, 0xb4, 0x85, 0xaf, 0xb7, 0xea, 0xdb, 0x40, 0xb9, 0xde, 0xcc, 0xe0, 0x5d, 0x56, 0xb9, 0x0a, 0x47, 0xb4, 0x4b, 0x41, 0x46, 0x86, 0x14, 0x22, 0x00, 0x90, 0x50, 0x46, 0x97, 0x22, 0xcb, 0x67, 0xec, 0x34, 0x36, 0xaf, 0xb6, 0xda, 0x75, 0x6e, 0x8e, 0x52, 0x32, 0xb3, 0xf6, 0x08, 0xe7, 0x31, 0xe3, 0xeb, 0x29, 0x67, 0x4f, 0xe6, 0x27, 0x38, 0x9d, 0x1b, 0xa9, 0xa1, 0xcf, 0x7e, 0x16, 0x1c, 0xf4, 0xea, 0xd2, 0xa7, 0xcb, 0x57, 0x8c, 0xca, 0x1e, 0x1f, 0xdf, 0x77, 0x9d, 0x6a, 0x9d, 0x8f, 0xec, 0xd6, 0x77, 0x76, 0xf7, 0xed, 0x5a, 0xa3, 0x55, 0xe9, 0x24, 0xca, 0xaa, 0x14, 0xd9, 0xae, 0xec, 0xed, 0x37, 0x1c, 0xb7, 0xb0, 0x60, 0xb7, 0x5b, 0x07, 0x6e, 0xd5, 0xd1, 0x61, 0x9c, 0x8a, 0xdd, 0x71, 0x77, 0x36, 0x0f, 0xcd, 0xc3, 0x47, 0xe6, 0xe1, 0xae, 0x79, 0x78, 0x37, 0x3a, 0xdc, 0xae, 0xba, 0xa6, 0xd9, 0x38, 0x0c, 0xb3, 0xb9, 0x68, 0x76, 0x79, 0xef, 0xa0, 0x51, 0xe9, 0x38, 0xdb, 0x10, 0x64, 0xfb, 0x07, 0x1d, 0xdb, 0x75, 0xda, 0xad, 0xc6, 0x01, 0xaa, 0x2e, 0x8f, 0xf2, 0xa1, 0x5c, 0x30, 0x54, 0xe2, 0x36, 0x28, 0x4c, 0xcf, 0xe4, 0x27, 0x72, 0x93, 0x53, 0x53, 0x5c, 0x75, 0x02, 0x7d, 0xb1, 0xe2, 0x6e, 0x37, 0x9d, 0x76, 0xdb, 0x6e, 0xd5, 0x80, 0x6e, 0xa5, 0xd9, 0xa8, 0x37, 0x9d, 0xbc, 0x00, 0xd9, 0x63, 0xaf, 0xe6, 0x27, 0xc0, 0x34, 0xed, 0x56, 0xad, 0x23, 0x46, 0xc6, 0x26, 0x67, 0xf8, 0xc8, 0x9e, 0xb3, 0x5d, 0x3f, 0xd8, 0x83, 0x31, 0xc1, 0xcf, 0x2e, 0xd0, 0x58, 0x07, 0xdc, 0x12, 0x22, 0x98, 0x08, 0xef, 0xd7, 0x0f, 0x9d, 0x46, 0x9b, 0xa7, 0x81, 0xe0, 0x12, 0x63, 0x85, 0xf0, 0x0a, 0x53, 0x7c, 0x00, 0x29, 0x06, 0xc8, 0x5f, 0xad, 0x1f, 0x96, 0xc6, 0x8a, 0x3e, 0xf5, 0x85, 0x7a, 0x7b, 0xbf, 0x51, 0x39, 0xb2, 0xbb, 0x15, 0x77, 0x5f, 0xd2, 0x9a, 0xe0, 0x98, 0xcd, 0x56, 0xd3, 0x11, 0x7d, 0x70, 0x90, 0x71, 0x21, 0x80, 0x73, 0xd8, 0x71, 0x9d, 0x3d, 0x47, 0xe9, 0x03, 0x71, 0x84, 0x42, 0x70, 0xca, 0xcc, 0x14, 0xea, 0x04, 0x6e, 0xa6, 0x5e, 0x45, 0xb5, 0xd8, 0x72, 0x81, 0xb9, 0xbd, 0xd6, 0x41, 0xb3, 0xc3, 0xb5, 0xb2, 0x5b, 0xd9, 0x6e, 0x75, 0xc1, 0xf1, 0xdb, 0x9f, 0xcb, 0x7b, 0x3c, 0x61, 0x6f, 0xa1, 0xe2, 0x7e, 0xae, 0x34, 0x91, 0x9f, 0xbe, 0x18, 0x18, 0xbd, 0x02, 0x1e, 0xd6, 0x29, 0x4d, 0xe2, 0x30, 0xa7, 0x34, 0xf6, 0x94, 0x8a, 0xe4, 0xab, 0xbd, 0x76, 0xf9, 0x35, 0xbb, 0xd3, 0xb2, 0xaf, 0x80, 0x12, 0x2b, 0xae, 0x14, 0x7d, 0xae, 0xdd, 0x3e, 0x40, 0x37, 0x3e, 0x68, 0xe3, 0xbf, 0x62, 0xca, 0xd1, 0x3e, 0xf8, 0x04, 0xb8, 0x74, 0xe7, 0x00, 0xec, 0x6f, 0x77, 0x30, 0x19, 0xb6, 0x77, 0x5b, 0x07, 0x8d, 0x6d, 0x50, 0x51, 0xc7, 0xde, 0x72, 0xec, 0xa6, 0xe3, 0x6c, 0x3b, 0xdb, 0xbe, 0x48, 0x1b, 0x2d, 0x41, 0x73, 0x32, 0x23, 0xfa, 0xd5, 0xec, 0x5b, 0xae, 0x03, 0xd8, 0xcd, 0x4c, 0x75, 0x16, 0xc4, 0x9c, 0x98, 0x9a, 0x98, 0x9a, 0xce, 0x7e, 0xb2, 0x3a, 0x3e, 0x59, 0xc8, 0xff, 0x62, 0xe1, 0x97, 0xf6, 0x5b, 0xdd, 0x4c, 0xa6, 0x3a, 0x0a, 0xe3, 0xd3, 0xd3, 0xd9, 0xf1, 0x49, 0x6c, 0x72, 0x85, 0xfc, 0x54, 0xf6, 0xe2, 0x0d, 0xa1, 0xe6, 0xa2, 0x47, 0x2f, 0xc3, 0x7b, 0x1e, 0x35, 0x9e, 0xf1, 0x32, 0xfe, 0x62, 0xd5, 0xbc, 0x9b, 0xcd, 0xe9, 0xdd, 0x9d, 0x60, 0x77, 0x2b, 0x8b, 0x34, 0x85, 0x9c, 0x62, 0x14, 0xc5, 0x47, 0x19, 0x9f, 0xae, 0xf0, 0xeb, 0xee, 0xce, 0x96, 0x49, 0x74, 0x90, 0x70, 0xa2, 0x38, 0x59, 0x9c, 0x78, 0xf5, 0x93, 0xd5, 0x11, 0x21, 0x3a, 0x17, 0x76, 0x04, 0x15, 0x50, 0xcd, 0x4d, 0xe4, 0xa7, 0x26, 0x67, 0x66, 0x66, 0xb2, 0x63, 0x42, 0x11, 0xba, 0xf4, 0x48, 0x30, 0x46, 0x76, 0xb1, 0x96, 0x94, 0x5c, 0x75, 0x76, 0xf4, 0x8e, 0x2e, 0xf5, 0x0a, 0xc8, 0xec, 0xb4, 0x3b, 0xb6, 0xa3, 0x22, 0x5d, 0x24, 0x25, 0x7b, 0xa7, 0x7e, 0xdd, 0x69, 0x8a, 0x94, 0x80, 0x92, 0xef, 0xb7, 0xe0, 0x41, 0x05, 0xff, 0xca, 0x94, 0x5a, 0x69, 0x72, 0x0d, 0x38, 0x0d, 0xf0, 0xe1, 0x5a, 0xdb, 0xe9, 0x28, 0x6d, 0x35, 0xda, 0x2d, 0xfb, 0x4d, 0xc7, 0x6d, 0xfd, 0x02, 0x46, 0x26, 0xc6, 0xbc, 0xeb, 0x38, 0x2a, 0x57, 0x14, 0xed, 0x4b, 0x4e, 0xa7, 0xba, 0x9b, 0xe1, 0x61, 0x02, 0x94, 0x72, 0xfc, 0x06, 0xa6, 0x65, 0x79, 0xa6, 0x87, 0x91, 0x12, 0x6a, 0xa8, 0xe5, 0x66, 0xe0, 0x76, 0x04, 0x98, 0x1a, 0x45, 0xd8, 0x28, 0x8f, 0x25, 0x08, 0x04, 0xd0, 0xc6, 0x74, 0x36, 0x3b, 0x0e, 0xe3, 0x3c, 0xc1, 0x4b, 0x99, 0x3d, 0x3f, 0x98, 0xcc, 0x17, 0x20, 0x91, 0x4b, 0xab, 0x14, 0x16, 0x32, 0x22, 0xa3, 0xe6, 0x80, 0x54, 0xfe, 0xf0, 0x28, 0xc7, 0x73, 0x4b, 0x36, 0x0f, 0xf2, 0xfb, 0x92, 0x43, 0x94, 0x77, 0x2a, 0xcd, 0xaa, 0x83, 0x99, 0xc3, 0x93, 0x5e, 0x26, 0x13, 0x70, 0x82, 0xa6, 0x54, 0x0c, 0x17, 0xd3, 0x4b, 0x77, 0x88, 0xe4, 0x49, 0x90, 0x7d, 0x0b, 0x99, 0x96, 0xdc, 0x5e, 0x94, 0x1c, 0x8d, 0x65, 0x90, 0xff, 0x31, 0x4f, 0x92, 0x6c, 0x76, 0x4c, 0x89, 0x90, 0x15, 0x26, 0x1c, 0x1a, 0x92, 0x39, 0x64, 0xc1, 0xbe, 0x5c, 0x39, 0x68, 0xb7, 0xeb, 0x95, 0xa6, 0xef, 0x2b, 0x38, 0x22, 0x1d, 0x05, 0x75, 0xa4, 0x72, 0x72, 0xa5, 0xe1, 0x78, 0x76, 0x76, 0x0e, 0xf7, 0x0b, 0x19, 0x3e, 0x34, 0x82, 0x6b, 0xe3, 0x1a, 0x9e, 0x50, 0xc5, 0xb1, 0x4e, 0x65, 0xdf, 0x23, 0x6b, 0xd7, 0xea, 0x8d, 0x8e, 0xe3, 0xda, 0x95, 0x46, 0x0b, 0x6c, 0xb8, 0xdb, 0x72, 0xdf, 0xb4, 0x55, 0x7e, 0xe4, 0x06, 0x59, 0x84, 0x91, 0xa2, 0x6f, 0x10, 0xb1, 0x98, 0x67, 0x11, 0x3e, 0x65, 0xab, 0x24, 0xac, 0xa6, 0x0c, 0x96, 0x19, 0x03, 0x0f, 0xcd, 0xe1, 0x1c, 0xf1, 0xa0, 0x15, 0x3e, 0x18, 0x9e, 0x84, 0xf9, 0x32, 0x3c, 0x69, 0x3b, 0x32, 0x29, 0x48, 0x49, 0xac, 0xbe, 0xdd, 0xee, 0x94, 0xb8, 0x92, 0x51, 0xac, 0x3c, 0x7f, 0xf6, 0xa1, 0x5c, 0xf3, 0xad, 0x26, 0x3c, 0x77, 0x01, 0xac, 0x8c, 0x06, 0x16, 0xea, 0x3a, 0x98, 0x0d, 0xf3, 0x3e, 0x2e, 0xd7, 0x49, 0x49, 0x66, 0x74, 0x8d, 0x66, 0x77, 0xab, 0xc4, 0xd5, 0x0a, 0xb4, 0x39, 0xf7, 0x42, 0x9d, 0xfa, 0x84, 0xaa, 0x37, 0x01, 0x93, 0x8e, 0x61, 0xc2, 0xb6, 0x3f, 0x21, 0x44, 0x01, 0x98, 0x5b, 0x13, 0x76, 0x11, 0xca, 0xf6, 0x42, 0x28, 0xaf, 0xb9, 0x69, 0x66, 0x6b, 0xa4, 0xbb, 0x35, 0x5a, 0x1d, 0xe9, 0x56, 0x47, 0xb7, 0x47, 0xba, 0xdb, 0xd9, 0xf1, 0x0c, 0x74, 0xa1, 0x03, 0xb7, 0x9e, 0xe9, 0xa6, 0x9f, 0xd8, 0x74, 0xd3, 0xc9, 0xa6, 0xab, 0x44, 0x4c, 0x57, 0x88, 0x5a, 0xe5, 0x27, 0x67, 0x5f, 0x3e, 0xc9, 0x89, 0x4c, 0x2a, 0xfc, 0xa4, 0x9c, 0xa0, 0xe2, 0x3b, 0x41, 0xc1, 0x68, 0xe3, 0x1f, 0xa7, 0x97, 0xc8, 0x09, 0x8e, 0x3f, 0xa1, 0xf0, 0x61, 0xdc, 0xa8, 0x32, 0xd2, 0xad, 0x8c, 0x06, 0x7d, 0x69, 0xd4, 0x19, 0xe9, 0x3a, 0xe8, 0x50, 0x95, 0x51, 0xe5, 0x53, 0xa3, 0x30, 0xe0, 0xb9, 0x95, 0xa4, 0xaa, 0xf6, 0x46, 0x9a, 0xc2, 0x04, 0x4f, 0xb8, 0xb7, 0x8a, 0xf5, 0x23, 0x93, 0x39, 0x8e, 0xf4, 0xfc, 0xeb, 0x89, 0x03, 0x28, 0x39, 0xb5, 0x55, 0xf3, 0x17, 0x9f, 0x6b, 0x34, 0x60, 0x77, 0xe3, 0xa5, 0xd2, 0x5d, 0x78, 0x1c, 0x70, 0x37, 0xe6, 0x19, 0xd6, 0xa9, 0xd5, 0x60, 0x1f, 0x2e, 0x52, 0xae, 0xe7, 0xd7, 0x1b, 0x6e, 0x5d, 0xcb, 0xaf, 0x9a, 0x2f, 0x8b, 0x5c, 0x85, 0x3c, 0x8e, 0xa9, 0xdd, 0xb9, 0xf2, 0x60, 0x11, 0x0b, 0x08, 0x42, 0xbf, 0x0c, 0xf8, 0xad, 0x8f, 0xe5, 0xed, 0xe9, 0x7d, 0x7f, 0xe0, 0xa2, 0x07, 0x29, 0x7a, 0xae, 0xe0, 0xc1, 0x7c, 0x92, 0x9e, 0x17, 0xf8, 0x30, 0x0f, 0x4f, 0xaa, 0x23, 0x68, 0x9f, 0xc0, 0xa3, 0xa6, 0xe5, 0xf2, 0x27, 0xa7, 0xb6, 0x13, 0x06, 0x7c, 0x7c, 0x8e, 0xc2, 0xdb, 0x9d, 0x18, 0xc5, 0x67, 0x25, 0xc4, 0xfb, 0xfe, 0x6e, 0xc5, 0x7b, 0xdc, 0xbc, 0x01, 0xbb, 0xc9, 0x90, 0x3a, 0xd4, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x88, 0x2f, 0xfa, 0x72, 0x7c, 0xc4, 0xdb, 0x78, 0x8e, 0x22, 0x7b, 0xf9, 0xa3, 0x11, 0xfe, 0x6f, 0x76, 0x84, 0x6f, 0x64, 0x0f, 0x73, 0x1e, 0xe0, 0x90, 0x03, 0x0e, 0x25, 0xe0, 0x28, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x28, 0xee, 0x3d, 0x15, 0xff, 0xeb, 0xc1, 0x5d, 0x2a, 0xd7, 0xed, 0x32, 0x74, 0xa2, 0xac, 0xe5, 0x0f, 0x47, 0x4b, 0x62, 0x69, 0xbe, 0x9f, 0x56, 0x86, 0x40, 0xcc, 0x12, 0xdf, 0x9f, 0xa8, 0xbd, 0x6d, 0x2e, 0x72, 0x23, 0xb8, 0xe0, 0x34, 0x4a, 0x35, 0xb7, 0x52, 0xed, 0x08, 0x56, 0xc7, 0x67, 0x94, 0x8e, 0xeb, 0x35, 0x31, 0x02, 0xbb, 0xa6, 0x62, 0xb1, 0x98, 0xe5, 0xdc, 0xb8, 0x25, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0x3b, 0xa6, 0x89, 0x1c, 0xb2, 0x15, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xc5, 0x1b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xcd, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x21, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0x3b, 0x25, 0x78, 0x2f, 0xbd, 0xe4, 0x56, 0x76, 0xf8, 0xab, 0x20, 0x6c, 0x4c, 0xc4, 0xd6, 0x80, 0xbf, 0xe5, 0xe5, 0xc4, 0x5b, 0x9d, 0x10, 0x95, 0x4f, 0xce, 0x1f, 0x95, 0xf8, 0xcb, 0xd8, 0x98, 0xec, 0xf1, 0x3d, 0xff, 0x90, 0x52, 0x79, 0x89, 0xfb, 0x06, 0x07, 0x8d, 0x7b, 0x54, 0xba, 0x82, 0xca, 0x6e, 0x56, 0xbc, 0x82, 0x0d, 0x79, 0xcb, 0xc1, 0x9b, 0x33, 0xee, 0x7e, 0x4a, 0x18, 0x5e, 0x68, 0xaf, 0x11, 0x6e, 0xbe, 0x10, 0x37, 0xde, 0xab, 0xb3, 0x87, 0x23, 0x5e, 0xb0, 0xa7, 0xe4, 0xae, 0x32, 0x13, 0x26, 0x97, 0x0d, 0xbd, 0x29, 0xa7, 0x6e, 0xa4, 0xfe, 0x17, 0x05, 0x9f, 0xf4, 0xab, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x92, 0x58, 0x16, 0x49, 0x15, 0x49, 0xad, 0x9c, 0x72, 0xb9, 0x68, 0x10, 0x1c, 0x90, 0x88, 0x21, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x13, 0x3b, 0x1d, 0xac, 0x37, 0xce, 0xdb, 0x96, 0x68, 0x27, 0x76, 0x9e, 0xd0, 0x44, 0x1b, 0xe7, 0x9d, 0xad, 0x52, 0xbe, 0xaf, 0x1f, 0x33, 0x3d, 0x33, 0x3d, 0x43, 0x69, 0x2d, 0xdb, 0x1b, 0x86, 0x3d, 0x6c, 0xf5, 0x74, 0x7f, 0xfd, 0x7d, 0xfd, 0xbd, 0xa7, 0xa7, 0x07, 0xa5, 0x51, 0xcb, 0xb2, 0x9e, 0x7b, 0xf7, 0x53, 0xd6, 0x80, 0x41, 0xb9, 0x75, 0xeb, 0xd6, 0xed, 0xc3, 0xc3, 0xc3, 0xdb, 0xd8, 0x42, 0xf7, 0x36, 0xa3, 0x7e, 0x65, 0x6c, 0xe8, 0xdd, 0xba, 0xc5, 0xbc, 0xc3, 0x43, 0xea, 0xdd, 0xfa, 0x0d, 0xea, 0xb1, 0xdb, 0x94, 0xd1, 0xdb, 0x94, 0xaa, 0xca, 0xf1, 0x47, 0x47, 0x47, 0x0b, 0xd9, 0x6c, 0xb6, 0x80, 0x2d, 0x74, 0x0b, 0x80, 0xa7, 0x2a, 0xe2, 0x8f, 0x8e, 0x32, 0x2f, 0x9b, 0xa5, 0xde, 0xe8, 0xab, 0x80, 0x5f, 0xa0, 0x1e, 0x15, 0x75, 0x48, 0x0b, 0x16, 0xe3, 0xf8, 0x80, 0x3b, 0x5b, 0x2e, 0x97, 0x67, 0xb1, 0x85, 0xee, 0x2c, 0x81, 0x0a, 0xb8, 0xb3, 0x12, 0x3f, 0x9b, 0x65, 0x5e, 0xb9, 0x4c, 0xbd, 0x6c, 0x09, 0xf0, 0x67, 0xa9, 0x47, 0xa0, 0xd2, 0x59, 0xc0, 0x9f, 0x95, 0xf8, 0xfd, 0x7e, 0xbf, 0xd5, 0x68, 0x34, 0x5a, 0xd8, 0x42, 0x97, 0x57, 0x62, 0x11, 0x6c, 0x11, 0xbf, 0xdf, 0x67, 0x5e, 0xa3, 0x41, 0xbd, 0xfe, 0x36, 0xe0, 0xb7, 0x80, 0x66, 0x8b, 0x52, 0x0b, 0x2a, 0xb6, 0x5f, 0xbf, 0x7f, 0xff, 0xc5, 0xfb, 0x58, 0x1e, 0x3e, 0xb8, 0x7f, 0xdf, 0xf3, 0xee, 0x3f, 0xf4, 0xbc, 0x07, 0xd8, 0x85, 0x7f, 0x1e, 0x7e, 0xdb, 0xf3, 0x5e, 0x52, 0x70, 0x3e, 0x0e, 0x70, 0x3e, 0x2f, 0x06, 0x7f, 0x20, 0xf1, 0x65, 0x0b, 0xfd, 0x10, 0xfc, 0xa1, 0xa4, 0xff, 0x50, 0xe2, 0x3f, 0x0c, 0xf0, 0xbf, 0xd0, 0x68, 0xfc, 0x44, 0xe3, 0xc6, 0x76, 0xa3, 0xb1, 0x7d, 0x43, 0xd4, 0x7e, 0x9f, 0xb7, 0x30, 0x72, 0x63, 0xb7, 0xdf, 0x7f, 0xc1, 0xce, 0x66, 0x3f, 0x91, 0x1d, 0x7d, 0x35, 0x9b, 0x7d, 0xf5, 0x95, 0xac, 0xde, 0xc2, 0xdd, 0x2b, 0x3f, 0x35, 0x3a, 0xfa, 0xdc, 0xbb, 0x87, 0x87, 0x99, 0xc3, 0x2f, 0xbf, 0x73, 0xc8, 0xeb, 0x3b, 0x5f, 0x3e, 0x54, 0xf7, 0x70, 0xf7, 0xce, 0xaf, 0x7c, 0xe9, 0x4b, 0x23, 0x53, 0xe5, 0xf2, 0x99, 0x72, 0xe9, 0xb5, 0x32, 0xaf, 0xaf, 0x65, 0x41, 0xcb, 0xd8, 0x96, 0xca, 0x25, 0xf8, 0x17, 0x69, 0x73, 0x7b, 0xa3, 0xed, 0xf9, 0xf5, 0x35, 0x7e, 0xff, 0xcb, 0xe0, 0x07, 0xcc, 0xa2, 0xa8, 0xdb, 0x01, 0xbb, 0x6d, 0x31, 0xb0, 0xfd, 0xf0, 0x36, 0xd8, 0xff, 0x50, 0x56, 0xf4, 0x07, 0x8b, 0x0e, 0x3d, 0xc6, 0x3c, 0x8f, 0xdb, 0x1b, 0x6d, 0x9f, 0xbd, 0x0b, 0x2d, 0x5e, 0xd9, 0xec, 0x4f, 0x83, 0x1f, 0xf8, 0xf8, 0x05, 0x4a, 0xc1, 0xf6, 0xbc, 0x16, 0xb2, 0x94, 0x71, 0x3f, 0x18, 0x0d, 0xf0, 0xb9, 0xbd, 0xd1, 0xf6, 0xf7, 0xee, 0xdd, 0x9b, 0x2d, 0xcf, 0xce, 0xe2, 0x3d, 0xd2, 0xf0, 0xf1, 0x67, 0x29, 0x05, 0xdb, 0xd3, 0x7b, 0x50, 0x67, 0xcb, 0x94, 0x71, 0x3f, 0xc8, 0x06, 0xf8, 0xdc, 0xd6, 0x68, 0xfb, 0x06, 0xb6, 0x5f, 0xe1, 0xf7, 0xbf, 0x08, 0x7e, 0xe0, 0xe3, 0xb7, 0x2c, 0x06, 0xb6, 0x1f, 0xb6, 0xc0, 0xfe, 0x0d, 0x59, 0xd1, 0x1f, 0x14, 0x3e, 0x84, 0x81, 0x95, 0xe4, 0x03, 0x38, 0xae, 0xc3, 0xa3, 0x3e, 0x10, 0x86, 0xc7, 0x7d, 0x20, 0x04, 0x37, 0xf8, 0x80, 0x82, 0x27, 0xf9, 0x00, 0x8e, 0x23, 0x3c, 0xc9, 0x07, 0x70, 0x1c, 0xe1, 0x49, 0x3e, 0x80, 0xe3, 0x08, 0x4f, 0xf2, 0x01, 0x1c, 0x37, 0xc6, 0x2f, 0x2f, 0xd9, 0x42, 0x81, 0xdd, 0x35, 0xc5, 0x2f, 0xc0, 0xc1, 0x9e, 0x50, 0xef, 0x42, 0xb5, 0x9e, 0x41, 0xd9, 0xbe, 0xea, 0xbc, 0x60, 0xfd, 0x90, 0x0a, 0x3a, 0x57, 0xac, 0x32, 0xc2, 0x2b, 0xa8, 0xbf, 0x8c, 0x25, 0x06, 0xff, 0xd6, 0x8b, 0xfe, 0x9c, 0xf2, 0x19, 0xcb, 0xe2, 0xf5, 0xfb, 0x8f, 0x1f, 0xf3, 0xf6, 0x1b, 0x2f, 0xde, 0x2f, 0xeb, 0x45, 0xc1, 0xf5, 0x79, 0x5a, 0xb1, 0x3e, 0xe6, 0x25, 0x88, 0x5f, 0x6c, 0xef, 0xb2, 0x78, 0xfc, 0x5a, 0x18, 0xb3, 0x43, 0x88, 0x5d, 0xee, 0x03, 0xd1, 0xf8, 0x7d, 0x16, 0x3c, 0x3c, 0x7a, 0xfc, 0xd8, 0x3a, 0x2d, 0xa7, 0xe5, 0xb4, 0xfc, 0x98, 0x0a, 0x21, 0xa2, 0x42, 0x36, 0xa7, 0x84, 0xf1, 0xaa, 0x17, 0xca, 0x08, 0x80, 0xa0, 0x52, 0xcc, 0x0a, 0x38, 0x89, 0x45, 0x92, 0x2c, 0xc2, 0xe1, 0x62, 0x02, 0x17, 0xdb, 0x30, 0x01, 0xa0, 0xcd, 0x2c, 0x31, 0xce, 0x64, 0x3f, 0x84, 0x2f, 0xc6, 0x38, 0x5c, 0xce, 0x0d, 0xaf, 0xcf, 0x04, 0x7d, 0xb5, 0x06, 0x23, 0xb1, 0xf5, 0x91, 0x7f, 0x81, 0x6f, 0x89, 0xaa, 0x40, 0x90, 0xc4, 0x93, 0x6a, 0xc0, 0x9e, 0x46, 0x1f, 0x2f, 0x62, 0x90, 0x8f, 0xaa, 0xb5, 0x19, 0xbf, 0x0f, 0x8b, 0x17, 0xe8, 0xcc, 0xa4, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x8b, 0xf2, 0x0f, 0xf3, 0x09, 0xe5, 0xd5, 0x88, 0xcf, 0x08, 0xa8, 0x9e, 0xf9, 0x15, 0xfb, 0x21, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x86, 0xe1, 0x3e, 0xdf, 0xca, 0x3e, 0x16, 0x35, 0xd8, 0x97, 0x89, 0xca, 0x6d, 0xc4, 0x0c, 0x4e, 0x42, 0x83, 0x1a, 0xb3, 0xaf, 0x94, 0x91, 0x4a, 0xfb, 0x45, 0x77, 0x05, 0x12, 0x86, 0xfe, 0x63, 0x29, 0x1b, 0x9b, 0xfc, 0x87, 0xd3, 0x36, 0xe1, 0x47, 0xfc, 0x83, 0xc6, 0xfd, 0xc3, 0xd4, 0x6a, 0x13, 0x40, 0x49, 0xa8, 0x5d, 0xfc, 0x43, 0x47, 0x66, 0x71, 0xff, 0x52, 0xf6, 0x95, 0x6d, 0x4c, 0x7a, 0xae, 0x17, 0x03, 0x6f, 0x3a, 0x8f, 0x8c, 0x18, 0x71, 0x71, 0x71, 0xa9, 0x37, 0xc2, 0x63, 0xc8, 0x0a, 0xcb, 0xaf, 0xfc, 0x49, 0xd9, 0x85, 0xc6, 0xb6, 0x55, 0xb8, 0x2e, 0x15, 0x3e, 0x6e, 0x70, 0x1f, 0x1f, 0x9f, 0x26, 0xe0, 0xeb, 0xfe, 0xab, 0x74, 0x1c, 0xa3, 0x4f, 0xa4, 0x7c, 0x44, 0xf2, 0x1b, 0x61, 0x9f, 0xc9, 0x38, 0x63, 0x71, 0xb0, 0xaf, 0x77, 0x69, 0x63, 0x6a, 0xd0, 0xaf, 0xe2, 0x4b, 0xd5, 0x98, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x58, 0x31, 0xff, 0xb4, 0x02, 0x0f, 0x89, 0xfb, 0x1f, 0x09, 0x68, 0xf0, 0x36, 0xa6, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xc4, 0xf8, 0x60, 0xe1, 0xfc, 0x45, 0x45, 0x0e, 0x51, 0x03, 0xc4, 0xbf, 0xa7, 0xda, 0x78, 0x82, 0xda, 0x74, 0xf7, 0x53, 0x35, 0xc9, 0x75, 0x68, 0x92, 0x6b, 0x69, 0x7e, 0xa5, 0xe7, 0x2c, 0x3d, 0xbf, 0xa5, 0xfa, 0x26, 0xb5, 0x64, 0xee, 0x95, 0xa1, 0xc7, 0x54, 0xbe, 0x35, 0x98, 0x96, 0xc5, 0x4d, 0x0c, 0x99, 0x92, 0x40, 0xd6, 0x21, 0x4c, 0xbf, 0x64, 0x5f, 0xcf, 0xaf, 0xd0, 0xc5, 0xec, 0x65, 0x61, 0x1b, 0xca, 0xaf, 0x32, 0xb6, 0x31, 0x43, 0x11, 0xe8, 0x10, 0xdf, 0x86, 0xc4, 0xd7, 0x3d, 0x97, 0x41, 0xf3, 0x8d, 0x70, 0x0c, 0x12, 0xc5, 0x3c, 0x97, 0x13, 0x97, 0x25, 0xba, 0x0b, 0x33, 0x12, 0xc4, 0x9d, 0x7a, 0x8e, 0x91, 0x40, 0x17, 0x84, 0x10, 0x22, 0xa9, 0x84, 0x5b, 0x39, 0xae, 0x3b, 0x0f, 0x15, 0x8c, 0x83, 0x20, 0x8c, 0xa7, 0x89, 0xd3, 0x72, 0x5a, 0x4e, 0x7a, 0xe1, 0x47, 0x64, 0x9e, 0xe7, 0x0d, 0xf1, 0x4d, 0x1f, 0x0b, 0x6f, 0x07, 0x03, 0xd9, 0x7a, 0x12, 0x3c, 0xd0, 0xc1, 0x83, 0x81, 0x98, 0xee, 0x89, 0x36, 0x28, 0x06, 0x3a, 0x11, 0x70, 0x8c, 0xce, 0xa9, 0x05, 0x7e, 0xbc, 0x65, 0x38, 0x40, 0x43, 0x82, 0xdd, 0xa0, 0xa2, 0x81, 0x58, 0xbc, 0x78, 0x5a, 0x19, 0x44, 0x81, 0xca, 0x4f, 0x90, 0x4e, 0x02, 0xbe, 0xf2, 0x13, 0x23, 0xfe, 0xa9, 0x05, 0x3e, 0x46, 0xf1, 0x6f, 0xa8, 0x2c, 0x30, 0xeb, 0x20, 0xa1, 0x9a, 0xf0, 0x31, 0xc0, 0x61, 0x6c, 0xe8, 0x99, 0xf0, 0xf1, 0x5c, 0xc9, 0xc3, 0x3a, 0x48, 0xc2, 0x1f, 0x7a, 0xa2, 0x32, 0x23, 0x3e, 0xe2, 0xf1, 0x7a, 0xec, 0xfa, 0x71, 0x7c, 0x2f, 0x52, 0x0d, 0xf8, 0x9e, 0x5e, 0x53, 0xf9, 0x37, 0xe3, 0xfb, 0xb2, 0x0f, 0xa5, 0x0a, 0x75, 0x7c, 0x5d, 0x76, 0xbc, 0x3f, 0x3e, 0xfe, 0x20, 0xb8, 0x20, 0x6e, 0x64, 0x65, 0x2c, 0x21, 0x40, 0xd9, 0x13, 0x16, 0x3d, 0x98, 0x59, 0xd4, 0xde, 0x66, 0x5e, 0x34, 0x5b, 0xc7, 0x79, 0x91, 0x72, 0x26, 0xe2, 0x4b, 0x1b, 0xa7, 0xe0, 0xb3, 0x61, 0x1a, 0xfe, 0x80, 0xfd, 0x60, 0xf8, 0x9a, 0x9d, 0x92, 0xf0, 0x95, 0xad, 0x7f, 0x90, 0xf5, 0x87, 0x69, 0xf8, 0x83, 0x14, 0xfc, 0x68, 0x19, 0x08, 0x9e, 0x79, 0x1d, 0x3e, 0x41, 0x4d, 0x89, 0xcb, 0x20, 0x3e, 0x9f, 0xc2, 0x39, 0x4c, 0xf1, 0xcf, 0xd2, 0xf3, 0x40, 0x1a, 0xfe, 0x30, 0x0d, 0x7f, 0x70, 0x2c, 0xfe, 0xd0, 0x4b, 0xc3, 0xf7, 0xf3, 0xc7, 0x47, 0x58, 0x3f, 0x14, 0xbf, 0x66, 0x7c, 0x3f, 0xfe, 0x3f, 0x22, 0xff, 0xc3, 0x34, 0x7c, 0x95, 0x07, 0x74, 0xdf, 0x4d, 0x78, 0x7e, 0xea, 0xbe, 0x73, 0x6c, 0x6c, 0x3f, 0x4d, 0x1e, 0x60, 0x49, 0x7e, 0x15, 0xe6, 0xc5, 0xe0, 0x53, 0xc3, 0x48, 0xfc, 0xf8, 0xf9, 0x3a, 0x86, 0xef, 0x69, 0xf9, 0xda, 0x8c, 0x3f, 0x54, 0xf1, 0x37, 0x34, 0xe2, 0xcb, 0x3c, 0x3f, 0x48, 0x5d, 0x3f, 0x05, 0x3f, 0x9e, 0xef, 0x93, 0xf0, 0x43, 0x79, 0x20, 0x8a, 0x9f, 0xbc, 0xfe, 0xd0, 0xd3, 0x72, 0xc0, 0xd0, 0xc4, 0xbf, 0xca, 0x01, 0x83, 0xa7, 0xb0, 0xe5, 0x40, 0xca, 0xf2, 0x89, 0xaf, 0x7e, 0xca, 0xc2, 0xaf, 0x23, 0xef, 0xbd, 0x0c, 0xf5, 0x43, 0xa8, 0xec, 0x65, 0xa8, 0x1f, 0x8a, 0xf6, 0xf1, 0x87, 0xd6, 0x23, 0x0b, 0x00, 0x8f, 0xd4, 0x84, 0xc7, 0xd6, 0x23, 0x00, 0xbc, 0x07, 0x13, 0x1e, 0x31, 0x39, 0xe9, 0xd1, 0x63, 0xfc, 0x13, 0xb7, 0x80, 0xaf, 0x57, 0x09, 0x3e, 0x2d, 0xa7, 0xe5, 0xb4, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xe2, 0xdf, 0x4f, 0xa8, 0x65, 0xa5, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd4, 0x46, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xf8, 0xf1, 0x6b, 0x70, 0xee, 0x4a, 0x55, 0x3f, 0x72, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7e, 0xbe, 0x4c, 0xd3, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1d, 0x1f, 0xfb, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x4b, 0x3e, 0xc3, 0xd5, 0x3f, 0x65, 0x24, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xf8, 0xf9, 0xbd, 0x15, 0xd3, 0x5f, 0x9c, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfe, 0xf9, 0xc2, 0x3f, 0xdf, 0x55, 0x3e, 0x10, 0xfd, 0x3e, 0xc6, 0xfc, 0xef, 0x6b, 0x72, 0x4a, 0x0c, 0x4e, 0xfc, 0xef, 0x6e, 0x84, 0x26, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x62, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x6a, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0x92, 0x75, 0x6e, 0xd2, 0x7f, 0x14, 0x1e, 0xb3, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x08, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x51, 0xfb, 0x0b, 0x58, 0xd0, 0x9a, 0xf1, 0x93, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x4f, 0xf2, 0xaf, 0x10, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x61, 0xd9, 0xa2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd1, 0xff, 0x89, 0x6f, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x54, 0x7f, 0xd1, 0x1a, 0xa5, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x58, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x87, 0xf5, 0x9b, 0xaa, 0x7f, 0x96, 0x1c, 0x1f, 0x61, 0x7c, 0x92, 0x82, 0x1f, 0xd7, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0xc4, 0x95, 0x60, 0xb2, 0x4f, 0x12, 0xff, 0x51, 0x18, 0x89, 0x3f, 0x3f, 0x08, 0x09, 0x74, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xe1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x46, 0xed, 0xaf, 0xe5, 0x96, 0xd8, 0x67, 0x34, 0x16, 0x79, 0xbe, 0xa4, 0x7c, 0x5e, 0x0c, 0x6e, 0xe2, 0xcf, 0x04, 0xff, 0xf9, 0x43, 0x12, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xa8, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x11, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0xc5, 0x13, 0x64, 0x1a, 0xfd, 0xf0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x89, 0x51, 0x66, 0xc8, 0x41, 0x31, 0x01, 0xad, 0x64, 0xff, 0x8c, 0x26, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe3, 0x3f, 0x12, 0xc3, 0xa6, 0x67, 0xc8, 0xf1, 0x39, 0x20, 0x62, 0x1f, 0x9a, 0xf0, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xa3, 0xb6, 0x33, 0xc9, 0x9f, 0x12, 0xff, 0xd1, 0x18, 0x36, 0xf9, 0x72, 0x28, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xff, 0x0d, 0xdd, 0x04, 0x8f, 0xca, 0x4e, 0xd3, 0x72, 0x40, 0x42, 0xfc, 0xd3, 0x84, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0x25, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x96, 0xd3, 0x72, 0x5a, 0x4e, 0x4b, 0x78, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4f, 0x3d, 0x16, 0x49, 0xd9, 0x3f, 0x10, 0xe2, 0xff, 0x84, 0xd2, 0x6f, 0x63, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf4, 0xee, 0x4a, 0x12, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x64, 0x06, 0x23, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x48, 0xd2, 0x21, 0x3b, 0xee, 0x1c, 0x22, 0x72, 0x1c, 0x61, 0xc5, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xf9, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x69, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xb0, 0x8f, 0xc5, 0xf4, 0x46, 0xc2, 0xc7, 0x3c, 0x31, 0xfa, 0x24, 0x1d, 0x3f, 0x8d, 0x3f, 0x2b, 0x25, 0x36, 0x4c, 0xf0, 0x94, 0xe3, 0x99, 0xc4, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0xa9, 0x3f, 0x4f, 0x0c, 0xc9, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6e, 0x4d, 0xf6, 0xf1, 0x8f, 0xd7, 0x12, 0xf0, 0x93, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x22, 0x70, 0x92, 0xb4, 0x7e, 0x42, 0x7e, 0x20, 0xe4, 0x18, 0xf9, 0x22, 0xf9, 0x21, 0xc9, 0xbf, 0xac, 0xf0, 0x4f, 0x03, 0xe3, 0xf4, 0x13, 0x72, 0x65, 0x74, 0xeb, 0x67, 0xa2, 0xcf, 0x22, 0x31, 0x9a, 0xa6, 0x3f, 0x92, 0x60, 0x3f, 0x92, 0xc0, 0x5f, 0xc8, 0x7e, 0x26, 0xfd, 0x45, 0x74, 0x94, 0x64, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x52, 0xfc, 0x47, 0xf5, 0x9b, 0xa4, 0xbf, 0xe3, 0xec, 0x47, 0x8e, 0xd1, 0xbf, 0xcf, 0x63, 0x02, 0x3e, 0x4d, 0xb2, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xcd, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x4c, 0x0c, 0x9b, 0x8e, 0xdf, 0x43, 0xfe, 0x97, 0x60, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x48, 0x9e, 0x88, 0xf2, 0xce, 0xac, 0xe4, 0xf8, 0x8d, 0xe6, 0x00, 0x9a, 0xf0, 0xf3, 0xf0, 0x24, 0xfb, 0x86, 0x72, 0x54, 0x12, 0x7e, 0xc4, 0x8f, 0xac, 0x94, 0x1c, 0x17, 0x3d, 0x23, 0x25, 0x86, 0x18, 0x4a, 0xca, 0xdd, 0x46, 0xfa, 0x24, 0x1c, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xcb, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xe9, 0x39, 0xc0, 0x4a, 0x89, 0x61, 0x6a, 0xa5, 0xe3, 0xb3, 0xa4, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xf9, 0xf1, 0x18, 0x1c, 0x3f, 0x27, 0xed, 0x2f, 0x48, 0xf2, 0xfe, 0x2b, 0x1a, 0xc3, 0xf4, 0x38, 0xb8, 0x95, 0x0c, 0x37, 0xc5, 0x7f, 0x74, 0xff, 0x46, 0x52, 0xe8, 0x27, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x2d, 0xfe, 0x59, 0x42, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd7, 0xef, 0xf3, 0x85, 0x97, 0x2d, 0x7a, 0xc7, 0x74, 0x7d, 0xfb, 0x3b, 0xa6, 0xeb, 0x24, 0xbc, 0x9c, 0xb0, 0x3f, 0x32, 0x5d, 0xc3, 0x87, 0xa6, 0xeb, 0x44, 0xbc, 0x8c, 0xfd, 0x3f, 0xb3, 0xef, 0xd7, 0xdf, 0x8f, 0x5e, 0x68, 0xdf, 0x47, 0x1f, 0x44, 0xaf, 0x53, 0xfb, 0x9e, 0x14, 0xfb, 0xe2, 0x15, 0xb7, 0x2f, 0x5e, 0xa7, 0xf6, 0x3d, 0xb5, 0xef, 0xc7, 0xbd, 0x1c, 0x19, 0xcc, 0x3b, 0xb8, 0x73, 0x64, 0x30, 0xaf, 0x77, 0x22, 0xec, 0x7b, 0x64, 0x30, 0xef, 0xb7, 0x1e, 0x1c, 0x19, 0xcc, 0xfb, 0xe1, 0x83, 0x93, 0x20, 0xef, 0xd7, 0xfe, 0x30, 0x6e, 0xe0, 0xfb, 0x0f, 0xfe, 0xf1, 0x9f, 0xe2, 0x06, 0xbe, 0x7f, 0x22, 0xe4, 0xfd, 0xab, 0x6f, 0x9a, 0xe2, 0xf7, 0xbf, 0xff, 0xe7, 0xc4, 0xe6, 0xe7, 0xc1, 0x1d, 0xfe, 0x27, 0xcb, 0x9d, 0x23, 0x5e, 0x20, 0x58, 0xf9, 0x9f, 0x2c, 0xdf, 0x11, 0xa3, 0x27, 0x22, 0x3f, 0xbf, 0xf7, 0x3e, 0xff, 0x93, 0xe5, 0xfd, 0xa3, 0xa3, 0xbb, 0xf7, 0x8e, 0x8e, 0x1e, 0xfd, 0xf3, 0x07, 0xfc, 0x4f, 0x96, 0x0f, 0x8e, 0x8e, 0xfe, 0xfa, 0x6f, 0x4e, 0x86, 0xbc, 0x47, 0xb1, 0xf2, 0xc7, 0xdf, 0x38, 0x32, 0x94, 0x7f, 0xf9, 0xfe, 0x09, 0x91, 0xf7, 0xdd, 0x5f, 0x0d, 0xc9, 0xf5, 0x95, 0xdf, 0xff, 0xdd, 0xdf, 0xfb, 0x83, 0xaf, 0x1e, 0xfd, 0xda, 0xaf, 0x87, 0x46, 0xff, 0xf6, 0xef, 0xbe, 0xfb, 0xbd, 0xbf, 0xff, 0x87, 0x13, 0x21, 0xef, 0x6f, 0xfe, 0x56, 0x48, 0xb2, 0x3f, 0xfb, 0xf3, 0x3f, 0xf9, 0xd3, 0xbf, 0xf8, 0xcb, 0xa3, 0xdf, 0xfe, 0x9d, 0xd0, 0xe8, 0xbf, 0xff, 0xc7, 0xbf, 0xfe, 0xdb, 0x7f, 0xfe, 0xd7, 0xc8, 0x1d, 0xcb, 0xfa, 0x24, 0xbf, 0x5e, 0x1e, 0xc1, 0xeb, 0x27, 0xf9, 0xc5, 0xef, 0xad, 0x27, 0xb9, 0xf8, 0xff, 0x8e, 0x65, 0x9d, 0xc1, 0xeb, 0x79, 0xb8, 0x5e, 0x80, 0x8b, 0x9c, 0x21, 0x23, 0x56, 0xf8, 0x22, 0x91, 0x4b, 0xa7, 0x70, 0x06, 0x48, 0xfc, 0x92, 0xf5, 0x92, 0xf5, 0xd2, 0x73, 0x2f, 0x3d, 0xf7, 0x64, 0x6b, 0x46, 0xaf, 0xe7, 0x3f, 0xe9, 0xbd, 0x62, 0xad, 0x5f, 0xaa, 0x2e, 0x55, 0x2b, 0x99, 0xb7, 0x33, 0x23, 0xf3, 0x2b, 0x0b, 0x55, 0xbb, 0x92, 0x19, 0x81, 0xdb, 0x91, 0x37, 0x2e, 0xda, 0x58, 0x2a, 0xd3, 0x67, 0x0b, 0xd0, 0xbb, 0xa0, 0x7a, 0x25, 0xec, 0xad, 0xad, 0xaf, 0x2e, 0x2e, 0x5f, 0xb4, 0x2b, 0x33, 0xd8, 0x59, 0xbe, 0xba, 0xf4, 0x46, 0x75, 0x15, 0x40, 0xd3, 0xd8, 0xfb, 0x4c, 0xf5, 0xe7, 0xaf, 0xad, 0xac, 0x2e, 0x54, 0xca, 0xd8, 0x99, 0xbb, 0xb2, 0xc8, 0xb1, 0x38, 0x89, 0xf9, 0x95, 0xa5, 0xa5, 0xea, 0xf2, 0x7a, 0x65, 0x9a, 0x63, 0xad, 0x2d, 0x5e, 0x5c, 0xe6, 0x04, 0xf9, 0xc4, 0xb5, 0xea, 0xe5, 0xea, 0xfc, 0xba, 0x2d, 0x61, 0xf3, 0x57, 0x57, 0xd7, 0x56, 0x80, 0xa2, 0x58, 0xeb, 0xd2, 0xdc, 0xc2, 0xca, 0x35, 0xbb, 0xd2, 0x73, 0xf7, 0x1c, 0x4e, 0xf3, 0xf2, 0xfa, 0xc6, 0x85, 0x15, 0xa0, 0xd3, 0xa8, 0xb5, 0xba, 0x7c, 0x64, 0x69, 0x6e, 0x7d, 0xfe, 0xd2, 0xc6, 0x42, 0xf5, 0xf2, 0xe2, 0xd2, 0xe2, 0x7a, 0x75, 0x75, 0x4d, 0x4d, 0xbd, 0x59, 0xc8, 0x64, 0x46, 0x2e, 0xce, 0x2d, 0x55, 0xaf, 0xcc, 0x2d, 0x48, 0xa1, 0xd6, 0x57, 0xae, 0xce, 0x5f, 0x82, 0x7b, 0xde, 0x01, 0x52, 0x57, 0x2e, 0xcd, 0x55, 0xa6, 0x5f, 0x9f, 0x42, 0x2a, 0x37, 0x05, 0xc6, 0xcd, 0x4c, 0x66, 0xfe, 0x52, 0x75, 0xfe, 0x33, 0x1b, 0xcb, 0xd5, 0x6b, 0x1b, 0x6f, 0x02, 0xb5, 0xc5, 0x95, 0x65, 0x4e, 0x30, 0xb3, 0xbc, 0xb2, 0xb1, 0xb6, 0x72, 0x75, 0x79, 0x41, 0x2c, 0x9c, 0xb9, 0xb8, 0x78, 0x61, 0xe3, 0x72, 0x75, 0xf9, 0xe2, 0xfa, 0xa5, 0x4a, 0x69, 0xca, 0x9e, 0x98, 0xb0, 0x9b, 0x6d, 0xbb, 0xeb, 0xd4, 0x3b, 0xed, 0xad, 0x6e, 0x66, 0x6d, 0xe5, 0xc2, 0xfa, 0xb5, 0xb9, 0xd5, 0xea, 0xc6, 0x6a, 0x75, 0x79, 0xa1, 0x8a, 0xba, 0x92, 0x48, 0xf3, 0xab, 0xeb, 0x1b, 0x4b, 0x2b, 0xcb, 0x8b, 0xeb, 0x2b, 0xab, 0x1a, 0x99, 0xb5, 0xf9, 0xb9, 0xcb, 0xd5, 0x4a, 0x39, 0x73, 0x75, 0x51, 0xde, 0xce, 0x64, 0x32, 0x13, 0xc9, 0x25, 0xd3, 0xd8, 0x6b, 0xd7, 0x7b, 0xcd, 0x4e, 0xdb, 0x5e, 0x5f, 0x9c, 0xcf, 0xe5, 0x33, 0x23, 0xf5, 0x56, 0x17, 0x9b, 0x56, 0xa7, 0x5e, 0x6b, 0xd9, 0xad, 0xda, 0xa6, 0xd3, 0xaa, 0x64, 0xd7, 0x77, 0x9a, 0x5d, 0x1b, 0xfe, 0xba, 0x07, 0xdd, 0x9e, 0x73, 0xdd, 0x06, 0xbe, 0x1a, 0xcd, 0xed, 0x3d, 0xb7, 0xc6, 0xf1, 0xea, 0x35, 0xb7, 0xe7, 0x36, 0xb7, 0xb6, 0x9d, 0xac, 0xc2, 0xea, 0x36, 0xdf, 0x72, 0x2a, 0xbb, 0x6e, 0xb3, 0xdd, 0xcb, 0x71, 0x02, 0x85, 0xa9, 0xc2, 0xc4, 0x39, 0xa0, 0xa9, 0x0f, 0xe5, 0x4a, 0x33, 0x53, 0x13, 0x38, 0x31, 0x3f, 0x39, 0x59, 0x2a, 0xe4, 0xa6, 0xcb, 0xe7, 0x60, 0x0a, 0xdc, 0xe6, 0x33, 0x4e, 0x7b, 0x2b, 0xc3, 0x65, 0x43, 0x63, 0x55, 0x57, 0xb9, 0x2f, 0x81, 0xee, 0xd6, 0xab, 0x9f, 0xad, 0x7c, 0xee, 0x73, 0xa0, 0xdb, 0xd7, 0x6e, 0x38, 0x6e, 0x17, 0x17, 0x9e, 0x9e, 0x9e, 0x82, 0x6e, 0xad, 0x07, 0xab, 0x6f, 0xee, 0xf5, 0x1c, 0xfb, 0x86, 0x53, 0x2f, 0xdb, 0xdb, 0xbb, 0x7b, 0x1b, 0x6f, 0x3a, 0x6e, 0xcf, 0xd9, 0x3f, 0x1f, 0x05, 0x96, 0x38, 0x70, 0xdd, 0xd9, 0x9f, 0xef, 0x74, 0xdc, 0xad, 0x18, 0x78, 0x86, 0x83, 0xe7, 0x3b, 0xad, 0x8e, 0x8b, 0xb0, 0xbd, 0x76, 0xb3, 0xd1, 0x71, 0xaf, 0xdb, 0xd7, 0x6b, 0x3d, 0x01, 0x59, 0xea, 0x6c, 0x39, 0xad, 0x37, 0x9b, 0x4e, 0xff, 0x8a, 0xdb, 0xf9, 0x05, 0x87, 0xeb, 0x6c, 0xa9, 0x06, 0xf8, 0x7c, 0xa1, 0x1b, 0x35, 0xf7, 0xa0, 0xd9, 0xde, 0x16, 0x74, 0xea, 0x8a, 0x86, 0x36, 0x5a, 0xb2, 0x7b, 0xda, 0xc2, 0x37, 0x3a, 0xcd, 0x2d, 0xa0, 0xdc, 0x6c, 0xe7, 0xf0, 0x2e, 0xaf, 0x7c, 0x88, 0x23, 0xda, 0x95, 0x30, 0x23, 0x23, 0x0a, 0x11, 0x00, 0x48, 0x28, 0xa7, 0x4b, 0x91, 0xe7, 0x33, 0xb6, 0x5b, 0x1b, 0x57, 0x3a, 0xdd, 0x26, 0x37, 0x47, 0x25, 0x9d, 0x59, 0x7b, 0x8c, 0xf3, 0x98, 0x0b, 0xf4, 0x54, 0xb0, 0xa7, 0x8b, 0x53, 0x9c, 0xce, 0xcd, 0xcc, 0xc8, 0xe7, 0x3f, 0x0f, 0x9e, 0x7b, 0x65, 0xf1, 0xb3, 0xd5, 0xcb, 0x46, 0x65, 0x4f, 0x4e, 0xee, 0xba, 0x4e, 0xbd, 0xc9, 0x47, 0x76, 0x9a, 0xdb, 0x3b, 0xbb, 0x76, 0xa3, 0xd5, 0xa9, 0xf5, 0x52, 0x65, 0x55, 0x8a, 0xec, 0xd6, 0xae, 0xef, 0xb6, 0x1c, 0xb7, 0xb4, 0x60, 0x77, 0x3b, 0x7b, 0x6e, 0xdd, 0xd1, 0x61, 0x9c, 0x8a, 0xdd, 0x73, 0xb7, 0x37, 0xf6, 0xcd, 0xc3, 0x07, 0xe6, 0xe1, 0xbe, 0x79, 0x78, 0x27, 0x3e, 0xdc, 0xad, 0xbb, 0xa6, 0xd9, 0x38, 0x0c, 0xb3, 0xb9, 0x68, 0x76, 0xf5, 0xfa, 0x5e, 0xab, 0xd6, 0x73, 0xb6, 0x20, 0xfa, 0x76, 0xf7, 0x7a, 0xb6, 0xeb, 0x74, 0x3b, 0xad, 0x3d, 0x54, 0x5d, 0x11, 0xe5, 0x43, 0xb9, 0x60, 0xa8, 0xc2, 0x6d, 0x50, 0x3a, 0x7b, 0xae, 0x38, 0x55, 0x98, 0x9e, 0x99, 0xe1, 0xaa, 0x13, 0xe8, 0x97, 0x6a, 0xee, 0x56, 0xdb, 0xe9, 0x76, 0xed, 0x4e, 0x03, 0xe8, 0xd6, 0xda, 0xad, 0x66, 0xdb, 0x29, 0x0a, 0x90, 0x3d, 0xf1, 0x7a, 0x71, 0x0a, 0x4c, 0xd3, 0xed, 0x34, 0x7a, 0x62, 0x64, 0x62, 0xfa, 0x1c, 0x1f, 0xb9, 0xee, 0x6c, 0x35, 0xf7, 0xae, 0xc3, 0x98, 0xe0, 0x67, 0x07, 0x68, 0xac, 0x01, 0x6e, 0x05, 0x11, 0x4c, 0x84, 0x77, 0x9b, 0xfb, 0x4e, 0xab, 0xcb, 0xf3, 0x43, 0x78, 0x89, 0x89, 0x52, 0x74, 0x85, 0x19, 0x3e, 0x80, 0x14, 0x43, 0xe4, 0xaf, 0x34, 0xf7, 0x2b, 0x13, 0xe5, 0x80, 0xfa, 0x42, 0xb3, 0xbb, 0xdb, 0xaa, 0x1d, 0xd8, 0xfd, 0x9a, 0xbb, 0x2b, 0x69, 0x4d, 0x71, 0xcc, 0x76, 0xa7, 0xed, 0x88, 0x3e, 0x38, 0xc8, 0xa4, 0x10, 0xc0, 0xd9, 0xef, 0xb9, 0xce, 0x75, 0x47, 0xe9, 0x03, 0x71, 0x84, 0x42, 0x70, 0xca, 0xb9, 0x19, 0xd4, 0x09, 0xdc, 0xcc, 0xbc, 0x8e, 0x6a, 0xb1, 0xe5, 0x02, 0x73, 0xd7, 0x3b, 0x7b, 0xed, 0x1e, 0xd7, 0xca, 0x4e, 0x6d, 0xab, 0xd3, 0x07, 0xc7, 0xef, 0x7e, 0xb1, 0xe8, 0xf3, 0x84, 0xbd, 0x85, 0x9a, 0xfb, 0xc5, 0xca, 0x54, 0xf1, 0xec, 0xf9, 0xd0, 0xe8, 0x65, 0xf0, 0xb0, 0x5e, 0x65, 0x1a, 0x87, 0x39, 0xa5, 0x89, 0x67, 0x54, 0x24, 0x5f, 0xdd, 0xd5, 0x8b, 0x6f, 0xd8, 0xbd, 0x8e, 0x7d, 0x19, 0x94, 0x58, 0x73, 0xa5, 0xe8, 0x73, 0xdd, 0xee, 0x1e, 0xba, 0xf1, 0x5e, 0x17, 0xff, 0x15, 0x53, 0x0e, 0x76, 0xc1, 0x27, 0xc0, 0xa5, 0x7b, 0x7b, 0x60, 0x7f, 0xbb, 0x87, 0xc9, 0xb0, 0xbb, 0xd3, 0xd9, 0x6b, 0x6d, 0x81, 0x8a, 0x7a, 0xf6, 0xa6, 0x63, 0xb7, 0x1d, 0x67, 0xcb, 0xd9, 0x0a, 0x44, 0x5a, 0xef, 0x08, 0x9a, 0xd3, 0x39, 0xd1, 0xaf, 0xe7, 0xdf, 0x76, 0x1d, 0xc0, 0x6e, 0xe7, 0xea, 0xb3, 0x20, 0xe6, 0xd4, 0xcc, 0xd4, 0xcc, 0xd9, 0xfc, 0xa7, 0xeb, 0x93, 0xd3, 0xa5, 0xe2, 0xcf, 0x96, 0x7e, 0x6e, 0xb7, 0xd3, 0xcf, 0xe5, 0xea, 0xe3, 0x30, 0x7e, 0xf6, 0x6c, 0x7e, 0x72, 0x1a, 0x9b, 0x42, 0xa9, 0x38, 0x93, 0x3f, 0x7f, 0x53, 0xa8, 0xb9, 0xec, 0xd3, 0xcb, 0xf1, 0x9e, 0x4f, 0x8d, 0x67, 0xbc, 0x5c, 0xb0, 0x58, 0xbd, 0xe8, 0xe6, 0x0b, 0x7a, 0x77, 0x3b, 0xdc, 0xdd, 0xcc, 0x23, 0x4d, 0x21, 0xa7, 0x18, 0x45, 0xf1, 0x51, 0xc6, 0x67, 0x2b, 0xfc, 0x9a, 0xbb, 0xbd, 0x69, 0x12, 0x1d, 0x24, 0x9c, 0x2a, 0x4f, 0x97, 0xa7, 0x5e, 0xff, 0x74, 0x7d, 0x4c, 0x88, 0xce, 0x85, 0x1d, 0x43, 0x05, 0xd4, 0x0b, 0x53, 0xc5, 0x99, 0xe9, 0x73, 0xe7, 0xce, 0xe5, 0x27, 0x84, 0x22, 0x74, 0xe9, 0x91, 0x60, 0x82, 0xec, 0x62, 0x2d, 0x29, 0xb9, 0xea, 0x6c, 0xeb, 0x1d, 0x5d, 0xea, 0x65, 0x90, 0xd9, 0xe9, 0xf6, 0x6c, 0x47, 0x45, 0xba, 0x48, 0x4a, 0xf6, 0x76, 0xf3, 0x86, 0xd3, 0x16, 0x29, 0x01, 0x25, 0xdf, 0xed, 0xc0, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xd6, 0xe6, 0x1a, 0x70, 0x5a, 0xe0, 0xc3, 0x8d, 0xae, 0xd3, 0x53, 0xda, 0x6a, 0x75, 0x3b, 0xf6, 0x5b, 0x8e, 0xdb, 0xf9, 0x19, 0x8c, 0x4c, 0x8c, 0x79, 0xd7, 0x71, 0x54, 0xae, 0x28, 0xdb, 0x17, 0x9c, 0x5e, 0x7d, 0x27, 0xc7, 0xc3, 0x04, 0x28, 0x15, 0xf8, 0x0d, 0x4c, 0xcb, 0xf3, 0x4c, 0x0f, 0x23, 0x15, 0xd4, 0x50, 0xc7, 0xcd, 0xc1, 0xed, 0x18, 0x30, 0x35, 0x8e, 0xb0, 0x71, 0x1e, 0x4b, 0x10, 0x08, 0xa0, 0x8d, 0xb3, 0xf9, 0xfc, 0x24, 0x8c, 0xf3, 0x04, 0x2f, 0x65, 0xf6, 0xfd, 0x60, 0xba, 0x58, 0x82, 0x44, 0x2e, 0xad, 0x52, 0x5a, 0xc8, 0x89, 0x8c, 0x5a, 0x00, 0x52, 0xc5, 0xfd, 0x83, 0x02, 0xcf, 0x2d, 0xf9, 0x22, 0xc8, 0x1f, 0x48, 0x0e, 0x51, 0xde, 0xab, 0xb5, 0xeb, 0x0e, 0x66, 0x0e, 0x5f, 0x7a, 0x99, 0x4c, 0xc0, 0x09, 0xda, 0x52, 0x31, 0x5c, 0x4c, 0x3f, 0xdd, 0x21, 0x92, 0x2f, 0x41, 0xfe, 0x6d, 0x64, 0x5a, 0x72, 0x7b, 0x5e, 0x72, 0x34, 0x91, 0x43, 0xfe, 0x27, 0x7c, 0x49, 0xf2, 0xf9, 0x09, 0x25, 0x42, 0x5e, 0x98, 0x70, 0x64, 0x44, 0xe6, 0x90, 0x05, 0xfb, 0x62, 0x6d, 0xaf, 0xdb, 0x6d, 0xd6, 0xda, 0x81, 0xaf, 0xe0, 0x88, 0x74, 0x14, 0xd4, 0x91, 0xca, 0xc9, 0xb5, 0x96, 0xe3, 0xdb, 0xd9, 0xd9, 0xdf, 0x2d, 0xe5, 0xf8, 0xd0, 0x18, 0xae, 0x8d, 0x6b, 0xf8, 0x42, 0x95, 0x27, 0x7a, 0xb5, 0x5d, 0x9f, 0xac, 0xdd, 0x68, 0xb6, 0x7a, 0x8e, 0x6b, 0xd7, 0x5a, 0x1d, 0xb0, 0xe1, 0x4e, 0xc7, 0x7d, 0xcb, 0x56, 0xf9, 0x91, 0x1b, 0xe4, 0x12, 0x8c, 0x94, 0x03, 0x83, 0x88, 0xc5, 0x7c, 0x8b, 0xf0, 0x29, 0x9b, 0x15, 0x61, 0x35, 0x65, 0xb0, 0xdc, 0x04, 0x78, 0x68, 0x01, 0xe7, 0x88, 0x07, 0xad, 0xf0, 0xc1, 0xe8, 0x24, 0xcc, 0x97, 0xd1, 0x49, 0x5b, 0xb1, 0x49, 0x61, 0x4a, 0x62, 0xf5, 0xad, 0x6e, 0xaf, 0xc2, 0x95, 0x8c, 0x62, 0x15, 0xf9, 0xb3, 0x0f, 0xe5, 0x9a, 0xef, 0xb4, 0xe1, 0xb9, 0x0b, 0x60, 0x65, 0x34, 0xb0, 0x50, 0xdf, 0xc1, 0x6c, 0x58, 0x0c, 0x70, 0xb9, 0x4e, 0x2a, 0x32, 0xa3, 0x6b, 0x34, 0xfb, 0x9b, 0x15, 0xae, 0x56, 0xa0, 0xcd, 0xb9, 0x17, 0xea, 0xd4, 0x27, 0xd4, 0xfd, 0x09, 0x98, 0x74, 0x0c, 0x13, 0xb6, 0x82, 0x09, 0x11, 0x0a, 0xc0, 0xdc, 0xaa, 0xb0, 0x8b, 0x50, 0xb6, 0x1f, 0x42, 0x45, 0xcd, 0x4d, 0x73, 0x9b, 0x63, 0xfd, 0xcd, 0xf1, 0xfa, 0x58, 0xbf, 0x3e, 0xbe, 0x35, 0xd6, 0xdf, 0xca, 0x4f, 0xe6, 0xa0, 0x0b, 0x1d, 0xb8, 0xf5, 0x4d, 0x77, 0xf6, 0xa9, 0x4d, 0x77, 0x36, 0xdd, 0x74, 0xb5, 0x98, 0xe9, 0x4a, 0x71, 0xab, 0xfc, 0xe8, 0xec, 0xcb, 0x27, 0x39, 0xb1, 0x49, 0xa5, 0x1f, 0x95, 0x13, 0xd4, 0x02, 0x27, 0x28, 0x19, 0x6d, 0xfc, 0xc3, 0xf4, 0x12, 0x39, 0xc1, 0x09, 0x26, 0x94, 0x3e, 0x8a, 0x1b, 0xd5, 0xc6, 0xfa, 0xb5, 0xf1, 0xb0, 0x2f, 0x8d, 0x3b, 0x63, 0x7d, 0x07, 0x1d, 0xaa, 0x36, 0xae, 0x7c, 0x6a, 0x1c, 0x06, 0x7c, 0xb7, 0x92, 0x54, 0xd5, 0xde, 0x48, 0x53, 0x98, 0xe0, 0x09, 0xf7, 0x56, 0x89, 0x7e, 0x64, 0x32, 0xc7, 0x81, 0x9e, 0x7f, 0x7d, 0x71, 0x00, 0xa5, 0xa0, 0xb6, 0x6a, 0xc1, 0xe2, 0x73, 0xad, 0x16, 0xec, 0x6e, 0xfc, 0x54, 0xba, 0x03, 0x8f, 0x03, 0xee, 0xc6, 0x3c, 0xc3, 0x3a, 0x8d, 0x06, 0xec, 0xc3, 0x45, 0xca, 0xf5, 0xfd, 0x7a, 0xdd, 0x6d, 0x6a, 0xf9, 0x55, 0xf3, 0x65, 0x91, 0xab, 0x90, 0xc7, 0x09, 0xb5, 0x3b, 0x57, 0x1e, 0x2c, 0x62, 0x01, 0x41, 0xe8, 0x97, 0x21, 0xbf, 0x0d, 0xb0, 0xfc, 0x3d, 0x7d, 0xe0, 0x0f, 0x5c, 0xf4, 0x30, 0x45, 0xdf, 0x15, 0x7c, 0x58, 0x40, 0xd2, 0xf7, 0x82, 0x00, 0xe6, 0xe3, 0x49, 0x75, 0x84, 0xed, 0x13, 0x7a, 0xd4, 0x74, 0x5c, 0xfe, 0xe4, 0xd4, 0x76, 0xc2, 0x80, 0x8f, 0xcf, 0x51, 0x78, 0xbb, 0x13, 0xa3, 0xf8, 0xac, 0x84, 0x78, 0xdf, 0xdd, 0xa9, 0xf9, 0x8f, 0x9b, 0x6b, 0xb0, 0x9b, 0x8c, 0xa8, 0x43, 0x3d, 0x72, 0xc0, 0x7f, 0x90, 0xed, 0xf3, 0x78, 0x02, 0x20, 0xc7, 0xc7, 0xfc, 0x8d, 0xe7, 0x38, 0xb2, 0x57, 0x3c, 0x18, 0xe3, 0xff, 0xe6, 0xc7, 0xf8, 0x46, 0x76, 0xbf, 0xe0, 0x03, 0xf6, 0x39, 0x60, 0x5f, 0x02, 0x0e, 0x42, 0x22, 0x20, 0x1d, 0x78, 0x56, 0x8d, 0xe3, 0xde, 0x53, 0xf1, 0xbf, 0x16, 0xde, 0xa5, 0x72, 0xdd, 0x2e, 0x41, 0x27, 0xce, 0x5a, 0x71, 0x7f, 0xbc, 0x22, 0x96, 0xe6, 0xfb, 0x69, 0x65, 0x08, 0xc4, 0xac, 0xf0, 0xfd, 0x89, 0xda, 0xdb, 0x16, 0x62, 0x37, 0x82, 0x0b, 0x4e, 0xa3, 0xd2, 0x70, 0x6b, 0xf5, 0x9e, 0x60, 0x75, 0xf2, 0x9c, 0xd2, 0x71, 0xb3, 0x21, 0x46, 0x60, 0xd7, 0x54, 0x2e, 0x97, 0xf3, 0x9c, 0x1b, 0xb7, 0xe2, 0x6f, 0x8b, 0xf9, 0x1c, 0x78, 0x78, 0xc3, 0x03, 0x3d, 0x98, 0x88, 0xdb, 0x27, 0x3e, 0x71, 0xdb, 0x34, 0x91, 0x43, 0x36, 0x23, 0x10, 0xa9, 0x07, 0x1c, 0x3c, 0x7f, 0x93, 0x6b, 0x37, 0xf4, 0x7a, 0x9a, 0xb7, 0xb9, 0xac, 0xc1, 0x6b, 0x09, 0xec, 0xdb, 0xa6, 0x64, 0x08, 0xfb, 0x1b, 0xf7, 0x30, 0x45, 0xae, 0x25, 0x48, 0x59, 0x6e, 0xaf, 0x02, 0xef, 0xa5, 0x17, 0xdc, 0xda, 0x36, 0x7f, 0x15, 0x84, 0x8d, 0x89, 0xd8, 0x1a, 0xf0, 0xb7, 0xbc, 0x82, 0x78, 0xab, 0x13, 0xa2, 0xf2, 0xc9, 0xc5, 0x83, 0x0a, 0x7f, 0x19, 0x9b, 0x90, 0x3d, 0xbe, 0xe7, 0x1f, 0x51, 0x2a, 0xaf, 0x70, 0xdf, 0xe0, 0xa0, 0x49, 0x9f, 0x4a, 0x5f, 0x50, 0xd9, 0xc9, 0x8b, 0x57, 0xb0, 0x11, 0x7f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x4f, 0x05, 0xc3, 0x0b, 0xed, 0x35, 0xc6, 0xcd, 0x17, 0xe1, 0xc6, 0x7f, 0x75, 0xf6, 0x71, 0xc4, 0x0b, 0xf6, 0x8c, 0xdc, 0x55, 0xe6, 0xa2, 0xe4, 0xf2, 0x91, 0x37, 0xe5, 0xcc, 0xcd, 0xcc, 0xff, 0x02, 0x43, 0xc1, 0xfc, 0x7e, \ No newline at end of file diff --git a/config.lua b/config.lua index 3e2d35341..e1ba4b069 100644 --- a/config.lua +++ b/config.lua @@ -29,6 +29,7 @@ THEME= CHECK_NEW_VERSION=true NO_SOUND=false GIF_LENGTH=20 -- in seconds +SOFTWARE_RENDERING=false CRT_MONITOR=false GIF_SCALE=3 UI_SCALE=4 diff --git a/src/studio/config.c b/src/studio/config.c index 48e3d84ab..e403f5432 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -193,7 +193,8 @@ static void readConfig(Config* config) readGlobalBool(lua, "CHECK_NEW_VERSION", &config->data.checkNewVersion); readGlobalBool(lua, "NO_SOUND", &config->data.noSound); #if defined(CRT_SHADER_SUPPORT) - readGlobalBool(lua, "CRT_MONITOR", &config->data.crtMonitor); + readGlobalBool(lua, "SOFTWARE_RENDERING", &config->data.soft); + readGlobalBool(lua, "CRT_MONITOR", &config->data.crt); readConfigCrtShader(config, lua); #endif readGlobalInteger(lua, "UI_SCALE", &config->data.uiScale); diff --git a/src/studio/studio.c b/src/studio/studio.c index cb5e06f22..7e7694625 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1533,7 +1533,7 @@ static inline bool keyWasPressedOnce(s32 key) #if defined(CRT_SHADER_SUPPORT) void switchCrtMonitor() { - impl.config->data.crtMonitor = !impl.config->data.crtMonitor; + impl.config->data.crt = !impl.config->data.crt; } #endif @@ -2176,17 +2176,18 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.uiScale = args.scale; #if defined(CRT_SHADER_SUPPORT) - impl.config->data.crtMonitor = args.crt; + impl.config->data.soft |= args.soft; + impl.config->data.crt |= args.crt; #endif - impl.config->data.goFullscreen = args.fullscreen; - impl.config->data.noSound = args.nosound; - impl.config->data.cli = args.cli; + impl.config->data.goFullscreen |= args.fullscreen; + impl.config->data.noSound |= args.nosound; + impl.config->data.cli |= args.cli; - impl.studio.tick = studioTick; - impl.studio.close = studioClose; - impl.studio.exit = exitStudio; - impl.studio.config = getConfig; + impl.studio.tick = studioTick; + impl.studio.close = studioClose; + impl.studio.exit = exitStudio; + impl.studio.config = getConfig; if(args.cli) args.skip = true; diff --git a/src/studio/studio.h b/src/studio/studio.h index af21c8e33..670a00780 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -63,7 +63,8 @@ #define PNG_EXT ".png" #if defined(CRT_SHADER_SUPPORT) -# define CRT_CMD_PARAM(macro) \ +# define CRT_CMD_PARAM(macro) \ + macro(soft, bool, BOOLEAN, "", "use software rendering") \ macro(crt, bool, BOOLEAN, "", "enable CRT monitor effect") #else # define CRT_CMD_PARAM(macro) diff --git a/src/studio/system.h b/src/studio/system.h index a8767da7f..2cb259e6d 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -108,7 +108,8 @@ typedef struct bool cli; #if defined(CRT_SHADER_SUPPORT) - bool crtMonitor; + bool soft; + bool crt; struct { const char* vertex; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 9a40e84bd..07756e3cd 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -28,15 +28,9 @@ #include #if defined(CRT_SHADER_SUPPORT) - #include -#define STUDIO_PIXEL_FORMAT GPU_FORMAT_RGBA - #else - #include -#define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ABGR8888 - #endif #if defined(__EMSCRIPTEN__) @@ -68,25 +62,21 @@ enum tic_touch_size, }; +typedef union +{ #if defined(CRT_SHADER_SUPPORT) -# define Renderer GPU_Target -# define Texture GPU_Image -# define Rect GPU_Rect -# define destoryTexture GPU_FreeImage -# define destoryRenderer(render) GPU_CloseCurrentRenderer() -# define renderPresent GPU_Flip -# define renderClear GPU_Clear -# define renderCopy(render, tex, src, dst) GPU_BlitScale(tex, &src, render, dst.x, dst.y, dst.w / src.w, dst.h / src.h) -#else -# define Renderer SDL_Renderer -# define Texture SDL_Texture -# define Rect SDL_Rect -# define destoryTexture SDL_DestroyTexture -# define destoryRenderer(render) SDL_DestroyRenderer(render) -# define renderPresent SDL_RenderPresent -# define renderClear SDL_RenderClear -# define renderCopy(render, tex, src, dst) SDL_RenderCopy(render, tex, &src, &dst) + GPU_Target* gpu; #endif + SDL_Renderer* sdl; +} Renderer; + +typedef union +{ +#if defined(CRT_SHADER_SUPPORT) + GPU_Image* gpu; +#endif + SDL_Texture* sdl; +} Texture; static struct { @@ -96,14 +86,14 @@ static struct struct { - Renderer* renderer; - Texture* texture; + Renderer renderer; + Texture texture; #if defined(CRT_SHADER_SUPPORT) u32 shader; GPU_ShaderBlock block; #endif - } gpu; + } screen; struct { @@ -112,7 +102,7 @@ static struct #if defined(TOUCH_INPUT_SUPPORT) struct { - Texture* texture; + Texture texture; void* pixels; tic80_gamepads joystick; @@ -152,8 +142,8 @@ static struct struct { - Texture* up; - Texture* down; + Texture up; + Texture down; void* upPixels; void* downPixels; } texture; @@ -181,10 +171,81 @@ static struct { .gamepad.touch.counter = TOUCH_TIMEOUT, .keyboard.touch.useText = false, -}; +} #endif ; +static void destoryTexture(Texture texture) +{ +#if defined(CRT_SHADER_SUPPORT) + if(!platform.studio->config()->soft) + { + GPU_FreeImage(texture.gpu); + } + else +#endif + { + SDL_DestroyTexture(texture.sdl); + } +} + +static void destoryRenderer(Renderer renderer) +{ +#if defined(CRT_SHADER_SUPPORT) + if(!platform.studio->config()->soft) + { + GPU_CloseCurrentRenderer(); + } + else +#endif + { + SDL_DestroyRenderer(renderer.sdl); + } +} + +static void renderClear(Renderer renderer) +{ +#if defined(CRT_SHADER_SUPPORT) + if(!platform.studio->config()->soft) + { + GPU_Clear(renderer.gpu); + } + else +#endif + { + SDL_RenderClear(renderer.sdl); + } +} + +static void renderPresent(Renderer renderer) +{ +#if defined(CRT_SHADER_SUPPORT) + if(!platform.studio->config()->soft) + { + GPU_Flip(renderer.gpu); + } + else +#endif + { + SDL_RenderPresent(renderer.sdl); + } +} + +static void renderCopy(Renderer render, Texture tex, SDL_Rect src, SDL_Rect dst) +{ +#if defined(CRT_SHADER_SUPPORT) + if(!platform.studio->config()->soft) + { + GPU_Rect gpusrc = {src.x, src.y, src.w, src.h}; + GPU_BlitScale(tex.gpu, &gpusrc, render.gpu, dst.x, dst.y, (float)dst.w / src.w, (float)dst.h / src.h); + } + else +#endif + { + SDL_RenderCopy(render.sdl, tex.sdl, &src, &dst); + } +} + static void initSound() { SDL_AudioSpec want = @@ -233,17 +294,22 @@ static void setWindowIcon() } } -static void updateTextureBytes(Texture* texture, const void* data, s32 width, s32 height) +static void updateTextureBytes(Texture texture, const void* data, s32 width, s32 height) { #if defined(CRT_SHADER_SUPPORT) - GPU_UpdateImageBytes(texture, NULL, (const u8*)data, width * sizeof(u32)); -#else - void* pixels = NULL; - s32 pitch = 0; - SDL_LockTexture(texture, NULL, &pixels, &pitch); - SDL_memcpy(pixels, data, pitch * height); - SDL_UnlockTexture(texture); + if(!platform.studio->config()->soft) + { + GPU_UpdateImageBytes(texture.gpu, NULL, (const u8*)data, width * sizeof(u32)); + } + else #endif + { + void* pixels = NULL; + s32 pitch = 0; + SDL_LockTexture(texture.sdl, NULL, &pixels, &pitch); + SDL_memcpy(pixels, data, pitch * height); + SDL_UnlockTexture(texture.sdl); + } } #if defined(TOUCH_INPUT_SUPPORT) @@ -276,7 +342,7 @@ static void map2ram() memcpy(tic->ram.tiles.data, &platform.studio->config()->cart->bank0.tiles, sizeof tic->ram.tiles * TIC_SPRITE_BANKS); } -static void initTouchKeyboardState(Texture** texture, void** pixels, bool down) +static void initTouchKeyboardState(Texture* texture, void** pixels, bool down) { enum{Cols=KBD_COLS, Rows=KBD_ROWS}; @@ -289,12 +355,18 @@ static void initTouchKeyboardState(Texture** texture, void** pixels, bool down) memcpy(*pixels, tic->screen, TIC80_FULLWIDTH * TIC80_FULLHEIGHT * sizeof(u32)); #if defined(CRT_SHADER_SUPPORT) - *texture = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, STUDIO_PIXEL_FORMAT); - GPU_SetAnchor(*texture, 0, 0); - GPU_SetImageFilter(*texture, GPU_FILTER_NEAREST); -#else - *texture = SDL_CreateTexture(platform.gpu.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); + if(!platform.studio->config()->soft) + { + texture->gpu = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, GPU_FORMAT_RGBA); + GPU_SetAnchor(texture->gpu, 0, 0); + GPU_SetImageFilter(texture->gpu, GPU_FILTER_NEAREST); + } + else #endif + { + texture->sdl = SDL_CreateTexture(platform.screen.renderer.sdl, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); + } + updateTextureBytes(*texture, *pixels, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); } @@ -372,18 +444,25 @@ static void initTouchGamepad() ZEROMEM(tic->ram.tiles); } - if(!platform.gamepad.touch.texture) + if(!platform.gamepad.touch.texture.sdl) { #if defined(CRT_SHADER_SUPPORT) - platform.gamepad.touch.texture = GPU_CreateImage(TEXTURE_SIZE, TEXTURE_SIZE, STUDIO_PIXEL_FORMAT); - GPU_SetAnchor(platform.gamepad.touch.texture, 0, 0); - GPU_SetImageFilter(platform.gamepad.touch.texture, GPU_FILTER_NEAREST); - GPU_SetRGBA(platform.gamepad.touch.texture, 0xff, 0xff, 0xff, platform.studio->config()->theme.gamepad.touch.alpha); -#else - platform.gamepad.touch.texture = SDL_CreateTexture(platform.gpu.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TEXTURE_SIZE, TEXTURE_SIZE); - SDL_SetTextureBlendMode(platform.gamepad.touch.texture, SDL_BLENDMODE_BLEND); - SDL_SetTextureAlphaMod(platform.gamepad.touch.texture, platform.studio->config()->theme.gamepad.touch.alpha); + if(!platform.studio->config()->soft) + { + platform.gamepad.touch.texture.gpu = GPU_CreateImage(TEXTURE_SIZE, TEXTURE_SIZE, GPU_FORMAT_RGBA); + GPU_SetAnchor(platform.gamepad.touch.texture.gpu, 0, 0); + GPU_SetImageFilter(platform.gamepad.touch.texture.gpu, GPU_FILTER_NEAREST); + GPU_SetRGBA(platform.gamepad.touch.texture.gpu, 0xff, 0xff, 0xff, platform.studio->config()->theme.gamepad.touch.alpha); + } + else #endif + { + platform.gamepad.touch.texture.sdl = SDL_CreateTexture(platform.screen.renderer.sdl, SDL_PIXELFORMAT_ABGR8888, + SDL_TEXTUREACCESS_STREAMING, TEXTURE_SIZE, TEXTURE_SIZE); + SDL_SetTextureBlendMode(platform.gamepad.touch.texture.sdl, SDL_BLENDMODE_BLEND); + SDL_SetTextureAlphaMod(platform.gamepad.touch.texture.sdl, platform.studio->config()->theme.gamepad.touch.alpha); + } + updateTextureBytes(platform.gamepad.touch.texture, platform.gamepad.touch.pixels, TEXTURE_SIZE, TEXTURE_SIZE); } @@ -394,29 +473,29 @@ static void initTouchGamepad() static void initGPU() { #if defined(CRT_SHADER_SUPPORT) - + if(!platform.studio->config()->soft) { - s32 w = 0, h = 0; + s32 w, h; SDL_GetWindowSize(platform.window, &w, &h); GPU_SetInitWindow(SDL_GetWindowID(platform.window)); - platform.gpu.renderer = GPU_Init(w, h, GPU_INIT_DISABLE_VSYNC); + platform.screen.renderer.gpu = GPU_Init(w, h, GPU_INIT_DISABLE_VSYNC); GPU_SetWindowResolution(w, h); - GPU_SetVirtualResolution(platform.gpu.renderer, w, h); - } - - platform.gpu.texture = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, STUDIO_PIXEL_FORMAT); - GPU_SetAnchor(platform.gpu.texture, 0, 0); - GPU_SetImageFilter(platform.gpu.texture, GPU_FILTER_NEAREST); - -#else - - platform.gpu.renderer = SDL_CreateRenderer(platform.window, -1, SDL_RENDERER_ACCELERATED); - platform.gpu.texture = SDL_CreateTexture(platform.gpu.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); + GPU_SetVirtualResolution(platform.screen.renderer.gpu, w, h); + platform.screen.texture.gpu = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, GPU_FORMAT_RGBA); + GPU_SetAnchor(platform.screen.texture.gpu, 0, 0); + GPU_SetImageFilter(platform.screen.texture.gpu, GPU_FILTER_NEAREST); + } + else #endif + { + platform.screen.renderer.sdl = SDL_CreateRenderer(platform.window, -1, SDL_RENDERER_SOFTWARE); + platform.screen.texture.sdl = SDL_CreateTexture(platform.screen.renderer.sdl, SDL_PIXELFORMAT_ABGR8888, + SDL_TEXTUREACCESS_STREAMING, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); + } #if defined(TOUCH_INPUT_SUPPORT) initTouchGamepad(); @@ -427,32 +506,35 @@ static void initGPU() static void destroyGPU() { - destoryTexture(platform.gpu.texture); + destoryTexture(platform.screen.texture); #if defined(TOUCH_INPUT_SUPPORT) - if(platform.gamepad.touch.texture) + if(platform.gamepad.touch.texture.sdl) destoryTexture(platform.gamepad.touch.texture); - if(platform.keyboard.touch.texture.up) + if(platform.keyboard.touch.texture.up.sdl) destoryTexture(platform.keyboard.touch.texture.up); - if(platform.keyboard.touch.texture.down) + if(platform.keyboard.touch.texture.down.sdl) destoryTexture(platform.keyboard.touch.texture.down); #endif - destoryRenderer(platform.gpu.renderer); + destoryRenderer(platform.screen.renderer); #if defined(CRT_SHADER_SUPPORT) - if(platform.gpu.shader) + if(!platform.studio->config()->soft) { - GPU_FreeShaderProgram(platform.gpu.shader); - platform.gpu.shader = 0; - } + if(platform.screen.shader) + { + GPU_FreeShaderProgram(platform.screen.shader); + platform.screen.shader = 0; + } - GPU_Quit(); + GPU_Quit(); + } #endif } @@ -983,10 +1065,13 @@ void tic_sys_poll() { #if defined(CRT_SHADER_SUPPORT) - s32 w = 0, h = 0; - SDL_GetWindowSize(platform.window, &w, &h); - GPU_SetWindowResolution(w, h); - GPU_SetVirtualResolution(platform.gpu.renderer, w, h); + if(!platform.studio->config()->soft) + { + s32 w, h; + SDL_GetWindowSize(platform.window, &w, &h); + GPU_SetWindowResolution(w, h); + GPU_SetVirtualResolution(platform.screen.renderer.gpu, w, h); + } #endif #if defined(TOUCH_INPUT_SUPPORT) @@ -1072,10 +1157,10 @@ static void renderKeyboard() SDL_Rect rect; SDL_GetWindowSize(platform.window, &rect.w, &rect.h); - Rect src = {TIC80_OFFSET_LEFT, TIC80_OFFSET_TOP, KBD_COLS*TIC_SPRITESIZE, KBD_ROWS*TIC_SPRITESIZE}; - Rect dst = {0, rect.h - src.h * rect.w / src.w, rect.w, src.h * rect.w / src.w}; + SDL_Rect src = {TIC80_OFFSET_LEFT, TIC80_OFFSET_TOP, KBD_COLS*TIC_SPRITESIZE, KBD_ROWS*TIC_SPRITESIZE}; + SDL_Rect dst = {0, rect.h - src.h * rect.w / src.w, rect.w, src.h * rect.w / src.w}; - renderCopy(platform.gpu.renderer, platform.keyboard.touch.texture.up, src, dst); + renderCopy(platform.screen.renderer, platform.keyboard.touch.texture.up, src, dst); const tic80_input* input = &platform.studio->tic->ram.input; @@ -1091,7 +1176,7 @@ static void renderKeyboard() { if(key == KbdLayout[k]) { - Rect src2 = + SDL_Rect src2 = { (k % Cols) * TIC_SPRITESIZE + TIC80_OFFSET_LEFT, (k / Cols) * TIC_SPRITESIZE + TIC80_OFFSET_TOP, @@ -1099,7 +1184,7 @@ static void renderKeyboard() TIC_SPRITESIZE, }; - Rect dst2 = + SDL_Rect dst2 = { (src2.x - TIC80_OFFSET_LEFT) * rect.w/src.w, (src2.y - TIC80_OFFSET_TOP) * rect.w/src.w + dst.y, @@ -1107,7 +1192,7 @@ static void renderKeyboard() TIC_SPRITESIZE * rect.w/src.w, }; - renderCopy(platform.gpu.renderer, platform.keyboard.touch.texture.down, src2, dst2); + renderCopy(platform.screen.renderer, platform.keyboard.touch.texture.down, src2, dst2); } } } @@ -1143,15 +1228,21 @@ static void renderGamepad() const Tile* tile = Tiles + i; #if defined(CRT_SHADER_SUPPORT) - GPU_Rect src = { (float)i * TIC_SPRITESIZE + Left, (float)(tile->press ? TIC_SPRITESIZE : 0) + TIC80_MARGIN_TOP, (float)TIC_SPRITESIZE, (float)TIC_SPRITESIZE}; - GPU_Rect dest = { (float)tile->x, (float)tile->y, (float)tileSize, (float)tileSize}; + if(!platform.studio->config()->soft) + { + GPU_Rect src = { (float)i * TIC_SPRITESIZE + Left, (float)(tile->press ? TIC_SPRITESIZE : 0) + TIC80_MARGIN_TOP, (float)TIC_SPRITESIZE, (float)TIC_SPRITESIZE}; + GPU_Rect dest = { (float)tile->x, (float)tile->y, (float)tileSize, (float)tileSize}; - GPU_BlitScale(platform.gamepad.touch.texture, &src, platform.gpu.renderer, dest.x, dest.y, - (float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); + GPU_BlitScale(platform.gamepad.touch.texture.gpu, &src, platform.screen.renderer.gpu, dest.x, dest.y, + (float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); + } + else + { + SDL_Rect src = {i * TIC_SPRITESIZE + Left, (tile->press ? TIC_SPRITESIZE : 0) + TIC80_MARGIN_TOP, TIC_SPRITESIZE, TIC_SPRITESIZE}; + SDL_Rect dest = {tile->x, tile->y, tileSize, tileSize}; + SDL_RenderCopy(platform.screen.renderer.sdl, platform.gamepad.touch.texture.sdl, &src, &dest); + } #else - SDL_Rect src = {i * TIC_SPRITESIZE + Left, (tile->press ? TIC_SPRITESIZE : 0) + TIC80_MARGIN_TOP, TIC_SPRITESIZE, TIC_SPRITESIZE}; - SDL_Rect dest = {tile->x, tile->y, tileSize, tileSize}; - SDL_RenderCopy(platform.gpu.renderer, platform.gamepad.touch.texture, &src, &dest); #endif } } @@ -1217,11 +1308,16 @@ u64 tic_sys_freq_get() void tic_sys_fullscreen() { #if defined(CRT_SHADER_SUPPORT) - GPU_SetFullscreen(GPU_GetFullscreen() ? false : true, true); -#else - SDL_SetWindowFullscreen(platform.window, - SDL_GetWindowFlags(platform.window) & SDL_WINDOW_FULLSCREEN_DESKTOP ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP); + if(!platform.studio->config()->soft) + { + GPU_SetFullscreen(GPU_GetFullscreen() ? false : true, true); + } + else #endif + { + SDL_SetWindowFullscreen(platform.window, + SDL_GetWindowFlags(platform.window) & SDL_WINDOW_FULLSCREEN_DESKTOP ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP); + } } void tic_sys_message(const char* title, const char* message) @@ -1309,15 +1405,15 @@ static void loadCrtShader() return; } - if(platform.gpu.shader) - GPU_FreeShaderProgram(platform.gpu.shader); + if(platform.screen.shader) + GPU_FreeShaderProgram(platform.screen.shader); - platform.gpu.shader = GPU_LinkShaders(vertex, pixel); + platform.screen.shader = GPU_LinkShaders(vertex, pixel); - if(platform.gpu.shader) + if(platform.screen.shader) { - platform.gpu.block = GPU_LoadShaderBlock(platform.gpu.shader, "gpu_Vertex", "gpu_TexCoord", "gpu_Color", "gpu_ModelViewProjectionMatrix"); - GPU_ActivateShaderProgram(platform.gpu.shader, &platform.gpu.block); + platform.screen.block = GPU_LoadShaderBlock(platform.screen.shader, "gpu_Vertex", "gpu_TexCoord", "gpu_Color", "gpu_ModelViewProjectionMatrix"); + GPU_ActivateShaderProgram(platform.screen.shader, &platform.screen.block); } else { @@ -1329,7 +1425,7 @@ static void loadCrtShader() void tic_sys_update_config() { #if defined(TOUCH_INPUT_SUPPORT) - if(platform.gpu.renderer) + if(platform.screen.renderer.sdl) initTouchGamepad(); #endif } @@ -1349,34 +1445,34 @@ static void gpuTick() } platform.studio->tick(); - renderClear(platform.gpu.renderer); - updateTextureBytes(platform.gpu.texture, tic->screen, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); + renderClear(platform.screen.renderer); + updateTextureBytes(platform.screen.texture, tic->screen, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); #if defined(CRT_SHADER_SUPPORT) - if(platform.studio->config()->crtMonitor) + if(!platform.studio->config()->soft && platform.studio->config()->crt) { - if(platform.gpu.shader == 0) + if(platform.screen.shader == 0) loadCrtShader(); SDL_Rect rect = {0, 0, 0, 0}; calcTextureRect(&rect); - GPU_ActivateShaderProgram(platform.gpu.shader, &platform.gpu.block); + GPU_ActivateShaderProgram(platform.screen.shader, &platform.screen.block); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_x"), (float)rect.x); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_y"), (float)rect.y); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_w"), (float)rect.w); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_h"), (float)rect.h); + GPU_SetUniformf(GPU_GetUniformLocation(platform.screen.shader, "trg_x"), (float)rect.x); + GPU_SetUniformf(GPU_GetUniformLocation(platform.screen.shader, "trg_y"), (float)rect.y); + GPU_SetUniformf(GPU_GetUniformLocation(platform.screen.shader, "trg_w"), (float)rect.w); + GPU_SetUniformf(GPU_GetUniformLocation(platform.screen.shader, "trg_h"), (float)rect.h); { s32 w, h; SDL_GetWindowSize(platform.window, &w, &h); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "scr_w"), (float)w); - GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "scr_h"), (float)h); + GPU_SetUniformf(GPU_GetUniformLocation(platform.screen.shader, "scr_w"), (float)w); + GPU_SetUniformf(GPU_GetUniformLocation(platform.screen.shader, "scr_h"), (float)h); } - GPU_BlitScale(platform.gpu.texture, NULL, platform.gpu.renderer, (float)rect.x, (float)rect.y, + GPU_BlitScale(platform.screen.texture.gpu, NULL, platform.screen.renderer.gpu, (float)rect.x, (float)rect.y, (float)rect.w / TIC80_FULLWIDTH, (float)rect.h / TIC80_FULLHEIGHT); GPU_DeactivateShaderProgram(); } @@ -1393,21 +1489,21 @@ static void gpuTick() s32 width = 0; SDL_GetWindowSize(platform.window, &width, NULL); - Rect src = {0, 0, TIC80_FULLWIDTH, TIC80_FULLHEIGHT}; - Rect dst = {rect.x, rect.y, rect.w, rect.h}; + SDL_Rect src = {0, 0, TIC80_FULLWIDTH, TIC80_FULLHEIGHT}; + SDL_Rect dst = {rect.x, rect.y, rect.w, rect.h}; - renderCopy(platform.gpu.renderer, platform.gpu.texture, src, dst); + renderCopy(platform.screen.renderer, platform.screen.texture, src, dst); } -# if defined(TOUCH_INPUT_SUPPORT) +#if defined(TOUCH_INPUT_SUPPORT) if(isGamepadVisible()) renderGamepad(); else renderKeyboard(); -# endif +#endif - renderPresent(platform.gpu.renderer); + renderPresent(platform.screen.renderer); blitSound(); platform.keyboard.text = '\0'; @@ -1467,16 +1563,19 @@ static s32 start(s32 argc, char **argv, const char* folder) const s32 Width = TIC80_FULLWIDTH * platform.studio->config()->uiScale; const s32 Height = TIC80_FULLHEIGHT * platform.studio->config()->uiScale; - platform.window = SDL_CreateWindow( TIC_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - Width, Height, SDL_WINDOW_SHOWN - | SDL_WINDOW_RESIZABLE -#if defined(CRT_SHADER_SUPPORT) - | SDL_WINDOW_OPENGL -#endif + s32 flags = SDL_WINDOW_SHOWN #if !defined(__EMSCRIPTEN__) && !defined(__MACOSX__) | SDL_WINDOW_ALLOW_HIGHDPI #endif - ); + | SDL_WINDOW_RESIZABLE; + +#if defined(CRT_SHADER_SUPPORT) + + if(!platform.studio->config()->soft) + flags |= SDL_WINDOW_OPENGL; +#endif + + platform.window = SDL_CreateWindow(TIC_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, Width, Height, flags); setWindowIcon(); initGPU(); From d3dd567e3cbe01846da1d54036fd873e4aa946fd Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 8 Sep 2021 18:42:19 +0300 Subject: [PATCH 036/379] #509: check cursor bounds --- src/studio/studio.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index 7e7694625..5a5cffcfb 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1957,16 +1957,17 @@ static void blitCursor() const tic_palette* pal = &bank->palette.scn; const tic_tile* tile = &bank->sprites.data[tic->ram.vram.vars.cursor.sprite]; - u32 *dst = tic->screen + (m->x - hot.x) + (m->y - hot.y) * TIC80_FULLWIDTH, - *end = tic->screen + TIC80_FULLWIDTH * TIC80_FULLHEIGHT; + tic_point s = {m->x - hot.x, m->y - hot.y}; + u32* dst = tic->screen + TIC80_FULLWIDTH * s.y + s.x; - for(s32 src = 0; src != TIC_SPRITESIZE * TIC_SPRITESIZE; dst += TIC80_FULLWIDTH - TIC_SPRITESIZE) - for(s32 i = 0; i != TIC_SPRITESIZE; ++i, ++dst) - { - u8 c = tic_tool_peek4(tile->data, src++); - if(dst < end && c) - *dst = tic_rgba(&pal->colors[c]); - } + for(s32 y = s.y, endy = MIN(y + TIC_SPRITESIZE, TIC80_FULLHEIGHT), i = 0; y != endy; ++y, dst += TIC80_FULLWIDTH - TIC_SPRITESIZE) + for(s32 x = s.x, endx = x + TIC_SPRITESIZE; x != endx; ++x, ++i, ++dst) + if(x < TIC80_FULLWIDTH) + { + u8 c = tic_tool_peek4(tile->data, i); + if(c) + *dst = tic_rgba(&pal->colors[c]); + } } } From c904c5e36dff638df3f527bbecb825fdc7303623 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 08:21:26 +0300 Subject: [PATCH 037/379] #1594: clipboard fix for 3DS --- src/system/n3ds/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/system/n3ds/main.c b/src/system/n3ds/main.c index c3ee388be..4ea9c1f00 100644 --- a/src/system/n3ds/main.c +++ b/src/system/n3ds/main.c @@ -161,6 +161,8 @@ void tic_sys_clipboard_set(const char* text) free(platform.clipboard); platform.clipboard = NULL; } + + platform.clipboard = strdup(text); } bool tic_sys_clipboard_has() From 4e7f1f1714a7b15fe13a452b634287761629291e Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 11:52:06 +0300 Subject: [PATCH 038/379] #1586: added `export mapimg ...` command --- src/studio/screens/console.c | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index f573df376..5a27b349b 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -105,6 +105,7 @@ macro(tiles) \ macro(sprites) \ macro(map) \ + macro(mapimg) \ macro(sfx) \ macro(music) \ macro(screen) \ @@ -2035,6 +2036,45 @@ static void onExport_map(Console* console, const char* param, const char* path, } } +static void onExport_mapimg(Console* console, const char* param, const char* path, ExportParams params) +{ + const char* filename = getFilename(path, ".png"); + + enum{Width = TIC_MAP_WIDTH * TIC_SPRITESIZE, Height = TIC_MAP_HEIGHT * TIC_SPRITESIZE}; + + png_img img = {Width, Height, malloc(Width * Height * sizeof(png_rgba))}; + + SCOPE(free(img.data)) + { + { + tic_mem* tic = console->tic; + + tic_api_sync(tic, -1, params.bank, false); + + for(s32 r = 0; r < TIC_MAP_ROWS; r++) + for(s32 c = 0; c < TIC_MAP_COLS; c++) + { + tic_api_map(tic, c * TIC_MAP_SCREEN_WIDTH, r * TIC_MAP_SCREEN_HEIGHT, + TIC_MAP_SCREEN_WIDTH, TIC_MAP_SCREEN_HEIGHT, 0, 0, NULL, 0, 1, NULL, NULL); + + tic_core_blit(tic, tic->screen_format); + + for(s32 j = 0; j < TIC80_HEIGHT; j++) + for(s32 i = 0; i < TIC80_WIDTH; i++) + img.values[(i + c * TIC80_WIDTH) + (j + r * TIC80_HEIGHT) * Width] = + tic->screen[(i + TIC80_MARGIN_LEFT) + (j + TIC80_MARGIN_TOP) * TIC80_FULLWIDTH]; + } + } + + png_buffer png = png_write(img); + + SCOPE(free(png.data)) + { + onFileExported(console, filename, tic_fs_save(console->fs, filename, png.data, png.size, true)); + } + } +} + static void onExport_sfx(Console* console, const char* param, const char* name, ExportParams params) { const char* filename = getFilename(name, ".wav"); From f78fe0342000fd173ab355321ed82fa6ddaab8c0 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 11:59:37 +0300 Subject: [PATCH 039/379] removed `screen_format` from the `tic_core_blit()` function --- src/api.h | 4 ++-- src/core/core.c | 7 ++++--- src/studio/screens/console.c | 2 +- src/studio/studio.c | 4 ++-- src/system/sdl/main.c | 4 ++-- src/tic.c | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/api.h b/src/api.h index 38f5c0f9a..924977e37 100644 --- a/src/api.h +++ b/src/api.h @@ -699,9 +699,9 @@ void tic_core_resume(tic_mem* memory); void tic_core_tick_start(tic_mem* memory); void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); -void tic_core_blit(tic_mem* tic, tic80_pixel_color_format fmt); +void tic_core_blit(tic_mem* tic); -void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb); +void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb); const tic_script_config* tic_core_script_config(tic_mem* memory); typedef struct diff --git a/src/core/core.c b/src/core/core.c index d7a84b2ca..03f3f831e 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -472,11 +472,12 @@ static inline void memset4(void* dst, u32 val, u32 dwords) #endif } -void tic_core_blit_ex(tic_mem* tic, tic80_pixel_color_format fmt, tic_blit_callback clb) +void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) { tic_core* core = (tic_core*)tic; tic_palette ovrpal; + tic80_pixel_color_format fmt = tic->screen_format; if(clb.overline) { @@ -585,9 +586,9 @@ static inline void overline(tic_mem* memory, void* data) core->state.callback.overline(memory, data); } -void tic_core_blit(tic_mem* tic, tic80_pixel_color_format fmt) +void tic_core_blit(tic_mem* tic) { - tic_core_blit_ex(tic, fmt, (tic_blit_callback){scanline, overline, border, NULL}); + tic_core_blit_ex(tic, (tic_blit_callback){scanline, overline, border, NULL}); } tic_mem* tic_core_create(s32 samplerate) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 5a27b349b..c371e7269 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2057,7 +2057,7 @@ static void onExport_mapimg(Console* console, const char* param, const char* pat tic_api_map(tic, c * TIC_MAP_SCREEN_WIDTH, r * TIC_MAP_SCREEN_HEIGHT, TIC_MAP_SCREEN_WIDTH, TIC_MAP_SCREEN_HEIGHT, 0, 0, NULL, 0, 1, NULL, NULL); - tic_core_blit(tic, tic->screen_format); + tic_core_blit(tic); for(s32 j = 0; j < TIC80_HEIGHT; j++) for(s32 i = 0; i < TIC80_WIDTH; i++) diff --git a/src/studio/studio.c b/src/studio/studio.c index 5a5cffcfb..73e6b98c4 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -2011,8 +2011,8 @@ static void studioTick() } callback[impl.mode].data - ? tic_core_blit_ex(tic, tic->screen_format, callback[impl.mode]) - : tic_core_blit(tic, tic->screen_format); + ? tic_core_blit_ex(tic, callback[impl.mode]) + : tic_core_blit(tic); blitCursor(); diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 07756e3cd..2065d29dd 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -350,7 +350,7 @@ static void initTouchKeyboardState(Texture* texture, void** pixels, bool down) tic_api_map(tic, down ? Cols : 0, 0, Cols, Rows, 0, 0, 0, 0, 1, NULL, NULL); drawKeyboardLabels(down ? 2 : 0); - tic_core_blit(tic, tic->screen_format); + tic_core_blit(tic); *pixels = SDL_malloc(TIC80_FULLWIDTH * TIC80_FULLHEIGHT * sizeof(u32)); memcpy(*pixels, tic->screen, TIC80_FULLWIDTH * TIC80_FULLHEIGHT * sizeof(u32)); @@ -432,7 +432,7 @@ static void initTouchGamepad() platform.gamepad.touch.pixels = SDL_malloc(TEXTURE_SIZE * TEXTURE_SIZE * sizeof(u32)); - tic_core_blit(tic, tic->screen_format); + tic_core_blit(tic); for(u32* pix = tic->screen, *end = pix + TIC80_FULLWIDTH * TIC80_FULLHEIGHT; pix != end; ++pix) if(*pix == tic_rgba(&bank->palette.scn.colors[0])) diff --git a/src/tic.c b/src/tic.c index ba007309a..25a15ea2b 100644 --- a/src/tic.c +++ b/src/tic.c @@ -118,7 +118,7 @@ TIC80_API void tic80_tick(tic80* tic, const tic80_input* input) tic_core_tick(tic80->memory, &tic80->tickData); tic_core_tick_end(tic80->memory); - tic_core_blit(tic80->memory, tic80->memory->screen_format); + tic_core_blit(tic80->memory); tic80->tick_counter++; } From f4f16f95237b8c77d1b77147f2dbffd332800d6b Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 13:01:34 +0300 Subject: [PATCH 040/379] #1595: fixed ALT+... hotkey in the editors --- src/studio/editors/map.c | 3 +++ src/studio/editors/music.c | 3 +++ src/studio/editors/sfx.c | 6 +++--- src/studio/editors/sprite.c | 3 +++ src/studio/screens/console.c | 3 ++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index 4ba0dad99..8a905acff 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -1201,6 +1201,9 @@ static void processKeyboard(Map* map) default: break; } + if(tic_api_key(tic, tic_key_alt)) + return; + if(ctrl) { if(keyWasPressed(tic_key_z)) undo(map); diff --git a/src/studio/editors/music.c b/src/studio/editors/music.c index 2dd93776e..de535ad87 100644 --- a/src/studio/editors/music.c +++ b/src/studio/editors/music.c @@ -1403,6 +1403,9 @@ static void processKeyboard(Music* music) bool ctrl = tic_api_key(tic, tic_key_ctrl); bool shift = tic_api_key(tic, tic_key_shift); + + if(tic_api_key(tic, tic_key_alt)) + return; if (ctrl) { diff --git a/src/studio/editors/sfx.c b/src/studio/editors/sfx.c index 8df1339fb..ebdbcfba3 100644 --- a/src/studio/editors/sfx.c +++ b/src/studio/editors/sfx.c @@ -527,10 +527,10 @@ static void processKeyboard(Sfx* sfx) tic_key_m, }; - if(ctrl) - { + if(tic_api_key(tic, tic_key_alt)) + return; - } + if(ctrl) {} else { for(int i = 0; i < COUNT_OF(Keycodes); i++) diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index a664b309c..f8e00d9dd 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -1644,6 +1644,9 @@ static void processKeyboard(Sprite* sprite) default: break; } + if(tic_api_key(tic, tic_key_alt)) + return; + if(sprite->palette.edit) { if(sprite->palette.focus >= 0) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index c371e7269..48faad369 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -3538,10 +3538,11 @@ static void processKeyboard(Console* console) { tic_mem* tic = console->tic; - if(!console->active) return; + if(tic_api_key(tic, tic_key_alt)) + return; if(tic->ram.input.keyboard.data != 0) { From 5634f65f2b3453b3b12b0503ec9e3381a78bbc35 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 13:07:04 +0300 Subject: [PATCH 041/379] #1592: fixed mouse cursor after alt+tab --- src/system/sdl/main.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 2065d29dd..01f6976fe 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1116,19 +1116,21 @@ void tic_sys_poll() } } -#if defined(__LINUX__) - if(lockInput) - return; -#endif - processMouse(); #if defined(TOUCH_INPUT_SUPPORT) processTouchInput(); #endif - processKeyboard(); processGamepad(); + + SCOPE(processKeyboard()) + { +#if defined(__LINUX__) + if(!lockInput) + return; +#endif + } } bool tic_sys_keyboard_text(char* text) From c3caf2e71fc8e0d156e5c3f38b12a38933980a52 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 13:10:55 +0300 Subject: [PATCH 042/379] #1592: input processing order fix --- src/system/sdl/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 01f6976fe..51a8382f4 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1122,8 +1122,6 @@ void tic_sys_poll() processTouchInput(); #endif - processGamepad(); - SCOPE(processKeyboard()) { #if defined(__LINUX__) @@ -1131,6 +1129,8 @@ void tic_sys_poll() return; #endif } + + processGamepad(); } bool tic_sys_keyboard_text(char* text) From 07318ffc476b040d885a9f12773267bcb89bf94f Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Sep 2021 15:40:29 +0300 Subject: [PATCH 043/379] #1585: added system font width/height params --- src/core/altfont.inl | 1 + src/core/core.c | 24 ++++++++++++++++++++---- src/core/draw.c | 11 +++++++---- src/core/font.inl | 2 +- src/studio/screens/console.c | 7 +++++-- src/studio/studio.c | 25 ++++++++++++++++++++----- src/tic.h | 21 +++++++++++++++++++-- 7 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 src/core/altfont.inl diff --git a/src/core/altfont.inl b/src/core/altfont.inl new file mode 100644 index 000000000..4464b0eb5 --- /dev/null +++ b/src/core/altfont.inl @@ -0,0 +1 @@ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x05, 0x07, 0x05, 0x00, 0x00, 0x00, 0x06, 0x03, 0x06, 0x03, 0x02, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x01, 0x04, 0x00, 0x00, 0x00, 0x03, 0x03, 0x07, 0x05, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x05, 0x05, 0x03, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x01, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x05, 0x05, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x07, 0x01, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x07, 0x05, 0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x07, 0x05, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x05, 0x07, 0x01, 0x06, 0x00, 0x00, 0x00, 0x02, 0x05, 0x07, 0x05, 0x05, 0x00, 0x00, 0x00, 0x03, 0x05, 0x03, 0x05, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x05, 0x03, 0x00, 0x00, 0x00, 0x07, 0x01, 0x03, 0x01, 0x07, 0x00, 0x00, 0x00, 0x07, 0x01, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x05, 0x05, 0x07, 0x05, 0x05, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x03, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x05, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x07, 0x06, 0x00, 0x00, 0x00, 0x03, 0x05, 0x07, 0x03, 0x05, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x05, 0x05, 0x02, 0x05, 0x05, 0x00, 0x00, 0x00, 0x05, 0x05, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x03, 0x05, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x06, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x03, 0x06, 0x00, 0x00, 0x00, 0x04, 0x02, 0x07, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x07, 0x04, 0x02, 0x00, 0x00, 0x01, 0x03, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x02, 0x00, 0x00, 0x01, 0x05, 0x03, 0x03, 0x05, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x06, 0x05, 0x05, 0x06, 0x04, 0x00, 0x00, 0x00, 0x05, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0x07, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x07, 0x06, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x02, 0x03, 0x02, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x03, 0x02, 0x06, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, \ No newline at end of file diff --git a/src/core/core.c b/src/core/core.c index 03f3f831e..e42c76261 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -308,12 +308,28 @@ void tic_api_reset(tic_mem* memory) static void cart2ram(tic_mem* memory) { - static const u8 Font[] = + memory->ram.font = (tic_font) { - #include "font.inl" - }; + .regular = + { + .data = + { + #include "font.inl" + }, + .width = TIC_FONT_WIDTH, + .height = TIC_FONT_HEIGHT, + }, - memcpy(memory->ram.font.data, Font, sizeof Font); + .alt = + { + .data = + { + #include "altfont.inl" + }, + .width = TIC_ALTFONT_WIDTH, + .height = TIC_FONT_HEIGHT, + }, + }; enum { diff --git a/src/core/draw.c b/src/core/draw.c index 6c8d90899..99b03970e 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -37,7 +37,7 @@ static tic_tilesheet getTileSheetFromSegment(tic_mem* memory, u8 segment) switch (segment) { case 0: case 1: - src = (u8*)&memory->ram.font.data; break; + src = (u8*)&memory->ram.font; break; default: src = (u8*)&memory->ram.tiles.data; break; } @@ -321,7 +321,7 @@ static s32 drawText(tic_core* core, tic_tilesheet* font_face, const char* text, y += height * scale; } else { - tic_tileptr font_char = tic_tilesheet_gettile(font_face, alt * TIC_FONT_CHARS / 2 + sym, true); + tic_tileptr font_char = tic_tilesheet_gettile(font_face, alt * TIC_FONT_CHARS + sym, true); s32 size = drawChar(core, &font_char, pos, y, scale, fixed, mapping); pos += ((!fixed && size) ? size + 1 : width) * scale; } @@ -382,10 +382,13 @@ s32 tic_api_print(tic_mem* memory, const char* text, s32 x, s32 y, u8 color, boo { u8 mapping[] = { 255, color }; tic_tilesheet font_face = getTileSheetFromSegment(memory, 1); + + const tic_font_data* font = alt ? &memory->ram.font.alt : &memory->ram.font.regular; + s32 width = font->width; + // Compatibility : print uses reduced width for non-fixed space - u8 width = alt ? TIC_ALTFONT_WIDTH : TIC_FONT_WIDTH; if (!fixed) width -= 2; - return drawText((tic_core*)memory, &font_face, text, x, y, width, TIC_FONT_HEIGHT, fixed, mapping, scale, alt); + return drawText((tic_core*)memory, &font_face, text, x, y, width, font->height, fixed, mapping, scale, alt); } void tic_api_spr(tic_mem* memory, s32 index, s32 x, s32 y, s32 w, s32 h, u8* colors, s32 count, s32 scale, tic_flip flip, tic_rotate rotate) diff --git a/src/core/font.inl b/src/core/font.inl index 686dcc7d3..22547ca37 100644 --- a/src/core/font.inl +++ b/src/core/font.inl @@ -1 +1 @@ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x00, 0x00, 0x00, 0x1e, 0x05, 0x0e, 0x14, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x08, 0x04, 0x02, 0x11, 0x00, 0x00, 0x00, 0x02, 0x05, 0x16, 0x09, 0x16, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00, 0x04, 0x15, 0x0e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x17, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x18, 0x0e, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x0c, 0x19, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x0b, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x1f, 0x03, 0x0f, 0x18, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x0f, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x0c, 0x06, 0x03, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x0e, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x1e, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, 0x04, 0x02, 0x00, 0x00, 0x08, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1e, 0x18, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0e, 0x15, 0x1d, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x1f, 0x13, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x0f, 0x13, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x03, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x13, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x03, 0x0f, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x03, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x03, 0x1b, 0x13, 0x1e, 0x00, 0x00, 0x00, 0x13, 0x13, 0x1f, 0x13, 0x13, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x0b, 0x07, 0x0b, 0x13, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x1b, 0x1f, 0x1f, 0x15, 0x11, 0x00, 0x00, 0x00, 0x13, 0x17, 0x1f, 0x1b, 0x13, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x13, 0x0e, 0x10, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x0f, 0x13, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x0e, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x11, 0x15, 0x1f, 0x1f, 0x1b, 0x00, 0x00, 0x00, 0x13, 0x13, 0x0e, 0x13, 0x13, 0x00, 0x00, 0x00, 0x16, 0x16, 0x1e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x06, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x06, 0x04, 0x04, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x19, 0x19, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x13, 0x13, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x07, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x1e, 0x19, 0x19, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x06, 0x1f, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x19, 0x1f, 0x18, 0x0e, 0x00, 0x00, 0x03, 0x0f, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x19, 0x0e, 0x00, 0x00, 0x03, 0x13, 0x0f, 0x13, 0x13, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x1f, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x19, 0x19, 0x1e, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x1f, 0x06, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0x15, 0x1f, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x0e, 0x0e, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x19, 0x19, 0x1e, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x06, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x06, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x04, 0x0c, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x05, 0x07, 0x05, 0x00, 0x00, 0x00, 0x06, 0x03, 0x06, 0x03, 0x02, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x01, 0x04, 0x00, 0x00, 0x00, 0x03, 0x03, 0x07, 0x05, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x05, 0x05, 0x03, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x01, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x05, 0x05, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x07, 0x01, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x07, 0x05, 0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x07, 0x05, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x05, 0x07, 0x01, 0x06, 0x00, 0x00, 0x00, 0x02, 0x05, 0x07, 0x05, 0x05, 0x00, 0x00, 0x00, 0x03, 0x05, 0x03, 0x05, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x05, 0x03, 0x00, 0x00, 0x00, 0x07, 0x01, 0x03, 0x01, 0x07, 0x00, 0x00, 0x00, 0x07, 0x01, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x05, 0x05, 0x07, 0x05, 0x05, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x05, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x03, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x03, 0x05, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x07, 0x06, 0x00, 0x00, 0x00, 0x03, 0x05, 0x07, 0x03, 0x05, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x05, 0x05, 0x02, 0x05, 0x05, 0x00, 0x00, 0x00, 0x05, 0x05, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x03, 0x05, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x06, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x03, 0x06, 0x00, 0x00, 0x00, 0x04, 0x02, 0x07, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x07, 0x04, 0x02, 0x00, 0x00, 0x01, 0x03, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x02, 0x00, 0x00, 0x01, 0x05, 0x03, 0x03, 0x05, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x06, 0x05, 0x05, 0x06, 0x04, 0x00, 0x00, 0x00, 0x05, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0x07, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x07, 0x06, 0x01, 0x07, 0x00, 0x00, 0x00, 0x06, 0x02, 0x03, 0x02, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x03, 0x02, 0x06, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \ No newline at end of file +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x00, 0x00, 0x00, 0x1e, 0x05, 0x0e, 0x14, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x08, 0x04, 0x02, 0x11, 0x00, 0x00, 0x00, 0x02, 0x05, 0x16, 0x09, 0x16, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x02, 0x00, 0x00, 0x00, 0x04, 0x15, 0x0e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x17, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x18, 0x0e, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x0c, 0x19, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x0b, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x1f, 0x03, 0x0f, 0x18, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x0f, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x0c, 0x06, 0x03, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x0e, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x1e, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, 0x04, 0x02, 0x00, 0x00, 0x08, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x1e, 0x18, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0e, 0x15, 0x1d, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x1f, 0x13, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x0f, 0x13, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x03, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x13, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x03, 0x0f, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x03, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x03, 0x1b, 0x13, 0x1e, 0x00, 0x00, 0x00, 0x13, 0x13, 0x1f, 0x13, 0x13, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x0b, 0x07, 0x0b, 0x13, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x1b, 0x1f, 0x1f, 0x15, 0x11, 0x00, 0x00, 0x00, 0x13, 0x17, 0x1f, 0x1b, 0x13, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x13, 0x0e, 0x10, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x0f, 0x13, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x0e, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x11, 0x15, 0x1f, 0x1f, 0x1b, 0x00, 0x00, 0x00, 0x13, 0x13, 0x0e, 0x13, 0x13, 0x00, 0x00, 0x00, 0x16, 0x16, 0x1e, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x06, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x06, 0x04, 0x04, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x19, 0x19, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x13, 0x13, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x07, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x1e, 0x19, 0x19, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x06, 0x1f, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x19, 0x1f, 0x18, 0x0e, 0x00, 0x00, 0x03, 0x0f, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x19, 0x0e, 0x00, 0x00, 0x03, 0x13, 0x0f, 0x13, 0x13, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x1f, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x13, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x19, 0x19, 0x1e, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x13, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x1f, 0x06, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0x15, 0x1f, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x0e, 0x0e, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x19, 0x19, 0x1e, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x06, 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x06, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x04, 0x0c, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 48faad369..9bf8719a1 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2779,7 +2779,10 @@ static s32 createRamTable(char* buf) {offsetof(tic_ram, stereo), "STEREO VOLUME"}, {offsetof(tic_ram, persistent), "PERSISTENT MEMORY"}, {offsetof(tic_ram, flags), "SPRITE FLAGS"}, - {offsetof(tic_ram, font), "SYSTEM FONT"}, + {offsetof(tic_ram, font.regular), "FONT"}, + {offsetof(tic_ram, font.regular.params), "FONT PARAMS"}, + {offsetof(tic_ram, font.alt), "ALT FONT"}, + {offsetof(tic_ram, font.alt.params), "ALT FONT PARAMS"}, {offsetof(tic_ram, free), "... (free)"}, {TIC_RAM_SIZE, ""}, }; @@ -3060,7 +3063,7 @@ static void printTable(Console* console, const char* text) static void onHelp_ram(Console* console) { - char buf[1024]; + char buf[2048]; createRamTable(buf); printTable(console, buf); } diff --git a/src/studio/studio.c b/src/studio/studio.c index 73e6b98c4..9195d7432 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -196,6 +196,7 @@ static struct tic_fs* fs; s32 samplerate; + tic_font systemFont; } impl = @@ -1864,15 +1865,29 @@ static void updateSystemFont() { tic_mem* tic = impl.studio.tic; - memset(impl.systemFont.data, 0, sizeof(tic_font)); + impl.systemFont = (tic_font) + { + .regular = + { + .width = TIC_FONT_WIDTH, + .height = TIC_FONT_HEIGHT, + }, + .alt = + { + .width = TIC_ALTFONT_WIDTH, + .height = TIC_FONT_HEIGHT, + } + }; + + u8* dst = (u8*)&impl.systemFont; - for(s32 i = 0; i < TIC_FONT_CHARS; i++) + for(s32 i = 0; i < TIC_FONT_CHARS * 2; i++) for(s32 y = 0; y < TIC_SPRITESIZE; y++) for(s32 x = 0; x < TIC_SPRITESIZE; x++) if(tic_tool_peek4(&impl.config->cart->bank0.sprites.data[i], TIC_SPRITESIZE*y + x)) - impl.systemFont.data[i*BITS_IN_BYTE+y] |= 1 << x; + dst[i*BITS_IN_BYTE+y] |= 1 << x; - memcpy(tic->ram.font.data, impl.systemFont.data, sizeof(tic_font)); + tic->ram.font = impl.systemFont; } void studioConfigChanged() @@ -2007,7 +2022,7 @@ static void studioTick() if(impl.mode != TIC_RUN_MODE) { memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - memcpy(tic->ram.font.data, impl.systemFont.data, sizeof(tic_font)); + tic->ram.font = impl.systemFont; } callback[impl.mode].data diff --git a/src/tic.h b/src/tic.h index cae7b148a..ef7f95e05 100644 --- a/src/tic.h +++ b/src/tic.h @@ -102,7 +102,7 @@ #define TIC_GAMEPADS (sizeof(tic80_gamepads) / sizeof(tic80_gamepad)) #define SFX_NOTES {"C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-"} -#define TIC_FONT_CHARS 256 +#define TIC_FONT_CHARS 128 #define TIC_UNUSED(x) (void)x @@ -434,7 +434,24 @@ typedef struct typedef struct { - u8 data[TIC_FONT_CHARS * BITS_IN_BYTE]; + u8 data[(TIC_FONT_CHARS - 1) * BITS_IN_BYTE]; + + union + { + struct + { + u8 width; + u8 height; + }; + + u8 params[BITS_IN_BYTE]; + }; +} tic_font_data; + +typedef struct +{ + tic_font_data regular; + tic_font_data alt; } tic_font; typedef union From 23a6e7a697df39794c364e776327071e1804a986 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 15 Sep 2021 15:06:10 +0300 Subject: [PATCH 044/379] #1232: added different types of noise --- src/core/sound.c | 9 +++++++-- src/studio/studio.c | 2 +- src/tools.c | 10 ++++++++++ src/tools.h | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/core/sound.c b/src/core/sound.c index acf647649..43a9fec53 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -123,10 +123,15 @@ static void runNoise(blip_buffer_t* blip, const tic_sound_register* reg, tic_sou data->phase = 1; s32 period = freq2period(reg->freq); + static const s32 Feedback[] = {0x12000, 0xd008, 0x6000, 0x3802, 0x1c80, 0xe08, 0x500, 0x240, 0x110, 0xb8, 0x60, 0x30, 0x14, 0xc, 0x6, 0x3}; + + static_assert(COUNT_OF(Feedback) == 16, "Feedback"); + + s32 fb = Feedback[tic_tool_peek4(reg->waveform.data, 0)]; for (; data->time < end_time; data->time += period) { - data->phase = ((data->phase & 1) * (0b11 << 13)) ^ (data->phase >> 1); + data->phase = ((data->phase & 1) * fb) ^ (data->phase >> 1); update_amp(blip, data, getAmp(reg, (data->phase & 1) ? volume : 0)); } } @@ -517,7 +522,7 @@ static void stereo_tick_end(tic_mem* memory, tic_sound_register_data* registers, const tic_sound_register* reg = &memory->ram.registers[i]; tic_sound_register_data* data = registers + i; - EMPTY(reg->waveform.data) + FLAT(®->waveform) ? runNoise(blip, reg, data, EndTime, volume) : runEnvelope(blip, reg, data, EndTime, volume); diff --git a/src/studio/studio.c b/src/studio/studio.c index 9195d7432..6cdd1d9e8 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -282,7 +282,7 @@ s32 calcWaveAnimation(tic_mem* tic, u32 offset, s32 channel) { const tic_sound_register* reg = &tic->ram.registers[channel]; - s32 val = EMPTY(reg->waveform.data) + s32 val = FLAT(reg->waveform.data) ? (rand() & 1) * MAX_VOLUME : tic_tool_peek4(reg->waveform.data, ((offset * reg->freq) >> 7) % WAVE_VALUES); diff --git a/src/tools.c b/src/tools.c index 402f2dec9..0812359a3 100644 --- a/src/tools.c +++ b/src/tools.c @@ -176,6 +176,16 @@ bool tic_tool_empty(const void* buffer, s32 size) return true; } +bool tic_tool_flat(const void* buffer, s32 size) +{ + u8 first = *(u8*)buffer; + for(const u8 *ptr = buffer, *end = ptr + size; ptr < end;) + if(*ptr++ != first) + return false; + + return true; +} + void tic_tool_str2buf(const char* str, s32 size, void* buf, bool flip) { char val[] = "0x00"; diff --git a/src/tools.h b/src/tools.h index 60c734bea..cfdea3f19 100644 --- a/src/tools.h +++ b/src/tools.h @@ -93,6 +93,9 @@ u32 tic_tool_unzip(void* dest, s32 bufSize, const void* source, s32 size); bool tic_tool_empty(const void* buffer, s32 size); #define EMPTY(BUFFER) (tic_tool_empty((BUFFER), sizeof (BUFFER))) +bool tic_tool_flat(const void* buffer, s32 size); +#define FLAT(BUFFER) (tic_tool_flat((BUFFER), sizeof (BUFFER))) + u32 tic_nearest_color(const tic_rgb* palette, const tic_rgb* color, s32 count); const char* tic_tool_metatag(const char* code, const char* tag, const char* comment); \ No newline at end of file From 20e9caca18a6fdddc98c8e41c5778309f4aeca1e Mon Sep 17 00:00:00 2001 From: msx80 Date: Wed, 15 Sep 2021 18:23:24 +0200 Subject: [PATCH 045/379] Improvements for language support (#1590) * Cleanups as discussed in https://github.com/nesbox/TIC-80/discussions/1289 * switches for languages * removed stale marks * resolved dependency loop, unified vm pointer, removed SCRIPT_LIST * forgot a field * removing extra log and fixing forgotten javascript Co-authored-by: msx80 --- CMakeLists.txt | 2 + include/tic80_config.h | 46 +---- src/api.h | 9 + src/api/js.c | 24 +-- src/api/lua.c | 51 +++--- src/api/squirrel.c | 38 ++-- src/api/wren.c | 42 ++--- src/core/core.c | 62 ++++--- src/core/core.h | 8 +- src/core/languages.c | 55 ++++++ src/studio/demos.c | 170 ++++++++++++++++++ src/studio/demos.h | 15 ++ src/studio/project.c | 29 ++-- src/studio/screens/console.c | 327 ++++++++++++++--------------------- 14 files changed, 519 insertions(+), 359 deletions(-) create mode 100644 src/core/languages.c create mode 100644 src/studio/demos.c create mode 100644 src/studio/demos.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8285905db..44a123f0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -296,6 +296,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) set(TIC80CORE_DIR ${CMAKE_SOURCE_DIR}/src) set(TIC80CORE_SRC ${TIC80CORE_DIR}/core/core.c + ${TIC80CORE_DIR}/core/languages.c ${TIC80CORE_DIR}/core/draw.c ${TIC80CORE_DIR}/core/io.c ${TIC80CORE_DIR}/core/sound.c @@ -736,6 +737,7 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/studio/editors/music.c ${TIC80LIB_DIR}/studio/studio.c ${TIC80LIB_DIR}/studio/config.c + ${TIC80LIB_DIR}/studio/demos.c ${TIC80LIB_DIR}/studio/fs.c ${TIC80LIB_DIR}/studio/net.c ${TIC80LIB_DIR}/ext/md5.c diff --git a/include/tic80_config.h b/include/tic80_config.h index 5ea30ca6d..222981dab 100644 --- a/include/tic80_config.h +++ b/include/tic80_config.h @@ -42,50 +42,6 @@ # define TIC_BUILD_WITH_LUA 1 #endif -#if defined(TIC_BUILD_WITH_LUA) -# define TIC_LUA_DEF(macro) macro(lua, ".lua", "--", lua_State) -#else -# define TIC_LUA_DEF(macro) -#endif - -#if defined(TIC_BUILD_WITH_MOON) -# define TIC_MOON_DEF(macro) macro(moon, ".moon", "--", lua_State) -#else -# define TIC_MOON_DEF(macro) -#endif - -#if defined(TIC_BUILD_WITH_FENNEL) -# define TIC_FENNEL_DEF(macro) macro(fennel, ".fnl", ";;", lua_State) -#else -# define TIC_FENNEL_DEF(macro) -#endif - -#if defined(TIC_BUILD_WITH_JS) -# define TIC_JS_DEF(macro) macro(js, ".js", "//", duk_hthread) -#else -# define TIC_JS_DEF(macro) -#endif - -#if defined(TIC_BUILD_WITH_SQUIRREL) -# define TIC_SQUIRREL_DEF(macro) macro(squirrel, ".nut", "//", SQVM) -#else -# define TIC_SQUIRREL_DEF(macro) -#endif - -#if defined(TIC_BUILD_WITH_WREN) -# define TIC_WREN_DEF(macro) macro(wren, ".wren", "//", WrenVM) -#else -# define TIC_WREN_DEF(macro) -#endif - -#define SCRIPT_LIST(macro) \ - TIC_LUA_DEF (macro) \ - TIC_MOON_DEF (macro) \ - TIC_FENNEL_DEF (macro) \ - TIC_JS_DEF (macro) \ - TIC_SQUIRREL_DEF(macro) \ - TIC_WREN_DEF (macro) - #if defined(__APPLE__) // TODO: this disables macos config # include "AvailabilityMacros.h" @@ -122,4 +78,4 @@ # else # define TIC80_API # endif -#endif \ No newline at end of file +#endif diff --git a/src/api.h b/src/api.h index 924977e37..ac37c6b85 100644 --- a/src/api.h +++ b/src/api.h @@ -24,6 +24,11 @@ #include "tic.h" +// convenience macros to loop languages +#define FOR_EACH_LANG(ln) for (tic_script_config** conf = Languages ; *conf != NULL; conf++ ) { tic_script_config* ln = *conf; +#define FOR_EACH_LANG_END } + + typedef struct { u8 index; tic_flip flip; tic_rotate rotate; } RemapResult; typedef void(*RemapFunc)(void*, s32 x, s32 y, RemapResult* result); @@ -69,6 +74,8 @@ typedef struct typedef struct { const char* name; + const char* fileExtension; + const char* projectComment; struct { bool(*init)(tic_mem* memory, const char* code); @@ -93,6 +100,8 @@ typedef struct s32 keywordsCount; } tic_script_config; +extern tic_script_config* Languages[]; + typedef struct { s32 x, y; diff --git a/src/api/js.c b/src/api/js.c index c562e92ef..eac79321c 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -36,10 +36,10 @@ static void closeJavascript(tic_mem* tic) { tic_core* core = (tic_core*)tic; - if(core->js) + if(core->currentVM) { - duk_destroy_heap(core->js); - core->js = NULL; + duk_destroy_heap(core->currentVM); + core->currentVM = NULL; } } @@ -921,7 +921,7 @@ static void initDuktape(tic_core* core) { closeJavascript((tic_mem*)core); - duk_context* duk = core->js = duk_create_heap(NULL, NULL, NULL, core, NULL); + duk_context* duk = core->currentVM = duk_create_heap(NULL, NULL, NULL, core, NULL); { duk_push_global_stash(duk); @@ -936,8 +936,8 @@ static void initDuktape(tic_core* core) for (s32 i = 0; i < COUNT_OF(ApiItems); i++) { - duk_push_c_function(core->js, ApiItems[i].func, ApiItems[i].params); - duk_put_global_string(core->js, ApiItems[i].name); + duk_push_c_function(core->currentVM, ApiItems[i].func, ApiItems[i].params); + duk_put_global_string(core->currentVM, ApiItems[i].name); } } @@ -946,7 +946,7 @@ static bool initJavascript(tic_mem* tic, const char* code) tic_core* core = (tic_core*)tic; initDuktape(core); - duk_context* duktape = core->js; + duk_context* duktape = core->currentVM; if (duk_pcompile_string(duktape, 0, code) != 0 || duk_peval_string(duktape, code) != 0) { @@ -964,7 +964,7 @@ static void callJavascriptTick(tic_mem* tic) tic_core* core = (tic_core*)tic; - duk_context* duk = core->js; + duk_context* duk = core->currentVM; if(duk) { @@ -984,7 +984,7 @@ static void callJavascriptTick(tic_mem* tic) static void callJavascriptScanlineName(tic_mem* tic, s32 row, void* data, const char* name) { tic_core* core = (tic_core*)tic; - duk_context* duk = core->js; + duk_context* duk = core->currentVM; if(duk_get_global_string(duk, name)) { @@ -1013,7 +1013,7 @@ static void callJavascriptBorder(tic_mem* tic, s32 row, void* data) static void callJavascriptOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; - duk_context* duk = core->js; + duk_context* duk = core->currentVM; if(duk_get_global_string(duk, OVR_FN)) { @@ -1099,9 +1099,11 @@ void evalJs(tic_mem* tic, const char* code) { printf("TODO: JS eval not yet implemented\n."); } -static const tic_script_config JsSyntaxConfig = +const tic_script_config JsSyntaxConfig = { .name = "js", + .fileExtension = ".js", + .projectComment = "//", .init = initJavascript, .close = closeJavascript, .tick = callJavascriptTick, diff --git a/src/api/lua.c b/src/api/lua.c index 5091b242f..3aee86f98 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -45,8 +45,8 @@ static s32 getLuaNumber(lua_State* lua, s32 index) static void registerLuaFunction(tic_core* core, lua_CFunction func, const char *name) { - lua_pushcfunction(core->lua, func); - lua_setglobal(core->lua, name); + lua_pushcfunction(core->currentVM, func); + lua_setglobal(core->currentVM, name); } static tic_core* getLuaCore(lua_State* lua) @@ -1366,8 +1366,8 @@ static void checkForceExit(lua_State *lua, lua_Debug *luadebug) static void initAPI(tic_core* core) { - lua_pushlightuserdata(core->lua, core); - lua_setglobal(core->lua, TicCore); + lua_pushlightuserdata(core->currentVM, core); + lua_setglobal(core->currentVM, TicCore); #define API_FUNC_DEF(name, ...) {lua_ ## name, #name}, static const struct{lua_CFunction func; const char* name;} ApiItems[] = {TIC_API_LIST(API_FUNC_DEF)}; @@ -1379,17 +1379,17 @@ static void initAPI(tic_core* core) registerLuaFunction(core, lua_dofile, "dofile"); registerLuaFunction(core, lua_loadfile, "loadfile"); - lua_sethook(core->lua, &checkForceExit, LUA_MASKCOUNT, LUA_LOC_STACK); + lua_sethook(core->currentVM, &checkForceExit, LUA_MASKCOUNT, LUA_LOC_STACK); } static void closeLua(tic_mem* tic) { tic_core* core = (tic_core*)tic; - if(core->lua) + if(core->currentVM) { - lua_close(core->lua); - core->lua = NULL; + lua_close(core->currentVM); + core->currentVM = NULL; } } @@ -1399,13 +1399,13 @@ static bool initLua(tic_mem* tic, const char* code) closeLua(tic); - lua_State* lua = core->lua = luaL_newstate(); + lua_State* lua = core->currentVM = luaL_newstate(); lua_open_builtins(lua); initAPI(core); { - lua_State* lua = core->lua; + lua_State* lua = core->currentVM; lua_settop(lua, 0); @@ -1458,7 +1458,7 @@ static void callLuaTick(tic_mem* tic) { tic_core* core = (tic_core*)tic; - lua_State* lua = core->lua; + lua_State* lua = core->currentVM; if(lua) { @@ -1479,7 +1479,7 @@ static void callLuaTick(tic_mem* tic) static void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name) { tic_core* core = (tic_core*)tic; - lua_State* lua = core->lua; + lua_State* lua = core->currentVM; if (lua) { @@ -1510,7 +1510,7 @@ static void callLuaBorder(tic_mem* tic, s32 row, void* data) static void callLuaOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; - lua_State* lua = core->lua; + lua_State* lua = core->currentVM; if (lua) { @@ -1599,7 +1599,7 @@ static const tic_outline_item* getLuaOutline(const char* code, s32* size) static void evalLua(tic_mem* tic, const char* code) { tic_core* core = (tic_core*)tic; - lua_State* lua = core->lua; + lua_State* lua = core->currentVM; if (!lua) return; @@ -1611,9 +1611,11 @@ static void evalLua(tic_mem* tic, const char* code) { } } -static const tic_script_config LuaSyntaxConfig = +tic_script_config LuaSyntaxConfig = { .name = "lua", + .fileExtension = ".lua", + .projectComment = "--", .init = initLua, .close = closeLua, .tick = callLuaTick, @@ -1680,7 +1682,7 @@ static bool initMoonscript(tic_mem* tic, const char* code) tic_core* core = (tic_core*)tic; closeLua(tic); - lua_State* lua = core->lua = luaL_newstate(); + lua_State* lua = core->currentVM = luaL_newstate(); lua_open_builtins(lua); luaopen_lpeg(lua); @@ -1689,7 +1691,7 @@ static bool initMoonscript(tic_mem* tic, const char* code) initAPI(core); { - lua_State* moon = core->lua; + lua_State* moon = core->currentVM; lua_settop(moon, 0); @@ -1784,9 +1786,11 @@ static const tic_outline_item* getMoonOutline(const char* code, s32* size) return items; } -static const tic_script_config MoonSyntaxConfig = +tic_script_config MoonSyntaxConfig = { .name = "moon", + .fileExtension = ".moon", + .projectComment = "--", .init = initMoonscript, .close = closeLua, .tick = callLuaTick, @@ -1836,13 +1840,13 @@ static bool initFennel(tic_mem* tic, const char* code) tic_core* core = (tic_core*)tic; closeLua(tic); - lua_State* lua = core->lua = luaL_newstate(); + lua_State* lua = core->currentVM = luaL_newstate(); lua_open_builtins(lua); initAPI(core); { - lua_State* fennel = core->lua; + lua_State* fennel = core->currentVM; lua_settop(fennel, 0); @@ -1945,7 +1949,7 @@ static const tic_outline_item* getFennelOutline(const char* code, s32* size) static void evalFennel(tic_mem* tic, const char* code) { tic_core* core = (tic_core*)tic; - lua_State* fennel = core->lua; + lua_State* fennel = core->currentVM; lua_settop(fennel, 0); @@ -1964,10 +1968,11 @@ static void evalFennel(tic_mem* tic, const char* code) { } } - -static const tic_script_config FennelSyntaxConfig = +tic_script_config FennelSyntaxConfig = { .name = "fennel", + .fileExtension = ".fnl", + .projectComment = ";;", .init = initFennel, .close = closeLua, .tick = callLuaTick, diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 90f9bb4dd..d023ba281 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -55,11 +55,11 @@ static s32 getSquirrelNumber(HSQUIRRELVM vm, s32 index) static void registerSquirrelFunction(tic_core* core, SQFUNCTION func, const char *name) { - sq_pushroottable(core->squirrel); - sq_pushstring(core->squirrel, name, -1); - sq_newclosure(core->squirrel, func, 0); - sq_newslot(core->squirrel, -3, SQTrue); - sq_poptop(core->squirrel); // remove root table. + sq_pushroottable(core->currentVM); + sq_pushstring(core->currentVM, name, -1); + sq_newclosure(core->currentVM, func, 0); + sq_newslot(core->currentVM, -3, SQTrue); + sq_poptop(core->currentVM); // remove root table. } static tic_core* getSquirrelCore(HSQUIRRELVM vm) @@ -1459,13 +1459,13 @@ static void checkForceExit(HSQUIRRELVM vm, SQInteger type, const SQChar* sourceN static void initAPI(tic_core* core) { - HSQUIRRELVM vm = core->squirrel; + HSQUIRRELVM vm = core->currentVM; sq_setcompilererrorhandler(vm, squirrel_compilerError); sq_pushregistrytable(vm); sq_pushstring(vm, TicCore, -1); - sq_pushuserpointer(core->squirrel, core); + sq_pushuserpointer(core->currentVM, core); sq_newslot(vm, -3, SQTrue); sq_poptop(vm); @@ -1494,10 +1494,10 @@ static void closeSquirrel(tic_mem* tic) { tic_core* core = (tic_core*)tic; - if(core->squirrel) + if(core->currentVM) { - sq_close(core->squirrel); - core->squirrel = NULL; + sq_close(core->currentVM); + core->currentVM = NULL; } } @@ -1507,7 +1507,7 @@ static bool initSquirrel(tic_mem* tic, const char* code) closeSquirrel(tic); - HSQUIRRELVM vm = core->squirrel = sq_open(100); + HSQUIRRELVM vm = core->currentVM = sq_open(100); squirrel_open_builtins(vm); sq_newclosure(vm, squirrel_errorHandler, 0); @@ -1516,7 +1516,7 @@ static bool initSquirrel(tic_mem* tic, const char* code) initAPI(core); { - HSQUIRRELVM vm = core->squirrel; + HSQUIRRELVM vm = core->currentVM; sq_settop(vm, 0); @@ -1545,7 +1545,7 @@ static void callSquirrelTick(tic_mem* tic) { tic_core* core = (tic_core*)tic; - HSQUIRRELVM vm = core->squirrel; + HSQUIRRELVM vm = core->currentVM; if(vm) { @@ -1579,7 +1579,7 @@ static void callSquirrelTick(tic_mem* tic) static void callSquirrelScanlineName(tic_mem* tic, s32 row, void* data, const char* name) { tic_core* core = (tic_core*)tic; - HSQUIRRELVM vm = core->squirrel; + HSQUIRRELVM vm = core->currentVM; if (vm) { @@ -1622,7 +1622,7 @@ static void callSquirrelBorder(tic_mem* tic, s32 row, void* data) static void callSquirrelOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; - HSQUIRRELVM vm = core->squirrel; + HSQUIRRELVM vm = core->currentVM; if (vm) { @@ -1724,14 +1724,14 @@ static const tic_outline_item* getSquirrelOutline(const char* code, s32* size) void evalSquirrel(tic_mem* tic, const char* code) { tic_core* core = (tic_core*)tic; - HSQUIRRELVM vm = core->squirrel; + HSQUIRRELVM vm = core->currentVM; // make sure that the Squirrel interpreter is initialized. if (vm == NULL) { if (!initSquirrel(tic, "")) return; - vm = core->squirrel; + vm = core->currentVM; } sq_settop(vm, 0); @@ -1751,9 +1751,11 @@ void evalSquirrel(tic_mem* tic, const char* code) { sq_settop(vm, 0); } -static const tic_script_config SquirrelSyntaxConfig = +tic_script_config SquirrelSyntaxConfig = { .name = "squirrel", + .fileExtension = ".nut", + .projectComment = "//", .init = initSquirrel, .close = closeSquirrel, .tick = callSquirrelTick, diff --git a/src/api/wren.c b/src/api/wren.c index f6b08f71d..f036a8bb5 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -200,24 +200,24 @@ static inline bool isList(WrenVM* vm, s32 index) static void closeWren(tic_mem* tic) { tic_core* core = (tic_core*)tic; - if(core->wren) + if(core->currentVM) { // release handles if (loaded) { - wrenReleaseHandle(core->wren, new_handle); - wrenReleaseHandle(core->wren, update_handle); - wrenReleaseHandle(core->wren, scanline_handle); - wrenReleaseHandle(core->wren, border_handle); - wrenReleaseHandle(core->wren, overline_handle); + wrenReleaseHandle(core->currentVM, new_handle); + wrenReleaseHandle(core->currentVM, update_handle); + wrenReleaseHandle(core->currentVM, scanline_handle); + wrenReleaseHandle(core->currentVM, border_handle); + wrenReleaseHandle(core->currentVM, overline_handle); if (game_class != NULL) { - wrenReleaseHandle(core->wren, game_class); + wrenReleaseHandle(core->currentVM, game_class); } } - wrenFreeVM(core->wren); - core->wren = NULL; + wrenFreeVM(core->currentVM); + core->currentVM = NULL; } loaded = false; @@ -1392,9 +1392,9 @@ static WrenForeignMethodFn bindForeignMethod( static void initAPI(tic_core* core) { - wrenSetUserData(core->wren, core); + wrenSetUserData(core->currentVM, core); - if (wrenInterpret(core->wren, "main", tic_wren_api) != WREN_RESULT_SUCCESS) + if (wrenInterpret(core->currentVM, "main", tic_wren_api) != WREN_RESULT_SUCCESS) { core->data->error(core->data->data, "can't load TIC wren api"); } @@ -1436,11 +1436,11 @@ static bool initWren(tic_mem* tic, const char* code) config.errorFn = reportError; config.writeFn = writeFn; - WrenVM* vm = core->wren = wrenNewVM(&config); + WrenVM* vm = core->currentVM = wrenNewVM(&config); initAPI(core); - if (wrenInterpret(core->wren, "main", code) != WREN_RESULT_SUCCESS) + if (wrenInterpret(core->currentVM, "main", code) != WREN_RESULT_SUCCESS) { return false; } @@ -1464,7 +1464,7 @@ static bool initWren(tic_mem* tic, const char* code) wrenEnsureSlots(vm, 1); wrenSetSlotHandle(vm, 0, game_class); wrenCall(vm, new_handle); - wrenReleaseHandle(core->wren, game_class); // release game class handle + wrenReleaseHandle(core->currentVM, game_class); // release game class handle game_class = NULL; if (wrenGetSlotCount(vm) == 0) { @@ -1483,7 +1483,7 @@ static bool initWren(tic_mem* tic, const char* code) static void callWrenTick(tic_mem* tic) { tic_core* core = (tic_core*)tic; - WrenVM* vm = core->wren; + WrenVM* vm = core->currentVM; if(vm && game_class) { @@ -1496,7 +1496,7 @@ static void callWrenTick(tic_mem* tic) static void callWrenScanline(tic_mem* tic, s32 row, void* data) { tic_core* core = (tic_core*)tic; - WrenVM* vm = core->wren; + WrenVM* vm = core->currentVM; if(vm && game_class) { @@ -1510,7 +1510,7 @@ static void callWrenScanline(tic_mem* tic, s32 row, void* data) static void callWrenBorder(tic_mem* tic, s32 row, void* data) { tic_core* core = (tic_core*)tic; - WrenVM* vm = core->wren; + WrenVM* vm = core->currentVM; if(vm && game_class) { @@ -1524,7 +1524,7 @@ static void callWrenBorder(tic_mem* tic, s32 row, void* data) static void callWrenOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; - WrenVM* vm = core->wren; + WrenVM* vm = core->currentVM; if (vm && game_class) { @@ -1606,12 +1606,14 @@ static const tic_outline_item* getWrenOutline(const char* code, s32* size) static void evalWren(tic_mem* tic, const char* code) { tic_core* core = (tic_core*)tic; - wrenInterpret(core->wren, "main", code); + wrenInterpret(core->currentVM, "main", code); } -static const tic_script_config WrenSyntaxConfig = +tic_script_config WrenSyntaxConfig = { .name = "wren", + .fileExtension = ".wren", + .projectComment = "//", .init = initWren, .close = closeWren, .tick = callWrenTick, diff --git a/src/core/core.c b/src/core/core.c index e42c76261..b48996b95 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -222,28 +222,15 @@ static bool compareMetatag(const char* code, const char* tag, const char* value, return result; } -#define SCRIPT_DEF(name, _, __, vm) const tic_script_config* get_## name ##_script_config(); - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - const tic_script_config* tic_core_script_config(tic_mem* memory) { - static const struct Config - { - const char* name; - const tic_script_config*(*func)(); - } Configs[] = - { -#define SCRIPT_DEF(name, ...) {#name, get_## name ##_script_config}, - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - }; - - FOR(const struct Config*, it, Configs) - if(compareMetatag(memory->cart.code.data, "script", it->name, it->func()->singleComment)) - return it->func(); - - return Configs->func(); + FOR_EACH_LANG(it) + if(compareMetatag(memory->cart.code.data, "script", it->name, it->singleComment)) + { + return it; + } + FOR_EACH_LANG_END + return Languages[0]; } static void updateSaveid(tic_mem* memory) @@ -345,6 +332,35 @@ static void cart2ram(tic_mem* memory) tic_api_sync(memory, EMPTY(memory->cart.bank0.screen.data) ? noscreen : all, 0, false); } +static void tic_close_current_vm(tic_core* core) +{ + // close previous VM if any + if(core->currentVM) + { + // printf("Closing VM of %s, %d\n", core->currentScript->name, core->currentVM); + core->currentScript->close( (tic_mem*)core ); + core->currentVM = NULL; + } +} + +static bool tic_init_vm(tic_core* core, const char* code, const tic_script_config* config) +{ + tic_close_current_vm(core); + // set current script config and init + core->currentScript = config; + bool done = config->init( (tic_mem*) core , code); + if(!done) + { + // if it couldn't init, make sure the VM is not left dirty by the implementation + core->currentVM = NULL; + } + else + { + //printf("Initialized VM of %s, %d\n", core->currentScript->name, core->currentVM); + } + return done; +} + void tic_core_tick(tic_mem* tic, tic_tick_data* data) { tic_core* core = (tic_core*)tic; @@ -375,7 +391,7 @@ void tic_core_tick(tic_mem* tic, tic_tick_data* data) data->start = data->counter(core->data->data); - done = config->init(tic, code); + done = tic_init_vm(core, code, config); } else { @@ -427,9 +443,7 @@ void tic_core_close(tic_mem* memory) core->state.initialized = false; -#define SCRIPT_DEF(name, ...) get_## name ##_script_config()->close(memory); - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF + tic_close_current_vm(core); blip_delete(core->blip.left); blip_delete(core->blip.right); diff --git a/src/core/core.h b/src/core/core.h index 7992d0a6f..e3b41acfb 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -162,12 +162,8 @@ typedef struct { tic_mem memory; // it should be first - struct - { -#define SCRIPT_DEF(name, _, __, vm) struct vm* name; - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - }; + void* currentVM; + tic_script_config* currentScript; struct { diff --git a/src/core/languages.c b/src/core/languages.c new file mode 100644 index 000000000..be30a486e --- /dev/null +++ b/src/core/languages.c @@ -0,0 +1,55 @@ +#include +#include "api.h" + +#if defined(TIC_BUILD_WITH_JS) +extern tic_script_config JsSyntaxConfig; +#endif + +#if defined (TIC_BUILD_WITH_LUA) +extern tic_script_config LuaSyntaxConfig; +#endif + +#if defined(TIC_BUILD_WITH_MOON) +extern tic_script_config MoonSyntaxConfig; +#endif + +#if defined(TIC_BUILD_WITH_FENNEL) +extern tic_script_config FennelSyntaxConfig; +#endif + +#if defined(TIC_BUILD_WITH_SQUIRREL) +extern tic_script_config SquirrelSyntaxConfig; +#endif + +#if defined(TIC_BUILD_WITH_WREN) +extern tic_script_config WrenSyntaxConfig; +#endif + +tic_script_config* Languages[] = { + + #if defined (TIC_BUILD_WITH_LUA) + &LuaSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_JS) + &JsSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_MOON) + &MoonSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_FENNEL) + &FennelSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_SQUIRREL) + &SquirrelSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_WREN) + &WrenSyntaxConfig, + #endif + + NULL}; + diff --git a/src/studio/demos.c b/src/studio/demos.c new file mode 100644 index 000000000..44cb1b915 --- /dev/null +++ b/src/studio/demos.c @@ -0,0 +1,170 @@ +#include +#include +#include +#include "demos.h" +#include "api.h" + +#if defined (TIC_BUILD_WITH_LUA) +static const u8 LuaDemoRom[] = +{ + #include "../build/assets/luademo.tic.dat" +}; +static const u8 LuaMarkRom[] = +{ + #include "../build/assets/luamark.tic.dat" +}; +tic_script_config_extra LuaSyntaxConfigExtra = +{ + .name = "lua", + .demoRom = LuaDemoRom, + .demoRomSize = sizeof LuaDemoRom, + .markRom = LuaMarkRom, + .markRomSize = sizeof LuaMarkRom, +}; +#endif + +#if defined (TIC_BUILD_WITH_MOON) +static const u8 MoonDemoRom[] = +{ + #include "../build/assets/moondemo.tic.dat" +}; +static const u8 MoonMarkRom[] = +{ + #include "../build/assets/moonmark.tic.dat" +}; +tic_script_config_extra MoonSyntaxConfigExtra = +{ + .name = "moon", + .demoRom = MoonDemoRom, + .demoRomSize = sizeof MoonDemoRom, + .markRom = MoonMarkRom, + .markRomSize = sizeof MoonMarkRom, +}; +#endif + +#if defined (TIC_BUILD_WITH_FENNEL) +static const u8 FennelDemoRom[] = +{ + #include "../build/assets/fenneldemo.tic.dat" +}; +/* does not exists +static const u8 FennelMarkRom[] = +{ + #include "../build/assets/fennelmark.tic.dat" +}; +*/ + +tic_script_config_extra FennelSyntaxConfigExtra = +{ + .name = "fennel", + .demoRom = FennelDemoRom, + .demoRomSize = sizeof FennelDemoRom, + .markRom = NULL, + .markRomSize = 0, +}; +#endif + + +#if defined(TIC_BUILD_WITH_JS) + +static const u8 JsDemoRom[] = +{ + #include "../build/assets/jsdemo.tic.dat" +}; + +static const u8 jsmark[] = +{ + #include "../build/assets/jsmark.tic.dat" +}; + +tic_script_config_extra JsSyntaxConfigExtra = +{ + .name = "js", + .demoRom = JsDemoRom, + .demoRomSize = sizeof JsDemoRom, + .markRom = jsmark, + .markRomSize = sizeof jsmark, +}; + +#endif + +#if defined(TIC_BUILD_WITH_WREN) + +static const u8 WrenDemoRom[] = +{ + #include "../build/assets/wrendemo.tic.dat" +}; + +static const u8 wrenmark[] = +{ + #include "../build/assets/wrenmark.tic.dat" +}; + +tic_script_config_extra WrenSyntaxConfigExtra = +{ + .name = "wren", + .demoRom = WrenDemoRom, + .demoRomSize = sizeof WrenDemoRom, + .markRom = wrenmark, + .markRomSize = sizeof wrenmark, +}; + +#endif + +#if defined (TIC_BUILD_WITH_SQUIRREL) +static const u8 SquirrelDemoRom[] = +{ + #include "../build/assets/squirreldemo.tic.dat" +}; + +static const u8 squirrelmark[] = +{ + #include "../build/assets/squirrelmark.tic.dat" +}; +tic_script_config_extra SquirrelSyntaxConfigExtra = +{ + .name = "squirrel", + .demoRom = SquirrelDemoRom, + .demoRomSize = sizeof SquirrelDemoRom, + .markRom = squirrelmark, + .markRomSize = sizeof squirrelmark, +}; +#endif + + +tic_script_config_extra* getConfigExtra(const tic_script_config* config) +{ + + for (tic_script_config_extra** conf = LanguagesExtra ; *conf != NULL; conf++ ) { + tic_script_config_extra* ln = *conf; + if (strcmp(config->name, ln->name) == 0) + { + return ln; + } + } + return NULL; +} + +tic_script_config_extra* LanguagesExtra[] = { +#if defined(TIC_BUILD_WITH_LUA) + &LuaSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_MOON) + &MoonSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_FENNEL) + &FennelSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_WREN) + &WrenSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_SQUIRREL) + &SquirrelSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_JS) + &JsSyntaxConfigExtra, +#endif + NULL +}; + + diff --git a/src/studio/demos.h b/src/studio/demos.h new file mode 100644 index 000000000..04a53445b --- /dev/null +++ b/src/studio/demos.h @@ -0,0 +1,15 @@ +#include "api.h" + +typedef struct +{ + const char* name; + const void* demoRom; + const s32 demoRomSize; + const void* markRom; + const s32 markRomSize; +} tic_script_config_extra; + + +extern tic_script_config_extra* LanguagesExtra[]; + +tic_script_config_extra* getConfigExtra(const tic_script_config* config); diff --git a/src/studio/project.c b/src/studio/project.c index b97889fa2..4c6fa71fc 100644 --- a/src/studio/project.c +++ b/src/studio/project.c @@ -22,7 +22,7 @@ #include "project.h" #include "tools.h" - +#include "api.h" #include #include #include @@ -120,28 +120,25 @@ static char* saveBinarySection(char* ptr, const char* comment, const char* tag, return ptr; } -static const struct Ext{const char* name; const char* comment;} ExtList[] = -{ -#define SCRIPT_DEF(_, ext, comment, ...) {ext, comment}, - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF -}; - static const char* projectComment(const char* name) { - FOR(const struct Ext*, ext, ExtList) - if(tic_tool_has_ext(name, ext->name)) - return ext->comment; - - return ExtList->comment; + FOR_EACH_LANG(ln) + { + if(tic_tool_has_ext(name, ln->fileExtension)) + return ln->projectComment; + } + FOR_EACH_LANG_END + return Languages[0]->projectComment; } bool tic_project_ext(const char* name) { - FOR(const struct Ext*, ext, ExtList) - if(tic_tool_has_ext(name, ext->name)) + FOR_EACH_LANG(ln) + { + if(tic_tool_has_ext(name, ln->fileExtension)) return true; - + } + FOR_EACH_LANG_END return false; } diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 9bf8719a1..2405a7af4 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -27,6 +27,7 @@ #include "studio/config.h" #include "ext/png.h" #include "zip.h" +#include "studio/demos.h" #if defined(TIC80_PRO) #include "studio/project.h" @@ -139,11 +140,7 @@ static const struct SpecRow {const char* section; const char* info;} SpecText1[] {"SPRITES", "256 8x8 tiles and 256 8x8 sprites."}, {"MAP", "240x136 cells, 1920x1088 pixels."}, {"SOUND", "4 channels with configurable waveforms."}, - {"CODE", "64KB of" -#define SCRIPT_DEF(name, ...) " "#name - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - "." + {"CODE", "64KB of $LANG_NAMES$.", }, }; @@ -203,26 +200,86 @@ struct CommandDesc char* src; }; -typedef enum -{ -#define SCRIPT_DEF(name, ...) name##_script, - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF -} ScriptLang; - -static const struct Script{ScriptLang lang; const char* name;} Scripts[] = -{ -#define SCRIPT_DEF(name, ...) {name##_script, #name}, - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF -}; - static const char* PngExt = PNG_EXT; #if defined(__EMSCRIPTEN__) #define CAN_ADDGET_FILE 1 #endif + +// You must free the result if result is non-NULL. TODO: find a better place for this function? +char *str_replace(char *orig, char *rep, char *with) { + char *result; // the return string + char *ins; // the next insert point + char *tmp; // varies + int len_rep; // length of rep (the string to remove) + int len_with; // length of with (the string to replace rep with) + int len_front; // distance between rep and end of last rep + int count; // number of replacements + + // sanity checks and initialization + if (!orig || !rep) + return NULL; + len_rep = strlen(rep); + if (len_rep == 0) + return NULL; // empty rep causes infinite loop during count + if (!with) + with = ""; + len_with = strlen(with); + + // count the number of replacements needed + ins = orig; + for (count = 0; tmp = strstr(ins, rep); ++count) { + ins = tmp + len_rep; + } + + tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1); + + if (!result) + return NULL; + + // first time through the loop, all the variable are set correctly + // from here on, + // tmp points to the end of the result string + // ins points to the next occurrence of rep in orig + // orig points to the remainder of orig after "end of rep" + while (count--) { + ins = strstr(orig, rep); + len_front = ins - orig; + tmp = strncpy(tmp, orig, len_front) + len_front; + tmp = strcpy(tmp, with) + len_with; + orig += len_front + len_rep; // move to next "end of rep" + } + strcpy(tmp, orig); + return result; +} + +static char* replaceHelpTokens(const char* text) +{ + char langnames[10240] = {0}; + char langextensions[10240] = {0}; + char langnamespipe[10240] = {0}; + FOR_EACH_LANG(ln) + strcat(langnames, ln->name); + strcat(langnames, " "); + + strcat(langextensions, ln->fileExtension); + strcat(langextensions, " "); + + strcat(langnamespipe, ln->name); + strcat(langnamespipe, "|"); + FOR_EACH_LANG_END + + + char* replaced1 = str_replace(text, "$LANG_NAMES$", langnames); + char* replaced2 = str_replace(replaced1, "$LANG_EXTENSIONS$", langextensions); + char* replaced3 = str_replace(replaced2, "$LANG_NAMES_PIPE$", langnamespipe); + free(replaced2); + free(replaced1); + return replaced3; +} + + static const char* getName(const char* name, const char* ext) { static char path[TICNAME_MAX]; @@ -550,21 +607,22 @@ static void loadCartSection(Console* console, const tic_cartridge* cart, const c memcpy(&tic->cart, cart, sizeof(tic_cartridge)); } -static const char* getDemoCartPath(ScriptLang script) +static const char* getDemoCartPath(char* path, tic_script_config* script) { - static const char* Paths[] = - { -#define SCRIPT_DEF(name, ...) [name##_script] = TIC_LOCAL_VERSION "default_" #name ".tic", - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - }; + //printf("Demo cart path of %s: ", script->name); + strcpy(path, TIC_LOCAL_VERSION "default_"); + strcat(path, script->name); + strcat(path, ".tic"); - return Paths[script]; + //printf("%s\n", path); + + return path; } -static void* getDemoCart(Console* console, ScriptLang script, s32* size) +static void* getDemoCart(Console* console, tic_script_config* script, s32* size) { - const char* path = getDemoCartPath(script); + char path[1024]; + getDemoCartPath(path, script); { void* data = tic_fs_loadroot(console->fs, path, size); @@ -572,96 +630,10 @@ static void* getDemoCart(Console* console, ScriptLang script, s32* size) if(data && *size) return data; } + tic_script_config_extra* ex = getConfigExtra(script); - const u8* demo = NULL; - s32 romSize = 0; - - switch(script) - { -#if defined(TIC_BUILD_WITH_LUA) - case lua_script: - { - static const u8 LuaDemoRom[] = - { - #include "../build/assets/luademo.tic.dat" - }; - - demo = LuaDemoRom; - romSize = sizeof LuaDemoRom; - } - break; -#endif - -#if defined(TIC_BUILD_WITH_MOON) - case moon_script: - { - static const u8 MoonDemoRom[] = - { - #include "../build/assets/moondemo.tic.dat" - }; - - demo = MoonDemoRom; - romSize = sizeof MoonDemoRom; - } - break; -#endif - -#if defined(TIC_BUILD_WITH_FENNEL) - case fennel_script: - { - static const u8 FennelDemoRom[] = - { - #include "../build/assets/fenneldemo.tic.dat" - }; - - demo = FennelDemoRom; - romSize = sizeof FennelDemoRom; - } - break; -#endif - -#if defined(TIC_BUILD_WITH_JS) - case js_script: - { - static const u8 JsDemoRom[] = - { - #include "../build/assets/jsdemo.tic.dat" - }; - - demo = JsDemoRom; - romSize = sizeof JsDemoRom; - } - break; -#endif - -#if defined(TIC_BUILD_WITH_WREN) - case wren_script: - { - static const u8 WrenDemoRom[] = - { - #include "../build/assets/wrendemo.tic.dat" - }; - - demo = WrenDemoRom; - romSize = sizeof WrenDemoRom; - } - break; -#endif - -#if defined(TIC_BUILD_WITH_SQUIRREL) - case squirrel_script: - { - static const u8 SquirrelDemoRom[] = - { - #include "../build/assets/squirreldemo.tic.dat" - }; - - demo = SquirrelDemoRom; - romSize = sizeof SquirrelDemoRom; - } - break; -#endif - } + const u8* demo = ex->demoRom; + s32 romSize = ex->demoRomSize; u8* data = calloc(1, sizeof(tic_cartridge)); @@ -685,7 +657,7 @@ static void setCartName(Console* console, const char* name, const char* path) strcpy(console->rom.path, path); } -static void onLoadDemoCommandConfirmed(Console* console, ScriptLang script) +static void onLoadDemoCommandConfirmed(Console* console, tic_script_config* script) { void* data = NULL; s32 size = 0; @@ -693,7 +665,9 @@ static void onLoadDemoCommandConfirmed(Console* console, ScriptLang script) console->showGameMenu = false; { - const char* name = getCartName(getDemoCartPath(script)); + char path[1024]; + getDemoCartPath(path, script); + const char* name = getCartName(path); setCartName(console, name, tic_fs_path(console->fs, name)); } @@ -1002,13 +976,13 @@ static void confirmCommand(Console* console, const char** text, s32 rows, Confir } } -typedef void(*LoadDemoConfirmCallback)(Console* console, ScriptLang script); +typedef void(*LoadDemoConfirmCallback)(Console* console, tic_script_config* script); typedef struct { Console* console; LoadDemoConfirmCallback callback; - ScriptLang script; + tic_script_config* script; } LoadDemoConfirmData; static void onLoadDemoConfirm(bool yes, void* data) @@ -1024,7 +998,7 @@ static void onLoadDemoConfirm(bool yes, void* data) free(demoData); } -static void onLoadDemoCommand(Console* console, ScriptLang script) +static void onLoadDemoCommand(Console* console, tic_script_config* script) { if(studioCartChanged()) { @@ -1067,8 +1041,9 @@ static void onLoadCommand(Console* console) } } -static void loadDemo(Console* console, ScriptLang script) +static void loadDemo(Console* console, tic_script_config* script) { + if (script == NULL) script = Languages[0]; // can be called with null, meaning first language (Lua) s32 size = 0; u8* data = getDemoCart(console, script, &size); @@ -1093,12 +1068,13 @@ static void onNewCommandConfirmed(Console* console) { const char* param = console->desc->params->key; - FOR(const struct Script*, script, Scripts) - if(strcmp(param, script->name) == 0) + FOR_EACH_LANG(ln) + if(strcmp(param, ln->name) == 0) { - loadDemo(console, script->lang); + loadDemo(console, ln); done = true; } + FOR_EACH_LANG_END if(!done) { @@ -1414,68 +1390,27 @@ static void onInstallDemosCommand(Console* console) } #endif -#if defined(TIC_BUILD_WITH_LUA) - static const u8 luamark[] = - { - #include "../build/assets/luamark.tic.dat" - }; -#endif - -#if defined(TIC_BUILD_WITH_MOON) - static const u8 moonmark[] = - { - #include "../build/assets/moonmark.tic.dat" - }; -#endif - -#if defined(TIC_BUILD_WITH_FENNEL) - static const u8 fennelmark[] = - { - #include "../build/assets/luamark.tic.dat" - }; -#endif - -#if defined(TIC_BUILD_WITH_JS) - static const u8 jsmark[] = - { - #include "../build/assets/jsmark.tic.dat" - }; -#endif - -#if defined(TIC_BUILD_WITH_SQUIRREL) - static const u8 squirrelmark[] = - { - #include "../build/assets/squirrelmark.tic.dat" - }; -#endif - -#if defined(TIC_BUILD_WITH_WREN) - static const u8 wrenmark[] = - { - #include "../build/assets/wrenmark.tic.dat" - }; -#endif - - static const struct Mark {const char* name; const u8* data; s32 size;} Marks[] = - { -#define SCRIPT_DEF(name, ...) {#name "mark.tic", name ## mark, sizeof name ## mark}, - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - }; - static const char* Bunny = "bunny"; tic_fs_makedir(fs, Bunny); tic_fs_changedir(fs, Bunny); - FOR(const struct Mark*, mark, Marks) + FOR_EACH_LANG(ln) { - tic_fs_save(fs, mark->name, data, tic_tool_unzip(data, sizeof(tic_cartridge), mark->data, mark->size), true); - printFront(console, Bunny); - printFront(console, "/"); - printFront(console, mark->name); - printLine(console); + tic_script_config_extra* ex = getConfigExtra(ln); + if (ex->markRom != NULL) { // having a Mark is not mandatory + char cartname[1024]; + strcpy(cartname, ln->name); + strcat(cartname, "mark.tic"); + + tic_fs_save(fs, cartname, data, tic_tool_unzip(data, sizeof(tic_cartridge), ex->markRom, ex->markRomSize), true); + printFront(console, Bunny); + printFront(console, "/"); + printFront(console, cartname); + printLine(console); + } } + FOR_EACH_LANG_END tic_fs_dirback(fs); } @@ -1523,9 +1458,10 @@ static void onConfigCommand(Console* console) onLoadDemoCommand(console, 0); else { - FOR(const struct Script*, script, Scripts) + FOR_EACH_LANG(script) if (strcmp(console->desc->params[1].key, script->name) == 0) - onLoadDemoCommand(console, script->lang); + onLoadDemoCommand(console, script); + FOR_EACH_LANG_END } } else @@ -2560,11 +2496,7 @@ static struct Command "new", NULL, "creates a new `Hello World` cartridge.", - "new [" -#define SCRIPT_DEF(name, ...) #name "|" - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF - "...]", + "new [$LANG_NAMES_PIPE$...]", onNewCommand }, { @@ -2581,10 +2513,7 @@ static struct Command { "save", NULL, - "save cartridge to the local filesystem, use " -#define SCRIPT_DEF(_, ext, ...) ext " " - SCRIPT_LIST(SCRIPT_DEF) -#undef SCRIPT_DEF + "save cartridge to the local filesystem, use $LANG_EXTENSIONS$" "cart extension to save it in text format (PRO feature).", "save ", onSaveCommand @@ -2965,12 +2894,16 @@ static void printUsage(Console* console, const char* command) if(strcmp(command, cmd->name) == 0) { consolePrint(console, "\n---=== COMMAND ===---\n", tic_color_green); - printBack(console, cmd->help); + char* helpReplaced = replaceHelpTokens(cmd->help); + printBack(console, helpReplaced); + free(helpReplaced); if(cmd->usage) { printFront(console, "\n\nusage: "); - printBack(console, cmd->usage); + char* usageReplaced = replaceHelpTokens(cmd->usage); + printBack(console, usageReplaced); + free(usageReplaced); } printLine(console); @@ -3089,8 +3022,10 @@ static void onHelp_spec(Console* console) FOR(const struct SpecRow*, row, SpecText1) { #define OFFSET 8 - sprintf(buf, "%-" DEF2STR(OFFSET) "s%s\n", row->section, row->info); + char* rowReplaced = replaceHelpTokens(row->info); + sprintf(buf, "%-" DEF2STR(OFFSET) "s%s\n", row->section, rowReplaced); consolePrintOffset(console, buf, tic_color_grey, OFFSET); + free(rowReplaced); #undef OFFSET } } From a759b98d64cd1cee93cbdb1ba529a1c70e8cb894 Mon Sep 17 00:00:00 2001 From: msx80 Date: Thu, 16 Sep 2021 11:13:00 +0200 Subject: [PATCH 046/379] Added Squirrel language which was previously disabled. Fixed C++ build flag --- build/baremetalpi/Makefile | 1 + build/baremetalpi/toolchain.cmake | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build/baremetalpi/Makefile b/build/baremetalpi/Makefile index c4d0bb1b4..a3f101b5e 100644 --- a/build/baremetalpi/Makefile +++ b/build/baremetalpi/Makefile @@ -29,6 +29,7 @@ LIBS := \ $(TIC80LIB)/liblua.a \ $(TIC80LIB)/libzip.a \ $(TIC80LIB)/libblipbuf.a \ + $(TIC80LIB)/libsquirrel.a \ $(TIC80LIB)/libwren.a \ $(TIC80LIB)/libargparse.a \ $(TIC80LIB)/libwave_writer.a \ diff --git a/build/baremetalpi/toolchain.cmake b/build/baremetalpi/toolchain.cmake index 27da7f946..bb9c3254e 100644 --- a/build/baremetalpi/toolchain.cmake +++ b/build/baremetalpi/toolchain.cmake @@ -26,13 +26,15 @@ get_filename_component(ARM_TOOLCHAIN_DIR ${BINUTILS_PATH} DIRECTORY) # removed squirrel language as it doesn't seem to compile under arm. Needs investigation. # More investigation: Squirrel builds correcly but the linked give these kinds of error: # arm-none-eabi-ld: error: kernel8-32.elf uses VFP register arguments, ../../build/lib/libsquirrel.a(sqapi.cpp.obj) does not - +# Even more investigation: turns out i was only setting CMAKE_C_FLAGS and not CMAKE_CXX_FLAGS. So C++ stuff was building without arm/rpi proper flags, VFP-related-stuff in particular. +# Now squirrel works. # Ideally should use the CFLAGS defined in circle build files, not hardwire them here too. # For RPI2 #set(CMAKE_C_FLAGS " -DMINIZ_NO_TIME -DTIC_BUILD_WITH_FENNEL -DTIC_BUILD_WITH_MOON -DTIC_BUILD_WITH_JS -DTIC_BUILD_WITH_WREN -DTIC_BUILD_WITH_LUA -DLUA_32BITS -std=c99 -march=armv7-a+neon-vfpv4 -D AARCH=32 -D __circle__ -D BAREMETALPI --specs=nosys.specs -O3 -mabi=aapcs -marm -mfloat-abi=hard -mfpu=neon-vfpv4 -D__DYNAMIC_REENT__") # For RPI3 # investigate -funsafe-math-optimizations and -march=armv8-a+crc -mcpu=cortex-a53 -set(CMAKE_C_FLAGS " -DMINIZ_NO_TIME -DTIC_BUILD_WITH_FENNEL -DTIC_BUILD_WITH_MOON -DTIC_BUILD_WITH_JS -DTIC_BUILD_WITH_WREN -DTIC_BUILD_WITH_LUA -DLUA_32BITS -std=c99 -march=armv8-a -D AARCH=32 -mtune=cortex-a53 -D __circle__ -D BAREMETALPI --specs=nosys.specs -O3 -marm -mfloat-abi=hard -mfpu=neon-fp-armv8 -funsafe-math-optimizations -D__DYNAMIC_REENT__") +set(CMAKE_C_FLAGS " -DMINIZ_NO_TIME -DLUA_32BITS -std=c99 -march=armv8-a -D AARCH=32 -mtune=cortex-a53 -D __circle__ -D BAREMETALPI --specs=nosys.specs -O3 -marm -mfloat-abi=hard -mfpu=neon-fp-armv8 -funsafe-math-optimizations -D__DYNAMIC_REENT__") +set(CMAKE_CXX_FLAGS " -DMINIZ_NO_TIME -DLUA_32BITS -march=armv8-a -D AARCH=32 -mtune=cortex-a53 -D __circle__ -D BAREMETALPI --specs=nosys.specs -O3 -marm -mfloat-abi=hard -mfpu=neon-fp-armv8 -funsafe-math-optimizations -D__DYNAMIC_REENT__") set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) From 4fa1d5988145a334a3fe0fc9a032ad551e797e7d Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 16 Sep 2021 15:36:46 +0300 Subject: [PATCH 047/379] #969: fixed cursor position on undo/redo --- src/studio/editors/code.c | 66 ++++++++++++++++++++++----------------- src/studio/editors/code.h | 19 +++++------ 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index 16a832dc8..d5369f7a3 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -41,7 +41,7 @@ typedef struct CodeState CodeState; -static_assert(sizeof(CodeState) == sizeof(u8), "CodeStateSize"); +static_assert(sizeof(CodeState) == 2, "CodeStateSize"); enum { @@ -50,12 +50,32 @@ enum #undef CODE_COLOR_DEF }; -static void history(Code* code) +static void packState(Code* code) { - if(history_add(code->history.code)) - history_add(code->history.cursor); + const char* src = code->src; + for(CodeState* s = code->state, *end = s + TIC_CODE_SIZE; s != end; ++s) + { + s->cursor = src == code->cursor.position; + s->sym = *src++; + } +} - history_add(code->history.state); +static void unpackState(Code* code) +{ + char* src = code->src; + for(CodeState* s = code->state, *end = s + TIC_CODE_SIZE; s != end; ++s) + { + if(s->cursor) + code->cursor.position = src; + + *src++ = s->sym; + } +} + +static void history(Code* code) +{ + packState(code); + history_add(code->history); } static void drawStatus(Code* code) @@ -818,7 +838,7 @@ static void deleteCode(Code* code, char* start, char* end) memmove(start, end, size); // delete code state - memmove(getState(code, start), getState(code, end), size); + memmove(getState(code, start), getState(code, end), size * sizeof(CodeState)); } static void insertCode(Code* code, char* dst, const char* src) @@ -831,8 +851,8 @@ static void insertCode(Code* code, char* dst, const char* src) // insert code state { CodeState* pos = getState(code, dst); - memmove(pos + size, pos, restSize); - memset(pos, 0, size); + memmove(pos + size, pos, restSize * sizeof(CodeState)); + memset(pos, 0, size * sizeof(CodeState)); } } @@ -1061,18 +1081,16 @@ static void update(Code* code) static void undo(Code* code) { - history_undo(code->history.code); - history_undo(code->history.cursor); - history_undo(code->history.state); + history_undo(code->history); + unpackState(code); update(code); } static void redo(Code* code) { - history_redo(code->history.code); - history_redo(code->history.cursor); - history_redo(code->history.state); + history_redo(code->history); + unpackState(code); update(code); } @@ -2176,9 +2194,7 @@ void initCode(Code* code, tic_mem* tic, tic_code* src) if(code->state != NULL) free(code->state); - if(code->history.code) history_delete(code->history.code); - if(code->history.cursor) history_delete(code->history.cursor); - if(code->history.state) history_delete(code->history.state); + if(code->history) history_delete(code->history); *code = (Code) { @@ -2190,12 +2206,7 @@ void initCode(Code* code, tic_mem* tic, tic_code* src) .scroll = {0, 0, {0, 0}, false}, .state = calloc(TIC_CODE_SIZE, sizeof(CodeState)), .tickCounter = 0, - .history = - { - .code = NULL, - .cursor = NULL, - .state = NULL, - }, + .history = NULL, .mode = TEXT_EDIT_MODE, .jump = {.line = -1}, .popup = @@ -2217,18 +2228,15 @@ void initCode(Code* code, tic_mem* tic, tic_code* src) .update = update, }; - code->history.code = history_create(code->src, sizeof(tic_code)); - code->history.cursor = history_create(&code->cursor, sizeof code->cursor); - code->history.state = history_create(code->state, sizeof(CodeState) * TIC_CODE_SIZE); + packState(code); + code->history = history_create(code->state, sizeof(CodeState) * TIC_CODE_SIZE); update(code); } void freeCode(Code* code) { + history_delete(code->history); free(code->state); - history_delete(code->history.code); - history_delete(code->history.cursor); - history_delete(code->history.state); free(code); } diff --git a/src/studio/editors/code.h b/src/studio/editors/code.h index b468615f2..49fce2095 100644 --- a/src/studio/editors/code.h +++ b/src/studio/editors/code.h @@ -58,9 +58,15 @@ struct Code struct CodeState { - u8 syntax:3; - u8 bookmark:1; - u8 temp:4; + struct + { + u8 syntax:3; + u8 bookmark:1; + u8 cursor:1; + u8 temp:3; + }; + + char sym; }* state; struct @@ -72,12 +78,7 @@ struct Code u32 tickCounter; - struct - { - struct History* code; - struct History* cursor; - struct History* state; - } history; + struct History* history; enum { From cdc3889922808b9a0e3b948dcdfab7d7f3e3d8a3 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 16 Sep 2021 17:09:11 +0300 Subject: [PATCH 048/379] #969: some code editor optimizations --- src/studio/editors/code.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index d5369f7a3..70196ca2a 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -57,7 +57,7 @@ static void packState(Code* code) { s->cursor = src == code->cursor.position; s->sym = *src++; - } + } } static void unpackState(Code* code) @@ -150,7 +150,7 @@ static void drawBookmarks(Code* code) s32 line = (tic_api_mouse(tic).y - rect.y) / STUDIO_TEXT_HEIGHT; - drawBitIcon(tic_icon_bookmark, rect.x, rect.y + line * STUDIO_TEXT_HEIGHT, tic_color_dark_grey); + drawBitIcon(tic_icon_bookmark, rect.x, rect.y + line * STUDIO_TEXT_HEIGHT - 1, tic_color_dark_grey); if(checkMouseClick(&rect, tic_mouse_left)) toggleBookmark(code, getPosByLine(code->src, line + code->scroll.y)); @@ -164,8 +164,8 @@ static void drawBookmarks(Code* code) { if(syntaxPointer++->bookmark) { - drawBitIcon(tic_icon_bookmark, rect.x, rect.y + y * STUDIO_TEXT_HEIGHT + 1, tic_color_black); - drawBitIcon(tic_icon_bookmark, rect.x, rect.y + y * STUDIO_TEXT_HEIGHT, tic_color_yellow); + drawBitIcon(tic_icon_bookmark, rect.x, rect.y + y * STUDIO_TEXT_HEIGHT, tic_color_black); + drawBitIcon(tic_icon_bookmark, rect.x, rect.y + y * STUDIO_TEXT_HEIGHT - 1, tic_color_yellow); } if(*pointer++ == '\n')y++; @@ -395,8 +395,8 @@ static inline bool isalnum_(char c) {return isalnum(c) || c == '_';} static void setCodeState(CodeState* state, u8 color, s32 start, s32 size) { - for(s32 i = start; i < (start + size); i++) - state[i].syntax = color; + for(CodeState* s = state + start, *end = s + size; s != end; ++s) + s->syntax = color; } static void parseCode(const tic_script_config* config, const char* start, CodeState* state) @@ -602,8 +602,8 @@ static void parseCode(const tic_script_config* config, const char* start, CodeSt static void parseSyntaxColor(Code* code) { - for(s32 i = 0; i < TIC_CODE_SIZE; i++) - code->state[i].syntax = SyntaxType_FG; + for(CodeState* s = code->state, *end = s + TIC_CODE_SIZE; s != end; ++s) + s->syntax = SyntaxType_FG; tic_mem* tic = code->tic; @@ -1530,8 +1530,8 @@ static void processKeyboard(Code* code) { if(ctrl && shift) { - for(s32 i = 0; i < TIC_CODE_SIZE; i++) - code->state[i].bookmark = 0; + for(CodeState* s = code->state, *end = s + TIC_CODE_SIZE; s != end; ++s) + s->bookmark = 0; } else if(ctrl) { From d84de494d31d06fbc095148d0601c53b39133945 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 17 Sep 2021 11:39:13 +0300 Subject: [PATCH 049/379] #1481: added cart drag & drop to the main window --- src/studio/screens/console.c | 13 +++++++++---- src/studio/screens/console.h | 1 + src/studio/studio.c | 10 ++++++++++ src/studio/system.h | 1 + src/system/sdl/main.c | 3 +++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 2405a7af4..b65ce1542 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -3633,7 +3633,6 @@ static bool cmdLoadCart(Console* console, const char* path) if(data) { - Start* start = getStartScreen(); const char* cartName = NULL; { @@ -3653,25 +3652,28 @@ static bool cmdLoadCart(Console* console, const char* path) { memcpy(&tic->cart, cart, sizeof(tic_cartridge)); free(cart); - done = start->embed = true; + done = true; } } else if(tic_tool_has_ext(cartName, CART_EXT)) { tic_cart_load(&tic->cart, data, size); - done = start->embed = true; + done = true; } #if defined(TIC80_PRO) else if(tic_project_ext(cartName)) { if(tic_project_load(cartName, data, size, &tic->cart)) - done = start->embed = true; + done = true; } #endif free(data); } + if(done) + studioRomLoaded(); + return done; } @@ -3697,6 +3699,7 @@ void initConsole(Console* console, tic_mem* tic, tic_fs* fs, tic_net* net, Confi .config = config, .loadByHash = loadByHash, .load = loadExt, + .loadCart = cmdLoadCart, .updateProject = updateProject, .error = error, .trace = trace, @@ -3762,6 +3765,8 @@ void initConsole(Console* console, tic_mem* tic, tic_fs* fs, tic_net* net, Confi printf("error: cart `%s` not loaded\n", args.cart); exit(1); } + else + getStartScreen()->embed = true; console->active = !start->embed; } diff --git a/src/studio/screens/console.h b/src/studio/screens/console.h index ef2cff3b5..1142467ea 100644 --- a/src/studio/screens/console.h +++ b/src/studio/screens/console.h @@ -104,6 +104,7 @@ struct Console CommandDesc* desc; void(*load)(Console*, const char* path); + bool(*loadCart)(Console*, const char* path); void(*loadByHash)(Console*, const char* name, const char* hash, const char* section, fs_done_callback callback, void* data); void(*updateProject)(Console*); void(*error)(Console*, const char*); diff --git a/src/studio/studio.c b/src/studio/studio.c index 6cdd1d9e8..7af9fbfd2 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -2044,6 +2044,15 @@ static void studioTick() #endif } +static void studioLoad(const char* file) +{ +#if defined(BUILD_EDITORS) + showPopupMessage(impl.console->loadCart(impl.console, file) + ? "cart successfully loaded :)" + : "error: cart not loaded :("); +#endif +} + static void studioClose() { { @@ -2201,6 +2210,7 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.cli |= args.cli; impl.studio.tick = studioTick; + impl.studio.load = studioLoad; impl.studio.close = studioClose; impl.studio.exit = exitStudio; impl.studio.config = getConfig; diff --git a/src/studio/system.h b/src/studio/system.h index 2cb259e6d..8d909b6d5 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -133,6 +133,7 @@ typedef struct void (*tick)(); void (*exit)(); void (*close)(); + void (*load)(const char* file); const StudioConfig* (*config)(); } Studio; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 51a8382f4..efc71f220 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1108,6 +1108,9 @@ void tic_sys_poll() if(strlen(event.text.text) == 1) platform.keyboard.text = event.text.text[0]; break; + case SDL_DROPFILE: + platform.studio->load(event.drop.file); + break; case SDL_QUIT: platform.studio->exit(); break; From c0a9c934b80b497be0d4d7af3b65cc4c69e17408 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 17 Sep 2021 11:41:50 +0300 Subject: [PATCH 050/379] #1597: fixed keyboard input on linux --- src/system/sdl/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index efc71f220..20fed89c3 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1128,7 +1128,7 @@ void tic_sys_poll() SCOPE(processKeyboard()) { #if defined(__LINUX__) - if(!lockInput) + if(lockInput) return; #endif } From 52939326532640fd1381930e5a436763cbe51e43 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 17 Sep 2021 15:50:21 +0300 Subject: [PATCH 051/379] #1566: fixed touch gamepad rendering --- src/system/sdl/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 20fed89c3..afdeafd32 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1239,15 +1239,15 @@ static void renderGamepad() GPU_Rect dest = { (float)tile->x, (float)tile->y, (float)tileSize, (float)tileSize}; GPU_BlitScale(platform.gamepad.touch.texture.gpu, &src, platform.screen.renderer.gpu, dest.x, dest.y, - (float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); + (float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); } else +#else { SDL_Rect src = {i * TIC_SPRITESIZE + Left, (tile->press ? TIC_SPRITESIZE : 0) + TIC80_MARGIN_TOP, TIC_SPRITESIZE, TIC_SPRITESIZE}; SDL_Rect dest = {tile->x, tile->y, tileSize, tileSize}; - SDL_RenderCopy(platform.screen.renderer.sdl, platform.gamepad.touch.texture.sdl, &src, &dest); + SDL_RenderCopy(platform.screen.renderer.sdl, platform.gamepad.touch.texture.sdl, &src, &dest); } -#else #endif } } From 9aebf1a1aa99b61cfdc428ad61840bc5e1f4e963 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 17 Sep 2021 16:29:17 +0300 Subject: [PATCH 052/379] #1566: sdl renderer fix --- src/system/sdl/main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index afdeafd32..063cdba85 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -492,7 +492,14 @@ static void initGPU() else #endif { - platform.screen.renderer.sdl = SDL_CreateRenderer(platform.window, -1, SDL_RENDERER_SOFTWARE); + platform.screen.renderer.sdl = SDL_CreateRenderer(platform.window, -1, +#if defined(CRT_SHADER_SUPPORT) + SDL_RENDERER_SOFTWARE +#else + SDL_RENDERER_ACCELERATED +#endif + ); + platform.screen.texture.sdl = SDL_CreateTexture(platform.screen.renderer.sdl, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); } From 60e63de918ae03bc9223097cc1369459d94cbb99 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 19 Sep 2021 13:45:07 +0300 Subject: [PATCH 053/379] #1232: noise detection fix --- src/core/sound.c | 2 +- src/studio/studio.c | 2 +- src/tools.c | 5 +++-- src/tools.h | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/core/sound.c b/src/core/sound.c index 43a9fec53..d202fad34 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -522,7 +522,7 @@ static void stereo_tick_end(tic_mem* memory, tic_sound_register_data* registers, const tic_sound_register* reg = &memory->ram.registers[i]; tic_sound_register_data* data = registers + i; - FLAT(®->waveform) + FLAT4(reg->waveform.data) ? runNoise(blip, reg, data, EndTime, volume) : runEnvelope(blip, reg, data, EndTime, volume); diff --git a/src/studio/studio.c b/src/studio/studio.c index 7af9fbfd2..8088c924d 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -282,7 +282,7 @@ s32 calcWaveAnimation(tic_mem* tic, u32 offset, s32 channel) { const tic_sound_register* reg = &tic->ram.registers[channel]; - s32 val = FLAT(reg->waveform.data) + s32 val = FLAT4(reg->waveform.data) ? (rand() & 1) * MAX_VOLUME : tic_tool_peek4(reg->waveform.data, ((offset * reg->freq) >> 7) % WAVE_VALUES); diff --git a/src/tools.c b/src/tools.c index 0812359a3..57d72ba90 100644 --- a/src/tools.c +++ b/src/tools.c @@ -176,9 +176,10 @@ bool tic_tool_empty(const void* buffer, s32 size) return true; } -bool tic_tool_flat(const void* buffer, s32 size) +bool tic_tool_flat4(const void* buffer, s32 size) { - u8 first = *(u8*)buffer; + u8 first = (*(u8*)buffer) & 0xf; + first |= first << 4; for(const u8 *ptr = buffer, *end = ptr + size; ptr < end;) if(*ptr++ != first) return false; diff --git a/src/tools.h b/src/tools.h index cfdea3f19..6a75861dc 100644 --- a/src/tools.h +++ b/src/tools.h @@ -93,8 +93,8 @@ u32 tic_tool_unzip(void* dest, s32 bufSize, const void* source, s32 size); bool tic_tool_empty(const void* buffer, s32 size); #define EMPTY(BUFFER) (tic_tool_empty((BUFFER), sizeof (BUFFER))) -bool tic_tool_flat(const void* buffer, s32 size); -#define FLAT(BUFFER) (tic_tool_flat((BUFFER), sizeof (BUFFER))) +bool tic_tool_flat4(const void* buffer, s32 size); +#define FLAT4(BUFFER) (tic_tool_flat4((BUFFER), sizeof (BUFFER))) u32 tic_nearest_color(const tic_rgb* palette, const tic_rgb* color, s32 count); From 9545efa998b5201e81a1706f88f84f701e967d8f Mon Sep 17 00:00:00 2001 From: SuperPupperDoggo <65412993+SuperPupperDoggo@users.noreply.github.com> Date: Wed, 6 Oct 2021 09:36:30 -0400 Subject: [PATCH 054/379] Add poke1() and peek1() functions --- src/core/core.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/core/core.c b/src/core/core.c index b48996b95..babf42152 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -89,6 +89,16 @@ void tic_api_poke4(tic_mem* memory, s32 address, u8 value) tic_api_poke(memory, address, value, 4); } +u8 tic_api_peek1(tic_mem* memory, s32 address) +{ + return tic_api_peek(memory, address, 1); +} + +void tic_api_poke1(tic_mem* memory, s32 address, u8 value) +{ + tic_api_poke(memory, address, value, 1); +} + void tic_api_memcpy(tic_mem* memory, s32 dst, s32 src, s32 size) { tic_core* core = (tic_core*)memory; From 1c20a8867110ecace396f4969be99cb0449b3409 Mon Sep 17 00:00:00 2001 From: SuperPupperDoggo <65412993+SuperPupperDoggo@users.noreply.github.com> Date: Wed, 6 Oct 2021 09:51:02 -0400 Subject: [PATCH 055/379] Added API calls for the different langs --- src/api/js.c | 20 ++++++++++++++++++++ src/api/lua.c | 33 +++++++++++++++++++++++++++++++++ src/api/squirrel.c | 28 ++++++++++++++++++++++++++++ src/api/wren.c | 20 ++++++++++++++++++++ 4 files changed, 101 insertions(+) diff --git a/src/api/js.c b/src/api/js.c index eac79321c..6560e5639 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -535,6 +535,26 @@ static duk_ret_t duk_poke4(duk_context* duk) return 0; } +static duk_ret_t duk_peek1(duk_context* duk) +{ + s32 address = duk_to_int(duk, 0); + + tic_mem* tic = (tic_mem*)getDukCore(duk); + duk_push_uint(duk, tic_api_peek1(tic, address)); + return 1; +} + +static duk_ret_t duk_poke1(duk_context* duk) +{ + s32 address = duk_to_int(duk, 0); + u8 value = duk_to_int(duk, 1); + + tic_mem* tic = (tic_mem*)getDukCore(duk); + tic_api_poke1(tic, address, value); + + return 0; +} + static duk_ret_t duk_memcpy(duk_context* duk) { s32 dest = duk_to_int(duk, 0); diff --git a/src/api/lua.c b/src/api/lua.c index 3aee86f98..70d45d238 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -132,6 +132,39 @@ static s32 lua_poke4(lua_State* lua) return 0; } +static s32 lua_peek1(lua_State* lua) +{ + s32 top = lua_gettop(lua); + tic_mem* tic = (tic_mem*)getLuaCore(lua); + + if(top == 1) + { + s32 address = getLuaNumber(lua, 1); + lua_pushinteger(lua, tic_api_peek1(tic, address)); + return 1; + } + else luaL_error(lua, "invalid parameters, peek1(addr)\n"); + + return 0; +} + +static s32 lua_poke1(lua_State* lua) +{ + s32 top = lua_gettop(lua); + tic_mem* tic = (tic_mem*)getLuaCore(lua); + + if(top == 2) + { + s32 address = getLuaNumber(lua, 1); + u8 value = getLuaNumber(lua, 2); + + tic_api_poke1(tic, address, value); + } + else luaL_error(lua, "invalid parameters, poke1(addr,val)\n"); + + return 0; +} + static s32 lua_cls(lua_State* lua) { s32 top = lua_gettop(lua); diff --git a/src/api/squirrel.c b/src/api/squirrel.c index d023ba281..d2d853a06 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -184,6 +184,34 @@ static SQInteger squirrel_poke4(HSQUIRRELVM vm) return 0; } +static SQInteger squirrel_peek1(HSQUIRRELVM vm) +{ + tic_mem* tic = (tic_mem*)getSquirrelCore(vm); + + // check number of args + if (sq_gettop(vm) != 2) + return sq_throwerror(vm, "invalid parameters, peek4(address)"); + s32 address = getSquirrelNumber(vm, 2); + + sq_pushinteger(vm, tic_api_peek1(tic, address)); + return 1; +} + +static SQInteger squirrel_poke1(HSQUIRRELVM vm) +{ + tic_mem* tic = (tic_mem*)getSquirrelCore(vm); + + if (sq_gettop(vm) != 3) + return sq_throwerror( vm, "invalid parameters, poke4(address,value)" ); + + s32 address = getSquirrelNumber(vm, 2); + u8 value = getSquirrelNumber(vm, 3); + + tic_api_poke1(tic, address, value); + + return 0; +} + static SQInteger squirrel_cls(HSQUIRRELVM vm) { SQInteger top = sq_gettop(vm); diff --git a/src/api/wren.c b/src/api/wren.c index f036a8bb5..a80e826e5 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -91,6 +91,8 @@ class TIC {\n\ foreign static poke(addr, val)\n\ foreign static peek4(addr)\n\ foreign static poke4(addr, val)\n\ + foreign static peek1(addr)\n\ + foreign static poke1(addr, val)\n\ foreign static memcpy(dst, src, size)\n\ foreign static memset(dst, src, size)\n\ foreign static pmem(index)\n\ @@ -986,6 +988,24 @@ static void wren_poke4(WrenVM* vm) tic_api_poke4(tic, address, value); } +static void wren_peek1(WrenVM* vm) +{ + tic_mem* tic = (tic_mem*)getWrenCore(vm); + + s32 address = getWrenNumber(vm, 1); + + wrenSetSlotDouble(vm, 0, tic_api_peek1(tic, address)); +} + +static void wren_poke1(WrenVM* vm) +{ + tic_mem* tic = (tic_mem*)getWrenCore(vm); + + s32 address = getWrenNumber(vm, 1); + u8 value = getWrenNumber(vm, 2); + + tic_api_poke1(tic, address, value); +} static void wren_memcpy(WrenVM* vm) { From 921c00f048eaa45d4292e23c9638f1374378a54e Mon Sep 17 00:00:00 2001 From: SuperPupperDoggo <65412993+SuperPupperDoggo@users.noreply.github.com> Date: Wed, 6 Oct 2021 10:02:27 -0400 Subject: [PATCH 056/379] Add functions to the API header --- src/api.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/api.h b/src/api.h index ac37c6b85..cef785d47 100644 --- a/src/api.h +++ b/src/api.h @@ -404,6 +404,29 @@ enum tic_mem*, s32 address, u8 value) \ \ \ + macro(peek1, \ + "peek1(addr) -> value", \ + \ + "This function enables you to read single-bit values from TIC's RAM.\n" \ + "The address should be specified in hexadecimal format.", \ + 1, \ + u8, \ + tic_mem*, s32 address) \ + \ + \ + macro(poke1, \ + "poke1(addr value)", \ + \ + "This function allows you to write to the virtual RAM of TIC.\n" \ + "It differs from `poke()` in that it accesses the individual bits of memory.\n" \ + "Therefore, to address the highest bit of position 0x4000 you should pass 0x16000 as addr1, " \ + "and to access the lowest bit (rightmost bit) you would pass 0x16007.\n" \ + "The address should be specified in hexadecimal format, and values should be given in decimal.", \ + 2, \ + void, \ + tic_mem*, s32 address, u8 value) \ + \ + \ macro(memcpy, \ "memcpy(dest source size)", \ \ From 64dd566cb1eb7d75bcafc5416a7e65ac6dfacffd Mon Sep 17 00:00:00 2001 From: Veikko Sariola <5684185+vsariola@users.noreply.github.com> Date: Sat, 9 Oct 2021 20:21:48 +0300 Subject: [PATCH 057/379] #714: fix crackling audio. Previously, the sound registers were used to synthesize fixed amount of sound after every TIC() and this was pushed to SDL. The problem with this approach was crackling if TIC() takes too long to reach 60Hz. In this fix, the sound registers are instead pushed to a ring buffer and the audio is synthesized in SDL callback to render audio. If the ring buffer does not have enough values, the sound synthesis uses the last good values from the ring buffer, so the music slows down yes, but at least it does not crackle. The corollary to this is that calling tic_core_tick_end(tic) is not enough during the Studio sound export; one should also call tic_core_synthesize_sound which does the job of pulling the sound registers from the tail of the ring buffer and doing the sound synthesis. The ring buffer is kept short on purpose, because if there slight desync between the TIC() frequency and sound frequency, the TIC() frequency might run faster and delay might build up. So, the ring buffer length sets a maximum on the delay that this technique can create. --- src/api.h | 1 + src/core/core.h | 10 ++++++++++ src/core/sound.c | 39 ++++++++++++++++++++++++++++++++------- src/studio/studio.c | 2 ++ src/system/sdl/main.c | 23 ++++++++++++++++------- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/api.h b/src/api.h index ac37c6b85..f321c780c 100644 --- a/src/api.h +++ b/src/api.h @@ -709,6 +709,7 @@ void tic_core_tick_start(tic_mem* memory); void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); void tic_core_blit(tic_mem* tic); +void tic_core_synthesize_sound(tic_mem* tic); void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb); const tic_script_config* tic_core_script_config(tic_mem* memory); diff --git a/src/core/core.h b/src/core/core.h index e3b41acfb..c2589db7f 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -28,6 +28,7 @@ #define CLOCKRATE (255<<13) #define TIC_DEFAULT_COLOR 15 +#define TIC_SOUND_RINGBUF_LEN 6 // in worst case, this induces ~ 6 tick delay i.e. 100 ms typedef struct { @@ -127,6 +128,15 @@ typedef struct tic_sound_register_data right[TIC_SOUND_CHANNELS]; } registers; + struct + { + tic_sound_register registers[TIC_SOUND_CHANNELS]; + tic_stereo_volume stereo; + } sound_ringbuf[TIC_SOUND_RINGBUF_LEN]; + + u32 sound_ringbuf_head; + u32 sound_ringbuf_tail; + struct { tic_channel_data channels[TIC_SOUND_CHANNELS]; diff --git a/src/core/sound.c b/src/core/sound.c index d202fad34..4ee9d3150 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -512,14 +512,15 @@ void tic_api_sfx(tic_mem* memory, s32 index, s32 note, s32 octave, s32 duration, setSfxChannelData(memory, index, note, octave, duration, channel, left, right, speed); } -static void stereo_tick_end(tic_mem* memory, tic_sound_register_data* registers, blip_buffer_t* blip, u8 stereoRight) +static void stereo_synthesize(tic_core* core, tic_sound_register_data* registers, blip_buffer_t* blip, u8 stereoRight) { enum { EndTime = CLOCKRATE / TIC80_FRAMERATE }; + s32 bufpos = (core->state.sound_ringbuf_tail + TIC_SOUND_RINGBUF_LEN - 1) % TIC_SOUND_RINGBUF_LEN; for (s32 i = 0; i < TIC_SOUND_CHANNELS; ++i) { - u8 volume = tic_tool_peek4(&memory->ram.stereo.data, stereoRight + i * 2); + u8 volume = tic_tool_peek4(&core->state.sound_ringbuf[bufpos].stereo, stereoRight + i * 2); - const tic_sound_register* reg = &memory->ram.registers[i]; + const tic_sound_register* reg = &core->state.sound_ringbuf[bufpos].registers[i]; tic_sound_register_data* data = registers + i; FLAT4(reg->waveform.data) @@ -532,6 +533,26 @@ static void stereo_tick_end(tic_mem* memory, tic_sound_register_data* registers, blip_end_frame(blip, EndTime); } +void tic_core_synthesize_sound(tic_mem* memory) +{ + tic_core* core = (tic_core*)memory; + + // synthesize sound using the register values found from the tail of the ring buffer + stereo_synthesize(core, core->state.registers.left, core->blip.left, 0); + stereo_synthesize(core, core->state.registers.right, core->blip.right, 1); + + blip_read_samples(core->blip.left, core->memory.samples.buffer, core->samplerate / TIC80_FRAMERATE, TIC_STEREO_CHANNELS); + blip_read_samples(core->blip.right, core->memory.samples.buffer + 1, core->samplerate / TIC80_FRAMERATE, TIC_STEREO_CHANNELS); + + // if the head has advanced, we can advance the tail too. Otherwise, we just + // keep synthesizing audio using the last known register values, so at least we don't get crackles + if (core->state.sound_ringbuf_tail != core->state.sound_ringbuf_head) { + // note: we assume storing a 32 bit integer is atomic, that should hold on pretty much any modern processor + // assuming it is aligned in memory (which it should be) + core->state.sound_ringbuf_tail = (core->state.sound_ringbuf_tail + 1) % TIC_SOUND_RINGBUF_LEN; + } +} + void tic_core_sound_tick_start(tic_mem* memory) { tic_core* core = (tic_core*)memory; @@ -556,9 +577,13 @@ void tic_core_sound_tick_end(tic_mem* memory) { tic_core* core = (tic_core*)memory; - stereo_tick_end(memory, core->state.registers.left, core->blip.left, 0); - stereo_tick_end(memory, core->state.registers.right, core->blip.right, 1); + // instead of synthesizing the sound right away, push the sound registers to the head of a ring buffer + core->state.sound_ringbuf[core->state.sound_ringbuf_head].stereo = memory->ram.stereo; + memcpy(&core->state.sound_ringbuf[core->state.sound_ringbuf_head], &memory->ram.registers, sizeof(tic_sound_register[4])); - blip_read_samples(core->blip.left, core->memory.samples.buffer, core->samplerate / TIC80_FRAMERATE, TIC_STEREO_CHANNELS); - blip_read_samples(core->blip.right, core->memory.samples.buffer + 1, core->samplerate / TIC80_FRAMERATE, TIC_STEREO_CHANNELS); + if (core->state.sound_ringbuf_head != (core->state.sound_ringbuf_tail + TIC_SOUND_RINGBUF_LEN - 2) % TIC_SOUND_RINGBUF_LEN) { + // note: we assume storing a 32 bit integer is atomic, that should hold on pretty much any modern processor + // assuming it is aligned in memory (which it should be) + core->state.sound_ringbuf_head = (core->state.sound_ringbuf_head + 1) % TIC_SOUND_RINGBUF_LEN; + } } diff --git a/src/studio/studio.c b/src/studio/studio.c index 8088c924d..cc1f9ef18 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -331,6 +331,7 @@ const char* studioExportSfx(s32 index, const char* filename) { tic_core_tick_start(tic); tic_core_tick_end(tic); + tic_core_synthesize_sound(tic); wave_write(tic->samples.buffer, tic->samples.size / sizeof(s16)); } @@ -379,6 +380,7 @@ const char* studioExportMusic(s32 track, const char* filename) tic->ram.registers[i].volume = 0; tic_core_tick_end(tic); + tic_core_synthesize_sound(tic); wave_write(tic->samples.buffer, tic->samples.size / sizeof(s16)); } diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 063cdba85..3c8f0c57a 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -164,6 +164,7 @@ static struct { SDL_AudioSpec spec; SDL_AudioDeviceID device; + s32 bufferRemaining; } audio; } platform #if defined(TOUCH_INPUT_SUPPORT) @@ -246,6 +247,19 @@ static void renderCopy(Renderer render, Texture tex, SDL_Rect src, SDL_Rect dst) } } +static void audioCallback(void* userdata,Uint8* stream,int len) { + tic_mem* tic = platform.studio->tic; + for (; len > 0; len--) { + if (platform.audio.bufferRemaining <= 0) { + tic_core_synthesize_sound(tic); + platform.audio.bufferRemaining = tic->samples.size; + } + *stream = ((Uint8*)tic->samples.buffer)[tic->samples.size - platform.audio.bufferRemaining]; + stream++; + platform.audio.bufferRemaining--; + } +} + static void initSound() { SDL_AudioSpec want = @@ -254,6 +268,8 @@ static void initSound() .format = AUDIO_S16, .channels = TIC_STEREO_CHANNELS, .userdata = NULL, + .callback = audioCallback, + .samples = 1024 }; platform.audio.device = SDL_OpenAudioDevice(NULL, 0, &want, &platform.audio.spec, 0); @@ -1154,12 +1170,6 @@ bool tic_sys_keyboard_text(char* text) return true; } -static void blitSound() -{ - tic_mem* tic = platform.studio->tic; - SDL_QueueAudio(platform.audio.device, tic->samples.buffer, tic->samples.size); -} - #if defined(TOUCH_INPUT_SUPPORT) static void renderKeyboard() @@ -1516,7 +1526,6 @@ static void gpuTick() #endif renderPresent(platform.screen.renderer); - blitSound(); platform.keyboard.text = '\0'; } From 3b4331bfb25f3fee6352a92f80c5431a0579536b Mon Sep 17 00:00:00 2001 From: Veikko Sariola <5684185+vsariola@users.noreply.github.com> Date: Sun, 10 Oct 2021 02:02:19 +0300 Subject: [PATCH 058/379] Optimize tic api call performance in LUA. Previously, the tic_core* was associated with a global variable named "_TIC80" and every api call fetches the tic_core by finding the global with this name. Finding the global variable with that name took surprising amount of time, according to profiling. With this optimization, each API function is associated with tic_core* through lua_pushcclosure mechanism. Closures are functions that are associated with certain "upvalues". Fetching an upvalue is very fast in LUA. checkForceExit still fetches the tic_core from the global, as the hook is an ordinary function, not a global. --- src/api/lua.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/api/lua.c b/src/api/lua.c index 3aee86f98..d71802c73 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -45,11 +45,18 @@ static s32 getLuaNumber(lua_State* lua, s32 index) static void registerLuaFunction(tic_core* core, lua_CFunction func, const char *name) { - lua_pushcfunction(core->currentVM, func); + lua_pushlightuserdata(core->currentVM, core); + lua_pushcclosure(core->currentVM, func, 1); lua_setglobal(core->currentVM, name); } static tic_core* getLuaCore(lua_State* lua) +{ + tic_core* core = lua_touserdata(lua, lua_upvalueindex(1)); + return core; +} + +static tic_core* getLuaCoreGlobal(lua_State* lua) { lua_getglobal(lua, TicCore); tic_core* core = lua_touserdata(lua, -1); @@ -1356,7 +1363,7 @@ static void lua_open_builtins(lua_State *lua) static void checkForceExit(lua_State *lua, lua_Debug *luadebug) { - tic_core* core = getLuaCore(lua); + tic_core* core = getLuaCoreGlobal(lua); tic_tick_data* tick = core->data; From 29c7fc2034d17700711638c3ad385edd50e627ae Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Wed, 13 Oct 2021 19:22:22 -0700 Subject: [PATCH 059/379] Copy off src field of CommandDesc before tokenizing command string. The CommandDesc struct has two relevant fields here: src and command. The src field is supposed to contain the source of the entire input while the command field is supposed to contain just the name of the command being invoked; aka everything before the first space. We would start with input like this: eval trace("hello" .. "world") What we want is: src: eval trace("hello" .. "world") command: eval The src field was set to a copy of the input, and then the command field was set to running strtok on src to find the first space. But even though strtok returns what looks like a string, it's actually just pointing to the same copy of src which now happens to have been terminated right where the first space used to be. So what we got was just: src: eval command: eval The fix is to copy the input into src and command fields separately and only call strtok on command, allowing src to be left alone. Finally since src and command are now separate strings we must free them separately rather than only freeing src. --- src/studio/screens/console.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index b65ce1542..b8dbf3c0a 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -453,6 +453,7 @@ static void commandDoneLine(Console* console, bool newLine) clearSelection(console); FREE(console->desc->src); + FREE(console->desc->command); FREE(console->desc->params); memset(console->desc, 0, sizeof(CommandDesc)); @@ -3100,11 +3101,12 @@ static void onHelpCommand(Console* console) commandDone(console); } -static CommandDesc parseCommand(const char* command) +static CommandDesc parseCommand(const char* input) { - CommandDesc desc = {.src = strdup(command)}; + CommandDesc desc = {.src = strdup(input), + .command = strdup(input)}; - char* token = desc.command = strtok(desc.src, " "); + char* token = strtok(desc.command, " "); while((token = strtok(NULL, " "))) { From f62cce3e247cfe0b2a0ef9f6e78991028249846b Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Wed, 13 Oct 2021 19:23:12 -0700 Subject: [PATCH 060/379] Use full input (minus command) as argument to eval. Previously we used parsed params which was incorrect and stopped at the first space. --- src/studio/screens/console.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index b8dbf3c0a..38631a76f 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2318,7 +2318,8 @@ static void onEvalCommand(Console* console) if (script_config->eval) { if(console->desc->count) - script_config->eval(console->tic, console->desc->params->key); + script_config->eval(console->tic, + console->desc->src+strlen(console->desc->command)); else printError(console, "nothing to eval"); } else From 82b05362af2f4f04a4a75f83013f4dd5ea988ecb Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Sat, 30 Oct 2021 10:13:20 -0700 Subject: [PATCH 061/379] Activate strict mode in Fennel when strict: true header is found. Global mode makes it so that it is a compile error to refer to a global which doesn't exist yet. Using (global foo {}) will declare foo as a global which can be used after the declaration, or you can always bypass the checks using _G.foo. This will catch a lot of errors earlier on during the compilation process instead of at runtime. This should have been on by default from the start. But better late than never. =) We change the demo Fennel cart to add the strict header by default for new games, but it's easy to delete for users who want the more Lua-like global behavior. --- build/assets/fenneldemo.tic.dat | 2 +- demos/fenneldemo.fnl | 6 +++--- src/api/lua.c | 8 ++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/build/assets/fenneldemo.tic.dat b/build/assets/fenneldemo.tic.dat index be0dcb3e2..9f5e68dc7 100644 --- a/build/assets/fenneldemo.tic.dat +++ b/build/assets/fenneldemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0xbd, 0x4b, 0xc3, 0x50, 0x10, 0x8f, 0x82, 0x4b, 0xf0, 0x2f, 0x10, 0x87, 0x53, 0x10, 0x5f, 0xfc, 0xa0, 0x9f, 0x14, 0x6d, 0x45, 0x10, 0x15, 0x14, 0x0a, 0x05, 0x15, 0x3b, 0x48, 0x87, 0xda, 0x3e, 0xb5, 0x10, 0x93, 0x98, 0x3c, 0xb5, 0x0e, 0xae, 0x92, 0xc1, 0x51, 0x70, 0x75, 0x52, 0x09, 0x19, 0x74, 0x72, 0x7d, 0xb8, 0x29, 0x4f, 0xff, 0x92, 0x12, 0x1d, 0x8a, 0x8e, 0x7a, 0x2f, 0xa9, 0x5f, 0x50, 0x74, 0x70, 0x70, 0xf1, 0x5e, 0x2e, 0xb9, 0x7b, 0xf7, 0xfb, 0xdd, 0x5d, 0xf8, 0x75, 0xc7, 0x15, 0xa5, 0xa7, 0x77, 0xa4, 0x34, 0x58, 0xba, 0x9c, 0x5c, 0x7c, 0xd8, 0x2f, 0xbe, 0xdc, 0x6d, 0x9f, 0x3d, 0x5a, 0x63, 0x57, 0xd5, 0x81, 0xad, 0x3d, 0x2d, 0x63, 0xe6, 0x4a, 0x37, 0x53, 0xa7, 0x4f, 0xce, 0xc3, 0x73, 0xb3, 0xd9, 0x3c, 0xba, 0xb8, 0x5e, 0xd6, 0x0f, 0x52, 0x13, 0xc5, 0x8e, 0x93, 0x4e, 0xe5, 0x27, 0xbb, 0x17, 0x68, 0xae, 0xeb, 0xfa, 0x9e, 0xe7, 0xf9, 0xf2, 0x8b, 0xa9, 0x2f, 0xf8, 0xbb, 0x0b, 0xd1, 0x08, 0x5c, 0x57, 0x04, 0x9e, 0xc7, 0x03, 0xf7, 0x9c, 0x07, 0xc2, 0xe7, 0x82, 0xfb, 0x9c, 0xbf, 0x79, 0x7b, 0xbe, 0xf8, 0x96, 0x2f, 0x3e, 0xf1, 0x95, 0x7f, 0xfb, 0x53, 0x0b, 0xb5, 0x92, 0xda, 0x85, 0xe7, 0x36, 0x8c, 0x0f, 0x51, 0x47, 0xa1, 0x70, 0x81, 0xda, 0xde, 0x0b, 0x5f, 0x11, 0xa8, 0x5d, 0xc3, 0x47, 0xfd, 0xbc, 0x96, 0x4b, 0x3d, 0x15, 0xde, 0x08, 0x84, 0x08, 0x82, 0xdf, 0xf2, 0xbb, 0x8e, 0x3b, 0x94, 0x5c, 0x0e, 0x58, 0x8d, 0xe9, 0x34, 0x0b, 0xb0, 0x5e, 0xde, 0xa4, 0x51, 0xa2, 0xe2, 0x6d, 0x79, 0x9b, 0x6d, 0x98, 0x76, 0x36, 0xba, 0xad, 0xd2, 0x1d, 0xaa, 0x9b, 0x16, 0xb5, 0x65, 0xa5, 0x4a, 0x9d, 0x0a, 0xc2, 0xc1, 0xc1, 0x3a, 0x0b, 0x33, 0xbb, 0x66, 0xb1, 0x9a, 0x69, 0xc8, 0x62, 0x94, 0x64, 0x61, 0x8d, 0x1a, 0x06, 0xd5, 0x55, 0x95, 0xec, 0x94, 0x6d, 0x60, 0x10, 0xd7, 0xa2, 0xa8, 0x0e, 0xe3, 0x99, 0x56, 0xb8, 0x07, 0xc9, 0xb4, 0x86, 0x80, 0x75, 0xdd, 0x5c, 0x2d, 0xeb, 0xb0, 0x34, 0x3f, 0xad, 0x02, 0x59, 0x33, 0x70, 0x83, 0x0a, 0xac, 0x94, 0x54, 0x00, 0xb2, 0xbb, 0x41, 0x0d, 0x20, 0xab, 0xcc, 0x40, 0x3a, 0x10, 0x87, 0x32, 0xe4, 0x90, 0x51, 0x7c, 0x25, 0x34, 0x4d, 0xfb, 0x0a, 0x48, 0x7c, 0x00, 0x86, 0xdb, 0x02, 0x92, 0x2d, 0x40, 0x5d, 0x76, 0xa8, 0xb7, 0x01, 0xa4, 0x3e, 0x00, 0xc3, 0x9f, 0x00, 0x15, 0xdd, 0x91, 0xcb, 0x63, 0xe4, 0x58, 0xb6, 0x2c, 0x25, 0x80, 0x0c, 0x01, 0x89, 0xc5, 0x80, 0x0c, 0xe0, 0x7f, 0x65, 0x70, 0xb3, 0x14, 0x7a, 0x32, 0x44, 0x87, 0x56, 0x97, 0xf3, 0xd3, 0x90, 0x82, 0x38, 0x9e, 0x24, 0x56, 0x24, 0xd9, 0xb2, 0x6b, 0x06, 0x83, 0xfe, 0xb9, 0xd9, 0x7c, 0xbe, 0x00, 0xc5, 0xc2, 0x42, 0x7e, 0xa6, 0xaf, 0x1f, 0xc6, 0xd2, 0xf8, 0x44, 0xbd, 0x71, 0x30, 0x93, 0xdd, 0x59, 0x38, 0x58, 0x53, 0x5f, 0x01, 0x25, 0xf0, 0x39, 0x54, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0x3b, 0x4b, 0xc3, 0x50, 0x14, 0x4e, 0x05, 0x97, 0xe2, 0x2f, 0x10, 0x87, 0xa3, 0x50, 0x4c, 0x7c, 0xf6, 0x45, 0xd1, 0x56, 0x04, 0x51, 0x51, 0xa1, 0x20, 0xa8, 0xd8, 0x41, 0x8a, 0xd4, 0xf6, 0xaa, 0x81, 0x98, 0xc6, 0xe4, 0x56, 0xeb, 0xe0, 0x2a, 0x19, 0x1c, 0x1d, 0x1d, 0x9c, 0x54, 0x42, 0x06, 0x9d, 0x5c, 0x2f, 0x6e, 0xca, 0xb5, 0xbf, 0xa4, 0xa4, 0x0e, 0x45, 0x47, 0x3d, 0x37, 0xa9, 0x2f, 0x28, 0x3a, 0x38, 0xb8, 0x78, 0x6e, 0x4e, 0x72, 0x1e, 0xdf, 0x77, 0xce, 0x0d, 0x5f, 0x57, 0x54, 0x92, 0xba, 0x7b, 0x86, 0xf2, 0xfd, 0xf9, 0xeb, 0xc9, 0xe5, 0xc6, 0x61, 0xee, 0xe5, 0xa1, 0x72, 0xf1, 0x68, 0x8c, 0xdd, 0x94, 0x22, 0xbb, 0x07, 0x4a, 0xaa, 0x9c, 0xc9, 0xdf, 0x4d, 0x9d, 0x3f, 0x59, 0x8d, 0xe7, 0x66, 0xb3, 0x79, 0x72, 0x75, 0xbb, 0xaa, 0x1d, 0x25, 0x26, 0x72, 0xa1, 0xb3, 0x0e, 0xe9, 0x27, 0xab, 0x71, 0x34, 0xdb, 0xb6, 0x5d, 0xc7, 0x71, 0x5c, 0xf1, 0xc5, 0xd4, 0xe5, 0xec, 0xdd, 0x39, 0xaf, 0x7b, 0xb6, 0xcd, 0x3d, 0xc7, 0x61, 0x9e, 0x7d, 0xc9, 0x3c, 0xee, 0x32, 0xce, 0x5c, 0xc6, 0xde, 0xbc, 0x3d, 0x9f, 0x7f, 0xcb, 0xe7, 0x9f, 0xf8, 0xd2, 0xbf, 0xfd, 0xa9, 0xf9, 0x5a, 0x09, 0xed, 0xfc, 0x73, 0xef, 0xc7, 0xc7, 0xa8, 0x23, 0x97, 0x18, 0x47, 0x6d, 0x6b, 0xdc, 0x95, 0x38, 0x6a, 0x57, 0x77, 0x51, 0x3f, 0xa7, 0xe5, 0x42, 0x4f, 0x89, 0xd5, 0x3d, 0xce, 0x3d, 0xef, 0xb7, 0xfc, 0xce, 0xd3, 0x90, 0x94, 0xc9, 0x00, 0x55, 0xa9, 0x46, 0xd2, 0x00, 0x5b, 0x85, 0x1d, 0x12, 0x24, 0x61, 0xac, 0x16, 0x2a, 0x74, 0xbb, 0x6c, 0xa6, 0x83, 0x6a, 0x89, 0xec, 0x11, 0xad, 0x6c, 0x10, 0x53, 0x74, 0x4a, 0xc4, 0x2a, 0x22, 0x1c, 0x2c, 0xec, 0x53, 0x3f, 0x33, 0x55, 0x83, 0xaa, 0x65, 0x5d, 0x34, 0x83, 0x24, 0x0d, 0x9b, 0x44, 0xd7, 0x89, 0xe6, 0x57, 0xa8, 0xa9, 0x16, 0xb1, 0x42, 0xcd, 0x0a, 0x09, 0x87, 0xe5, 0xbd, 0x82, 0x09, 0x14, 0xa2, 0x4a, 0x10, 0x55, 0x61, 0x3c, 0xd5, 0x0a, 0x0f, 0x20, 0x9e, 0x54, 0x10, 0xb0, 0xa9, 0xc3, 0xfa, 0xdc, 0xc8, 0xca, 0xc2, 0x34, 0xac, 0xe5, 0xc3, 0x00, 0xf2, 0xfe, 0x36, 0xd1, 0x41, 0xde, 0xa0, 0x3a, 0x92, 0x40, 0xb6, 0x08, 0x45, 0xa4, 0x3c, 0x8c, 0xaf, 0x98, 0xa2, 0x28, 0x5f, 0x01, 0xb1, 0x0f, 0xc0, 0x60, 0x5b, 0x40, 0xbc, 0x05, 0xa8, 0x8a, 0x09, 0xd5, 0x36, 0x80, 0xc4, 0x07, 0x60, 0xf0, 0x13, 0xa0, 0xa8, 0x59, 0xe2, 0xca, 0x18, 0x59, 0x86, 0x29, 0x5a, 0x31, 0x90, 0x07, 0x40, 0x1e, 0x1d, 0x05, 0x39, 0x82, 0x7f, 0x93, 0xc2, 0x9b, 0x25, 0xd0, 0xe3, 0x3e, 0xda, 0xb7, 0xaa, 0xd8, 0x9f, 0x84, 0x04, 0x44, 0xf1, 0xc4, 0xb1, 0x23, 0xc8, 0x86, 0xa9, 0xea, 0x14, 0xfa, 0xe6, 0x67, 0xb3, 0xd9, 0x45, 0xc8, 0x2d, 0x2e, 0x65, 0x67, 0x7a, 0xfb, 0x60, 0x2c, 0x89, 0x4f, 0x30, 0x1b, 0x17, 0x53, 0x31, 0x9d, 0x06, 0x8b, 0x5f, 0x01, 0x32, 0x49, 0x3b, 0x34, \ No newline at end of file diff --git a/demos/fenneldemo.fnl b/demos/fenneldemo.fnl index 6f00dd1ec..aa73f312d 100644 --- a/demos/fenneldemo.fnl +++ b/demos/fenneldemo.fnl @@ -2,13 +2,13 @@ ;; author: game developer ;; desc: short description ;; script: fennel +;; strict: true (var t 0) (var x 96) (var y 24) -(global TIC - (fn tic [] +(fn _G.TIC [] (when (btn 0) (set y (- y 1))) (when (btn 1) (set y (+ y 1))) (when (btn 2) (set x (- x 1))) @@ -17,7 +17,7 @@ (spr (+ 1 (* (// (% t 60) 30) 2)) x y 14 3 0 0 2 2) (print "HELLO WORLD!" 84 84) - (set t (+ t 1)))) + (set t (+ t 1))) ;; ;; 001:eccccccccc888888caaaaaaaca888888cacccccccacc0ccccacc0ccccacc0ccc diff --git a/src/api/lua.c b/src/api/lua.c index 3aee86f98..8eeeb1602 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1830,8 +1830,12 @@ const tic_script_config* get_moon_script_config() #define FENNEL_CODE(...) #__VA_ARGS__ static const char* execute_fennel_src = FENNEL_CODE( - local opts = {filename="game", correlate=true, allowedGlobals=false} - local ok, msg = pcall(require('fennel').eval, ..., opts) + local fennel = require("fennel") + debug.traceback = fennel.traceback + local opts = {filename="game", allowedGlobals = false} + local src = ... + if(src:find("\n;; strict: true")) then opts.allowedGlobals = nil end + local ok, msg = pcall(fennel.eval, src, opts) if(not ok) then return msg end ); From 1a4e61a43891a46380360fb21471a9523c794de4 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 1 Nov 2021 14:08:04 +0300 Subject: [PATCH 062/379] "#1629: removed infinite loops checking to improve performance" --- src/api.h | 2 -- src/api/js.c | 16 ---------------- src/api/lua.c | 30 +----------------------------- src/api/squirrel.c | 13 ------------- src/studio/screens/run.c | 10 ---------- 5 files changed, 1 insertion(+), 70 deletions(-) diff --git a/src/api.h b/src/api.h index ac37c6b85..e422c2118 100644 --- a/src/api.h +++ b/src/api.h @@ -35,14 +35,12 @@ typedef void(*RemapFunc)(void*, s32 x, s32 y, RemapResult* result); typedef void(*TraceOutput)(void*, const char*, u8 color); typedef void(*ErrorOutput)(void*, const char*); typedef void(*ExitCallback)(void*); -typedef bool(*CheckForceExit)(void*); typedef struct { TraceOutput trace; ErrorOutput error; ExitCallback exit; - CheckForceExit forceExit; u64 (*counter)(void*); u64 (*freq)(void*); diff --git a/src/api/js.c b/src/api/js.c index eac79321c..0a263e00f 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -907,16 +907,6 @@ static duk_ret_t duk_fset(duk_context* duk) return 0; } -static u64 ForceExitCounter = 0; - -s32 duk_timeout_check(void* udata) -{ - tic_core* core = (tic_core*)udata; - tic_tick_data* tick = core->data; - - return ForceExitCounter++ > 1000 ? tick->forceExit && tick->forceExit(tick->data) : false; -} - static void initDuktape(tic_core* core) { closeJavascript((tic_mem*)core); @@ -960,8 +950,6 @@ static bool initJavascript(tic_mem* tic, const char* code) static void callJavascriptTick(tic_mem* tic) { - ForceExitCounter = 0; - tic_core* core = (tic_core*)tic; duk_context* duk = core->currentVM; @@ -1134,8 +1122,4 @@ const tic_script_config* get_js_script_config() return &JsSyntaxConfig; } -#else - -s32 duk_timeout_check(void* udata){return 0;} - #endif /* defined(TIC_BUILD_WITH_JS) */ diff --git a/src/api/lua.c b/src/api/lua.c index d71802c73..7a807ddb3 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -31,14 +31,9 @@ #include #include -#define LUA_LOC_STACK 100000000 - -static const char TicCore[] = "_TIC80"; - s32 luaopen_lpeg(lua_State *lua); -// !TODO: get rid of this wrap -static s32 getLuaNumber(lua_State* lua, s32 index) +static inline s32 getLuaNumber(lua_State* lua, s32 index) { return (s32)lua_tonumber(lua, index); } @@ -56,14 +51,6 @@ static tic_core* getLuaCore(lua_State* lua) return core; } -static tic_core* getLuaCoreGlobal(lua_State* lua) -{ - lua_getglobal(lua, TicCore); - tic_core* core = lua_touserdata(lua, -1); - lua_pop(lua, 1); - return core; -} - static s32 lua_peek(lua_State* lua) { s32 top = lua_gettop(lua); @@ -1361,21 +1348,8 @@ static void lua_open_builtins(lua_State *lua) } } -static void checkForceExit(lua_State *lua, lua_Debug *luadebug) -{ - tic_core* core = getLuaCoreGlobal(lua); - - tic_tick_data* tick = core->data; - - if(tick->forceExit && tick->forceExit(tick->data)) - luaL_error(lua, "script execution was interrupted"); -} - static void initAPI(tic_core* core) { - lua_pushlightuserdata(core->currentVM, core); - lua_setglobal(core->currentVM, TicCore); - #define API_FUNC_DEF(name, ...) {lua_ ## name, #name}, static const struct{lua_CFunction func; const char* name;} ApiItems[] = {TIC_API_LIST(API_FUNC_DEF)}; #undef API_FUNC_DEF @@ -1385,8 +1359,6 @@ static void initAPI(tic_core* core) registerLuaFunction(core, lua_dofile, "dofile"); registerLuaFunction(core, lua_loadfile, "loadfile"); - - lua_sethook(core->currentVM, &checkForceExit, LUA_MASKCOUNT, LUA_LOC_STACK); } static void closeLua(tic_mem* tic) diff --git a/src/api/squirrel.c b/src/api/squirrel.c index d023ba281..64b6dc4b2 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -25,7 +25,6 @@ #if defined(TIC_BUILD_WITH_SQUIRREL) //#define USE_FOREIGN_POINTER -//#define CHECK_FORCE_EXIT #include #include @@ -1448,15 +1447,6 @@ static void squirrel_open_builtins(HSQUIRRELVM vm) sq_poptop(vm); } -static void checkForceExit(HSQUIRRELVM vm, SQInteger type, const SQChar* sourceName, SQInteger line, const SQChar* functionName) -{ - tic_core* core = getSquirrelCore(vm); - tic_tick_data* tick = core->data; - - if(tick && tick->forceExit && tick->forceExit(tick->data)) - sq_throwerror(vm, "script execution was interrupted"); -} - static void initAPI(tic_core* core) { HSQUIRRELVM vm = core->currentVM; @@ -1483,9 +1473,6 @@ static void initAPI(tic_core* core) registerSquirrelFunction(core, squirrel_dofile, "dofile"); registerSquirrelFunction(core, squirrel_loadfile, "loadfile"); -#if CHECK_FORCE_EXIT - sq_setnativedebughook(vm, checkForceExit); -#endif sq_enabledebuginfo(vm, SQTrue); } diff --git a/src/studio/screens/run.c b/src/studio/screens/run.c index 415e4ead8..87f04e447 100644 --- a/src/studio/screens/run.c +++ b/src/studio/screens/run.c @@ -117,15 +117,6 @@ static void tick(Run* run) setStudioMode(TIC_CONSOLE_MODE); } -static bool forceExit(void* data) -{ - tic_sys_poll(); - - tic_mem* tic = ((Run*)data)->tic; - - return tic_api_key(tic, tic_key_escape); -} - static u64 getFreq(void* data) { return tic_sys_freq_get(); @@ -157,7 +148,6 @@ void initRun(Run* run, Console* console, tic_fs* fs, tic_mem* tic) .start = 0, .data = run, .exit = onExit, - .forceExit = forceExit, }, }; From 18bdaf208d36c9242b99c44dc18b357af23cc35f Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 1 Nov 2021 14:14:00 +0300 Subject: [PATCH 063/379] Github CI Ubuntu fix --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 329d904c6..3899bda31 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -108,7 +108,7 @@ jobs: # === Ubuntu PRO === linux-pro: - runs-on: ubuntu-16.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -130,7 +130,7 @@ jobs: # === Ubuntu === linux: - runs-on: ubuntu-16.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 From 602d90893ab526aec910fd79a5da2e8ed7642da5 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 1 Nov 2021 18:45:30 +0300 Subject: [PATCH 064/379] Some code refactoring for the #1618 --- include/tic80.h | 1 + src/api.h | 2 +- src/core/sound.c | 2 +- src/studio/studio.c | 11 +++++++++-- src/studio/system.h | 1 + src/system/baremetalpi/kernel.cpp | 1 + src/system/libretro/tic80_libretro.c | 1 + src/system/n3ds/main.c | 2 ++ src/system/sdl/main.c | 23 ++++++++++++----------- src/system/sdl/player.c | 1 + src/system/sokol/player.c | 3 +++ src/system/sokol/sokol.c | 3 ++- src/tic.c | 6 ++++++ 13 files changed, 41 insertions(+), 16 deletions(-) diff --git a/include/tic80.h b/include/tic80.h index 4ed8d852d..9a86fae5b 100644 --- a/include/tic80.h +++ b/include/tic80.h @@ -157,6 +157,7 @@ typedef struct TIC80_API tic80* tic80_create(s32 samplerate); TIC80_API void tic80_load(tic80* tic, void* cart, s32 size); TIC80_API void tic80_tick(tic80* tic, const tic80_input* input); +TIC80_API void tic80_sound(tic80* tic); TIC80_API void tic80_delete(tic80* tic); #ifdef __cplusplus diff --git a/src/api.h b/src/api.h index 1ed8382c7..41b48af52 100644 --- a/src/api.h +++ b/src/api.h @@ -707,7 +707,7 @@ void tic_core_tick_start(tic_mem* memory); void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); void tic_core_blit(tic_mem* tic); -void tic_core_synthesize_sound(tic_mem* tic); +void tic_core_synth_sound(tic_mem* tic); void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb); const tic_script_config* tic_core_script_config(tic_mem* memory); diff --git a/src/core/sound.c b/src/core/sound.c index 4ee9d3150..7f32a9731 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -533,7 +533,7 @@ static void stereo_synthesize(tic_core* core, tic_sound_register_data* registers blip_end_frame(blip, EndTime); } -void tic_core_synthesize_sound(tic_mem* memory) +void tic_core_synth_sound(tic_mem* memory) { tic_core* core = (tic_core*)memory; diff --git a/src/studio/studio.c b/src/studio/studio.c index cc1f9ef18..0d9cc658a 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -331,7 +331,7 @@ const char* studioExportSfx(s32 index, const char* filename) { tic_core_tick_start(tic); tic_core_tick_end(tic); - tic_core_synthesize_sound(tic); + tic_core_synth_sound(tic); wave_write(tic->samples.buffer, tic->samples.size / sizeof(s16)); } @@ -380,7 +380,7 @@ const char* studioExportMusic(s32 track, const char* filename) tic->ram.registers[i].volume = 0; tic_core_tick_end(tic); - tic_core_synthesize_sound(tic); + tic_core_synth_sound(tic); wave_write(tic->samples.buffer, tic->samples.size / sizeof(s16)); } @@ -2046,6 +2046,12 @@ static void studioTick() #endif } +static void studioSound() +{ + tic_mem* tic = impl.studio.tic; + tic_core_synth_sound(tic); +} + static void studioLoad(const char* file) { #if defined(BUILD_EDITORS) @@ -2212,6 +2218,7 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.cli |= args.cli; impl.studio.tick = studioTick; + impl.studio.sound = studioSound; impl.studio.load = studioLoad; impl.studio.close = studioClose; impl.studio.exit = exitStudio; diff --git a/src/studio/system.h b/src/studio/system.h index 8d909b6d5..fddd0c0cb 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -131,6 +131,7 @@ typedef struct bool quit; void (*tick)(); + void (*sound)(); void (*exit)(); void (*close)(); void (*load)(const char* file); diff --git a/src/system/baremetalpi/kernel.cpp b/src/system/baremetalpi/kernel.cpp index 270d91823..2147af1bb 100644 --- a/src/system/baremetalpi/kernel.cpp +++ b/src/system/baremetalpi/kernel.cpp @@ -437,6 +437,7 @@ TShutdownMode Run(void) keyspinlock.Release(); platform.studio->tick(); + platform.studio->sound(); mSound->Write(tic->samples.buffer, tic->samples.size); diff --git a/src/system/libretro/tic80_libretro.c b/src/system/libretro/tic80_libretro.c index 92f18adc6..29d062158 100644 --- a/src/system/libretro/tic80_libretro.c +++ b/src/system/libretro/tic80_libretro.c @@ -804,6 +804,7 @@ void tic80_libretro_update(tic80* game) // Update the game state. tic80_tick(game, &state->input); + tic80_sound(game); } /** diff --git a/src/system/n3ds/main.c b/src/system/n3ds/main.c index 4ea9c1f00..fd6d4c71c 100644 --- a/src/system/n3ds/main.c +++ b/src/system/n3ds/main.c @@ -469,6 +469,8 @@ void n3ds_sound_exit(void) } static void audio_update(void) { + platform.studio->sound(); + ndspWaveBuf *wave_buf = &platform.audio.ndspBuf[platform.audio.curr_block]; if (wave_buf->status == NDSP_WBUF_DONE) { diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 3c8f0c57a..eabea9fd8 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -247,16 +247,19 @@ static void renderCopy(Renderer render, Texture tex, SDL_Rect src, SDL_Rect dst) } } -static void audioCallback(void* userdata,Uint8* stream,int len) { +static void audioCallback(void* userdata,Uint8* stream,int len) +{ tic_mem* tic = platform.studio->tic; - for (; len > 0; len--) { - if (platform.audio.bufferRemaining <= 0) { - tic_core_synthesize_sound(tic); + + while(len--) + { + if (platform.audio.bufferRemaining <= 0) + { + platform.studio->sound(); platform.audio.bufferRemaining = tic->samples.size; } - *stream = ((Uint8*)tic->samples.buffer)[tic->samples.size - platform.audio.bufferRemaining]; - stream++; - platform.audio.bufferRemaining--; + + *stream++ = ((u8*)tic->samples.buffer)[tic->samples.size - platform.audio.bufferRemaining--]; } } @@ -269,7 +272,7 @@ static void initSound() .channels = TIC_STEREO_CHANNELS, .userdata = NULL, .callback = audioCallback, - .samples = 1024 + .samples = 1024, }; platform.audio.device = SDL_OpenAudioDevice(NULL, 0, &want, &platform.audio.spec, 0); @@ -1623,9 +1626,7 @@ static s32 start(s32 argc, char **argv, const char* folder) { s64 delay = nextTick - SDL_GetPerformanceCounter(); - if(delay < 0) - nextTick -= delay; - else + if(delay >= 0) SDL_Delay((u32)(delay * 1000 / SDL_GetPerformanceFrequency())); } } diff --git a/src/system/sdl/player.c b/src/system/sdl/player.c index 34b8649ee..d5b7e07cb 100644 --- a/src/system/sdl/player.c +++ b/src/system/sdl/player.c @@ -143,6 +143,7 @@ s32 runCart(void* cart, s32 size) nextTick += Delta; tic80_tick(tic, &input); + tic80_sound(tic); if (!audioStarted && audioDevice) audioStarted = true; diff --git a/src/system/sokol/player.c b/src/system/sokol/player.c index 3f37efe11..57eebf17b 100644 --- a/src/system/sokol/player.c +++ b/src/system/sokol/player.c @@ -53,7 +53,10 @@ static tic80_input tic_input; static void app_frame(void) { if(tic) + { tic80_tick(tic, &tic_input); + tic80_sound(tic); + } sokol_gfx_draw(tic->screen); diff --git a/src/system/sokol/sokol.c b/src/system/sokol/sokol.c index 2891dca38..14decded7 100644 --- a/src/system/sokol/sokol.c +++ b/src/system/sokol/sokol.c @@ -169,11 +169,12 @@ static void app_frame(void) sokol_gfx_draw(platform.studio->tic->screen); + platform.studio->sound(); s32 count = tic->samples.size / sizeof tic->samples.buffer[0]; for(s32 i = 0; i < count; i++) platform.audio.samples[i] = (float)tic->samples.buffer[i] / SHRT_MAX; - saudio_push(platform.audio.samples, count / 2); + saudio_push(platform.audio.samples, count / 2); input->mouse.scrollx = input->mouse.scrolly = 0; platform.keyboard.text = '\0'; diff --git a/src/tic.c b/src/tic.c index 25a15ea2b..c69155476 100644 --- a/src/tic.c +++ b/src/tic.c @@ -123,6 +123,12 @@ TIC80_API void tic80_tick(tic80* tic, const tic80_input* input) tic80->tick_counter++; } +TIC80_API void tic80_sound(tic80* tic) +{ + tic80_local* tic80 = (tic80_local*)tic; + tic_core_synth_sound(tic80->memory); +} + TIC80_API void tic80_delete(tic80* tic) { tic80_local* tic80 = (tic80_local*)tic; From bec9fefc2eea909636d72ce77c5632b0a37bca8a Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 2 Nov 2021 14:26:28 +0300 Subject: [PATCH 065/379] tiny fix --- src/api/wren.c | 4 ++++ src/system/sdl/main.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/api/wren.c b/src/api/wren.c index f036a8bb5..6cc372873 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -89,6 +89,8 @@ class TIC {\n\ foreign static clip(x, y, w, h)\n\ foreign static peek(addr)\n\ foreign static poke(addr, val)\n\ + foreign static peek(addr, res)\n\ + foreign static poke(addr, val, res)\n\ foreign static peek4(addr)\n\ foreign static poke4(addr, val)\n\ foreign static memcpy(dst, src, size)\n\ @@ -1323,6 +1325,8 @@ static WrenForeignMethodFn foreignTicMethods(const char* signature) if (strcmp(signature, "static TIC.peek(_)" ) == 0) return wren_peek; if (strcmp(signature, "static TIC.poke(_,_)" ) == 0) return wren_poke; + if (strcmp(signature, "static TIC.peek(_,_)" ) == 0) return wren_peek; + if (strcmp(signature, "static TIC.poke(_,_,_)" ) == 0) return wren_poke; if (strcmp(signature, "static TIC.peek4(_)" ) == 0) return wren_peek4; if (strcmp(signature, "static TIC.poke4(_,_)" ) == 0) return wren_poke4; if (strcmp(signature, "static TIC.memcpy(_,_,_)" ) == 0) return wren_memcpy; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index eabea9fd8..44623e8e3 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -247,7 +247,7 @@ static void renderCopy(Renderer render, Texture tex, SDL_Rect src, SDL_Rect dst) } } -static void audioCallback(void* userdata,Uint8* stream,int len) +static void audioCallback(void* userdata, u8* stream, s32 len) { tic_mem* tic = platform.studio->tic; From e823217dcfdda660788008e098562ef93af789fc Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 2 Nov 2021 16:03:50 +0300 Subject: [PATCH 066/379] fixed tic_api_btn() api #1599 --- src/api/js.c | 7 ++++--- src/api/lua.c | 7 ++++--- src/api/squirrel.c | 6 +++--- src/api/wren.c | 7 ++++--- src/core/io.c | 4 ++-- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/api/js.c b/src/api/js.c index 0a263e00f..2ba33c3fd 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -200,15 +200,16 @@ static duk_ret_t duk_spr(duk_context* duk) static duk_ret_t duk_btn(duk_context* duk) { tic_core* core = getDukCore(duk); + tic_mem* tic = (tic_mem*)core; if (duk_is_null_or_undefined(duk, 0)) { - duk_push_uint(duk, core->memory.ram.input.gamepads.data); + duk_push_uint(duk, tic_api_btn(tic, -1)); } else { - s32 index = duk_to_int(duk, 0) & 0x1f; - duk_push_boolean(duk, core->memory.ram.input.gamepads.data & (1 << index)); + bool pressed = tic_api_btn(tic, duk_to_int(duk, 0) & 0x1f); + duk_push_boolean(duk, pressed); } return 1; diff --git a/src/api/lua.c b/src/api/lua.c index 3f3b55621..7efc8ff4a 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -478,17 +478,18 @@ static s32 lua_btnp(lua_State* lua) static s32 lua_btn(lua_State* lua) { tic_core* core = getLuaCore(lua); + tic_mem* tic = (tic_mem*)core; s32 top = lua_gettop(lua); if (top == 0) { - lua_pushinteger(lua, core->memory.ram.input.gamepads.data); + lua_pushinteger(lua, tic_api_btn(tic, -1)); } else if (top == 1) { - u32 index = getLuaNumber(lua, 1) & 0x1f; - lua_pushboolean(lua, core->memory.ram.input.gamepads.data & (1 << index)); + bool pressed = tic_api_btn(tic, getLuaNumber(lua, 1) & 0x1f); + lua_pushboolean(lua, pressed); } else { diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 64b6dc4b2..3d40d2c50 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -542,17 +542,17 @@ static SQInteger squirrel_btnp(HSQUIRRELVM vm) static SQInteger squirrel_btn(HSQUIRRELVM vm) { tic_core* core = getSquirrelCore(vm); + tic_mem* tic = (tic_mem*)core; SQInteger top = sq_gettop(vm); if (top == 1) { - sq_pushinteger(vm, core->memory.ram.input.gamepads.data); + sq_pushinteger(vm, tic_api_btn(tic, -1)); } else if (top == 2) { - u32 index = getSquirrelNumber(vm, 2) & 0x1f; - bool pressed = (core->memory.ram.input.gamepads.data & (1 << index)) != 0; + bool pressed = tic_api_btn(tic, getSquirrelNumber(vm, 2) & 0x1f); sq_pushbool(vm, pressed ? SQTrue : SQFalse); } else diff --git a/src/api/wren.c b/src/api/wren.c index 6cc372873..ea7cf771b 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -264,17 +264,18 @@ static void wren_spritesize(WrenVM* vm) static void wren_btn(WrenVM* vm) { tic_core* core = getWrenCore(vm); + tic_mem* tic = (tic_mem*)core; s32 top = wrenGetSlotCount(vm); if (top == 1) { - wrenSetSlotDouble(vm, 0, core->memory.ram.input.gamepads.data); + wrenSetSlotDouble(vm, 0, tic_api_btn(tic, -1)); } else if (top == 2) { - s32 index = getWrenNumber(vm, 1) & 0x1f; - wrenSetSlotBool(vm, 0, core->memory.ram.input.gamepads.data & (1 << index)); + bool pressed = tic_api_btn(tic, getWrenNumber(vm, 1) & 0x1f); + wrenSetSlotBool(vm, 0, pressed); } } diff --git a/src/core/io.c b/src/core/io.c index e9325e7b7..06fa82672 100644 --- a/src/core/io.c +++ b/src/core/io.c @@ -64,11 +64,11 @@ u32 tic_api_btn(tic_mem* tic, s32 index) if (index < 0) { - return (~core->state.gamepads.previous.data) & core->memory.ram.input.gamepads.data; + return core->memory.ram.input.gamepads.data; } else { - return ((~core->state.gamepads.previous.data) & core->memory.ram.input.gamepads.data) & (1 << index); + return core->memory.ram.input.gamepads.data & (1 << index); } } From 690c373f044d824b34ecbfea6d2f831ff428ae9c Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 3 Nov 2021 13:50:04 +0300 Subject: [PATCH 067/379] fixed sprite copying when palette editing is enabled #1634 --- src/studio/editors/sprite.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index f8e00d9dd..3e01c1e5a 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -1497,12 +1497,6 @@ static void cutToClipboard(Sprite* sprite) static void copyFromClipboard(Sprite* sprite) { - if(sprite->palette.edit) - { - pasteColor(sprite); - return; - } - s32 size = sprite->size * sprite->size * TIC_PALETTE_BPP / BITS_IN_BYTE; DEFER(u8* buffer = malloc(size), free(buffer)) From 2faaecb961d27feebff6662090b7851eb916fe55 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 3 Nov 2021 14:12:19 +0300 Subject: [PATCH 068/379] `res` parameter renamed to `bits` in peek()/poke() api #1475 --- src/api.h | 12 ++++++------ src/api/js.c | 8 ++++---- src/api/lua.c | 16 ++++++++-------- src/api/squirrel.c | 12 ++++++------ src/api/wren.c | 16 ++++++++-------- src/core/core.c | 8 ++++---- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/api.h b/src/api.h index 41b48af52..737049aa8 100644 --- a/src/api.h +++ b/src/api.h @@ -354,7 +354,7 @@ enum \ \ macro(peek, \ - "peek(addr res=8) -> value", \ + "peek(addr bits=8) -> value", \ \ "This function allows to read the memory from TIC.\n" \ "It's useful to access resources created with the integrated tools like sprite, maps, sounds, " \ @@ -362,21 +362,21 @@ enum "Never dream to sound a sprite?\n" \ "Address are in hexadecimal format but values are decimal.\n" \ "To write to a memory address, use `poke()`.\n" \ - "`res` allowed to be 1,2,4,8.", \ + "`bits` allowed to be 1,2,4,8.", \ 2, \ u8, \ - tic_mem*, s32 address, s32 res) \ + tic_mem*, s32 address, s32 bits) \ \ \ macro(poke, \ - "poke(addr value res=8)", \ + "poke(addr value bits=8)", \ \ "This function allows you to write a single byte to any address in TIC's RAM.\n" \ "The address should be specified in hexadecimal format, the value in decimal.\n" \ - "`res` allowed to be 1,2,4,8.", \ + "`bits` allowed to be 1,2,4,8.", \ 3, \ void, \ - tic_mem*, s32 address, u8 value, s32 res) \ + tic_mem*, s32 address, u8 value, s32 bits) \ \ \ macro(peek4, \ diff --git a/src/api/js.c b/src/api/js.c index 2ba33c3fd..554c7ab84 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -497,10 +497,10 @@ static duk_ret_t duk_mset(duk_context* duk) static duk_ret_t duk_peek(duk_context* duk) { s32 address = duk_to_int(duk, 0); - s32 res = duk_opt_int(duk, 1, BITS_IN_BYTE); + s32 bits = duk_opt_int(duk, 1, BITS_IN_BYTE); tic_mem* tic = (tic_mem*)getDukCore(duk); - duk_push_uint(duk, tic_api_peek(tic, address, res)); + duk_push_uint(duk, tic_api_peek(tic, address, bits)); return 1; } @@ -508,10 +508,10 @@ static duk_ret_t duk_poke(duk_context* duk) { s32 address = duk_to_int(duk, 0); u8 value = duk_to_int(duk, 1); - s32 res = duk_opt_int(duk, 2, BITS_IN_BYTE); + s32 bits = duk_opt_int(duk, 2, BITS_IN_BYTE); tic_mem* tic = (tic_mem*)getDukCore(duk); - tic_api_poke(tic, address, value, res); + tic_api_poke(tic, address, value, bits); return 0; } diff --git a/src/api/lua.c b/src/api/lua.c index 7efc8ff4a..a33108012 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -59,15 +59,15 @@ static s32 lua_peek(lua_State* lua) if(top >= 1) { s32 address = getLuaNumber(lua, 1); - s32 res = BITS_IN_BYTE; + s32 bits = BITS_IN_BYTE; if(top == 2) - res = getLuaNumber(lua, 2); + bits = getLuaNumber(lua, 2); - lua_pushinteger(lua, tic_api_peek(tic, address, res)); + lua_pushinteger(lua, tic_api_peek(tic, address, bits)); return 1; } - else luaL_error(lua, "invalid parameters, peek(addr,res)\n"); + else luaL_error(lua, "invalid parameters, peek(addr,bits)\n"); return 0; } @@ -81,14 +81,14 @@ static s32 lua_poke(lua_State* lua) { s32 address = getLuaNumber(lua, 1); u8 value = getLuaNumber(lua, 2); - s32 res = BITS_IN_BYTE; + s32 bits = BITS_IN_BYTE; if(top == 3) - res = getLuaNumber(lua, 3); + bits = getLuaNumber(lua, 3); - tic_api_poke(tic, address, value, res); + tic_api_poke(tic, address, value, bits); } - else luaL_error(lua, "invalid parameters, poke(addr,val,res)\n"); + else luaL_error(lua, "invalid parameters, poke(addr,val,bits)\n"); return 0; } diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 3d40d2c50..e2b1ea71b 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -126,12 +126,12 @@ static SQInteger squirrel_peek(HSQUIRRELVM vm) return sq_throwerror(vm, "invalid parameters, peek(address)"); s32 address = getSquirrelNumber(vm, 2); - s32 res = BITS_IN_BYTE; + s32 bits = BITS_IN_BYTE; if(top == 3) - res = getSquirrelNumber(vm, 3); + bits = getSquirrelNumber(vm, 3); - sq_pushinteger(vm, tic_api_peek(tic, address, res)); + sq_pushinteger(vm, tic_api_peek(tic, address, bits)); return 1; } @@ -145,12 +145,12 @@ static SQInteger squirrel_poke(HSQUIRRELVM vm) s32 address = getSquirrelNumber(vm, 2); u8 value = getSquirrelNumber(vm, 3); - s32 res = BITS_IN_BYTE; + s32 bits = BITS_IN_BYTE; if(top == 4) - res = getSquirrelNumber(vm, 4); + bits = getSquirrelNumber(vm, 4); - tic_api_poke(tic, address, value, res); + tic_api_poke(tic, address, value, bits); return 0; } diff --git a/src/api/wren.c b/src/api/wren.c index ea7cf771b..e6ded052e 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -89,8 +89,8 @@ class TIC {\n\ foreign static clip(x, y, w, h)\n\ foreign static peek(addr)\n\ foreign static poke(addr, val)\n\ - foreign static peek(addr, res)\n\ - foreign static poke(addr, val, res)\n\ + foreign static peek(addr, bits)\n\ + foreign static poke(addr, val, bits)\n\ foreign static peek4(addr)\n\ foreign static poke4(addr, val)\n\ foreign static memcpy(dst, src, size)\n\ @@ -950,12 +950,12 @@ static void wren_peek(WrenVM* vm) tic_mem* tic = (tic_mem*)getWrenCore(vm); s32 address = getWrenNumber(vm, 1); - s32 res = BITS_IN_BYTE; + s32 bits = BITS_IN_BYTE; if(wrenGetSlotCount(vm) > 2) - res = getWrenNumber(vm, 2); + bits = getWrenNumber(vm, 2); - wrenSetSlotDouble(vm, 0, tic_api_peek(tic, address, res)); + wrenSetSlotDouble(vm, 0, tic_api_peek(tic, address, bits)); } static void wren_poke(WrenVM* vm) @@ -964,11 +964,11 @@ static void wren_poke(WrenVM* vm) s32 address = getWrenNumber(vm, 1); u8 value = getWrenNumber(vm, 2) & 0xff; - s32 res = BITS_IN_BYTE; + s32 bits = BITS_IN_BYTE; if(wrenGetSlotCount(vm) > 3) - res = getWrenNumber(vm, 3); + bits = getWrenNumber(vm, 3); - tic_api_poke(tic, address, value, res); + tic_api_poke(tic, address, value, bits); } static void wren_peek4(WrenVM* vm) diff --git a/src/core/core.c b/src/core/core.c index b48996b95..2488c0cad 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -42,7 +42,7 @@ static_assert(sizeof(tic_map) < 1024 * 32, "tic_map"); static_assert(sizeof(tic_vram) == TIC_VRAM_SIZE, "tic_vram"); static_assert(sizeof(tic_ram) == TIC_RAM_SIZE, "tic_ram"); -u8 tic_api_peek(tic_mem* memory, s32 address, s32 res) +u8 tic_api_peek(tic_mem* memory, s32 address, s32 bits) { if (address < 0) return 0; @@ -50,7 +50,7 @@ u8 tic_api_peek(tic_mem* memory, s32 address, s32 res) const u8* ram = (u8*)&memory->ram; enum{RamBits = sizeof(tic_ram) * BITS_IN_BYTE}; - switch(res) + switch(bits) { case 1: if(address < RamBits / 1) return tic_tool_peek1(ram, address); case 2: if(address < RamBits / 2) return tic_tool_peek2(ram, address); @@ -61,7 +61,7 @@ u8 tic_api_peek(tic_mem* memory, s32 address, s32 res) return 0; } -void tic_api_poke(tic_mem* memory, s32 address, u8 value, s32 res) +void tic_api_poke(tic_mem* memory, s32 address, u8 value, s32 bits) { if (address < 0) return; @@ -70,7 +70,7 @@ void tic_api_poke(tic_mem* memory, s32 address, u8 value, s32 res) u8* ram = (u8*)&memory->ram; enum{RamBits = sizeof(tic_ram) * BITS_IN_BYTE}; - switch(res) + switch(bits) { case 1: if(address < RamBits / 1) {tic_tool_poke1(ram, address, value); core->state.memmask[address >> 2] = 1;} break; case 2: if(address < RamBits / 2) {tic_tool_poke2(ram, address, value); core->state.memmask[address >> 1] = 1;} break; From a71aed15d927b4e604709e726fb06b64f0ac37d5 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 3 Nov 2021 16:05:44 +0300 Subject: [PATCH 069/379] url fixes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 985a6e129..92192ff50 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Build Status](https://github.com/nesbox/TIC-80/workflows/Build/badge.svg)](https://github.com/nesbox/TIC-80/actions?query=workflow%3ABuild) -![TIC-80](https://tic.computer/img/logo64.png) +![TIC-80](https://tic80.com/img/logo64.png) **TIC-80 TINY COMPUTER** - [https://tic80.com](https://tic80.com) # About @@ -48,7 +48,7 @@ You can play and share games, tools and music at [https://tic80.com/play](https: The community also hangs out and discusses on [Telegram](https://t.me/tic80) or [Discord](https://discord.gg/DkD73dP). # Contributing -You can contribute by issuing a bug or requesting a new feature on our [issues page](https://github.com/nesbox/tic.computer/issues). +You can contribute by issuing a bug or requesting a new feature on our [issues page](https://github.com/nesbox/TIC-80/issues). Keep in mind when engaging on a discussion to follow our [Code of Conduct](https://github.com/nesbox/TIC-80/blob/master/CODE_OF_CONDUCT.md). You can also contribute by reviewing or improving our [wiki](https://github.com/nesbox/TIC-80/wiki). From 9bc77d24cc4025bfe3095a50bb2526800475718e Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Thu, 4 Nov 2021 07:43:23 -0400 Subject: [PATCH 070/379] (fix) ignore negative index passed to spr Closes #1656. --- src/core/draw.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/draw.c b/src/core/draw.c index 99b03970e..c64780113 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -187,6 +187,9 @@ static void drawTile(tic_core* core, tic_tileptr* tile, s32 x, s32 y, u8* colors static void drawSprite(tic_core* core, s32 index, s32 x, s32 y, s32 w, s32 h, u8* colors, s32 count, s32 scale, tic_flip flip, tic_rotate rotate) { + if (index < 0) + return; + tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.blit.segment); if (w == 1 && h == 1) { tic_tileptr tile = tic_tilesheet_gettile(&sheet, index, false); From f31bde385e1d87a24c32718748a1723b0af920e8 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Thu, 4 Nov 2021 08:49:01 -0400 Subject: [PATCH 071/379] (enh) errors when mkdir fails Closes #1583. --- src/studio/fs.c | 6 ++++-- src/studio/fs.h | 2 +- src/studio/screens/console.c | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/studio/fs.c b/src/studio/fs.c index b91cb2d48..a547d4902 100644 --- a/src/studio/fs.c +++ b/src/studio/fs.c @@ -906,7 +906,7 @@ void* tic_fs_loadroot(tic_fs* fs, const char* name, s32* size) return fs_read(tic_fs_pathroot(fs, name), size); } -void tic_fs_makedir(tic_fs* fs, const char* name) +bool tic_fs_makedir(tic_fs* fs, const char* name) { #if defined(BAREMETALPI) // TODO BAREMETALPI @@ -925,16 +925,18 @@ void tic_fs_makedir(tic_fs* fs, const char* name) dbg("Could not mkdir %s\n", name); } free(path); + return (res != FR_OK); #else const FsString* pathString = utf8ToString(tic_fs_path(fs, name)); - tic_mkdir(pathString); + int result = tic_mkdir(pathString); freeString(pathString); #if defined(__EMSCRIPTEN__) syncfs(); #endif #endif + return result; } void tic_fs_openfolder(tic_fs* fs) diff --git a/src/studio/fs.h b/src/studio/fs.h index 05082a993..3623908bb 100644 --- a/src/studio/fs.h +++ b/src/studio/fs.h @@ -46,7 +46,7 @@ bool tic_fs_save (tic_fs* fs, const char* name, const void* data, s32 bool tic_fs_saveroot (tic_fs* fs, const char* name, const void* data, s32 size, bool overwrite); void* tic_fs_load (tic_fs* fs, const char* name, s32* size); void* tic_fs_loadroot (tic_fs* fs, const char* name, s32* size); -void tic_fs_makedir (tic_fs* fs, const char* name); +bool tic_fs_makedir (tic_fs* fs, const char* name); bool tic_fs_exists (tic_fs* fs, const char* name); void tic_fs_openfolder (tic_fs* fs); bool tic_fs_isdir (tic_fs* fs, const char* dir); diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 38631a76f..ae75674cb 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -1255,13 +1255,22 @@ static void onMakeDirectory(Console* console) { if(console->desc->count) { + char msg[TICNAME_MAX]; const char* param = console->desc->params->key; - tic_fs_makedir(console->fs, param); + if (tic_fs_exists(console->fs, param)) { + sprintf(msg, "\nerror, [%s] already exists :(", param); + printError(console, msg); + commandDone(console); + return; + } - char msg[TICNAME_MAX]; sprintf(msg, "\ncreated [%s] folder :)", param); - printBack(console, msg); + + printBack(console, tic_fs_makedir(console->fs, param) + ? "\nerror, dir not created :(" + : msg); + } else printError(console, "\ninvalid dir name"); From d45ae901ea4a7afcf299a2aca7e8565ac520a077 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Thu, 4 Nov 2021 09:18:17 -0400 Subject: [PATCH 072/379] fix --- src/studio/fs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/studio/fs.c b/src/studio/fs.c index a547d4902..2c1a1909f 100644 --- a/src/studio/fs.c +++ b/src/studio/fs.c @@ -934,9 +934,9 @@ bool tic_fs_makedir(tic_fs* fs, const char* name) #if defined(__EMSCRIPTEN__) syncfs(); -#endif #endif return result; +#endif } void tic_fs_openfolder(tic_fs* fs) From 2db313496a2e65bed37299f4162982d82b40c01e Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 4 Nov 2021 18:06:56 +0300 Subject: [PATCH 073/379] Added peek2()/poke2() api as part of #1616 --- src/api.h | 74 ++++++++++++++++++++++++++++------------------ src/api/js.c | 36 +++++++++++++++++----- src/api/lua.c | 57 +++++++++++++++++++++++++++-------- src/api/squirrel.c | 44 ++++++++++++++++++++++----- src/api/wren.c | 46 +++++++++++++++++++++------- src/core/core.c | 20 +++++++++---- 6 files changed, 206 insertions(+), 71 deletions(-) diff --git a/src/api.h b/src/api.h index 7f3348e2b..40e5f203f 100644 --- a/src/api.h +++ b/src/api.h @@ -354,7 +354,7 @@ enum \ \ macro(peek, \ - "peek(addr bits=8) -> value", \ + "peek(addr bits=8) -> value", \ \ "This function allows to read the memory from TIC.\n" \ "It's useful to access resources created with the integrated tools like sprite, maps, sounds, " \ @@ -362,64 +362,82 @@ enum "Never dream to sound a sprite?\n" \ "Address are in hexadecimal format but values are decimal.\n" \ "To write to a memory address, use `poke()`.\n" \ - "`bits` allowed to be 1,2,4,8.", \ + "`bits` allowed to be 1,2,4,8.", \ 2, \ u8, \ - tic_mem*, s32 address, s32 bits) \ + tic_mem*, s32 address, s32 bits) \ \ \ macro(poke, \ - "poke(addr value bits=8)", \ + "poke(addr value bits=8)", \ \ "This function allows you to write a single byte to any address in TIC's RAM.\n" \ "The address should be specified in hexadecimal format, the value in decimal.\n" \ - "`bits` allowed to be 1,2,4,8.", \ + "`bits` allowed to be 1,2,4,8.", \ 3, \ void, \ - tic_mem*, s32 address, u8 value, s32 bits) \ + tic_mem*, s32 address, u8 value, s32 bits) \ \ \ - macro(peek4, \ - "peek4(addr) -> value", \ + macro(peek1, \ + "peek1(addr) -> value", \ \ - "This function enables you to read 4bit values from TIC's RAM.\n" \ - "The address should be specified in hexadecimal format.", \ + "This function enables you to read single bit values from TIC's RAM.\n" \ + "The address is often specified in hexadecimal format.", \ 1, \ u8, \ tic_mem*, s32 address) \ \ \ - macro(poke4, \ - "poke4(addr value)", \ + macro(poke1, \ + "poke1(addr value)", \ \ - "This function allows you to write to the virtual RAM of TIC.\n" \ - "It differs from `poke()` in that it divides memory in groups of 4 bits.\n" \ - "Therefore, to address the high nibble of position 0x4000 you should pass 0x8000 as addr4, " \ - "and to access the low nibble (rightmost 4 bits) you would pass 0x8001.\n" \ - "The address should be specified in hexadecimal format, and values should be given in decimal.", \ + "This function allows you to write single bit values directly to RAM.\n" \ + "The address is often specified in hexadecimal format.", \ 2, \ void, \ tic_mem*, s32 address, u8 value) \ \ \ - macro(peek1, \ - "peek1(addr) -> value", \ + macro(peek2, \ + "peek2(addr) -> value", \ \ - "This function enables you to read single-bit values from TIC's RAM.\n" \ - "The address should be specified in hexadecimal format.", \ + "This function enables you to read two bits values from TIC's RAM.\n" \ + "The address is often specified in hexadecimal format.", \ 1, \ u8, \ tic_mem*, s32 address) \ \ \ - macro(poke1, \ - "poke1(addr value)", \ + macro(poke2, \ + "poke2(addr value)", \ + \ + "This function allows you to write two bits values directly to RAM.\n" \ + "The address is often specified in hexadecimal format.", \ + 2, \ + void, \ + tic_mem*, s32 address, u8 value) \ + \ + \ + macro(peek4, \ + "peek4(addr) -> value", \ + \ + "This function enables you to read values from TIC's RAM.\n" \ + "The address is often specified in hexadecimal format.\n" \ + "See 'poke4()' for detailed information on how nibble addressing compares with byte addressing.", \ + 1, \ + u8, \ + tic_mem*, s32 address) \ + \ + \ + macro(poke4, \ + "poke4(addr value)", \ \ - "This function allows you to write to the virtual RAM of TIC.\n" \ - "It differs from `poke()` in that it accesses the individual bits of memory.\n" \ - "Therefore, to address the highest bit of position 0x4000 you should pass 0x16000 as addr1, " \ - "and to access the lowest bit (rightmost bit) you would pass 0x16007.\n" \ - "The address should be specified in hexadecimal format, and values should be given in decimal.", \ + "This function allows you to write directly to RAM.\n" \ + "The address is often specified in hexadecimal format.\n" \ + "For both peek4 and poke4 RAM is addressed in 4 bit segments (nibbles).\n" \ + "Therefore, to access the the RAM at byte address 0x4000\n" \ + "you would need to access both the 0x8000 and 0x8001 nibble addresses.", \ 2, \ void, \ tic_mem*, s32 address, u8 value) \ diff --git a/src/api/js.c b/src/api/js.c index 58517a93a..a287252e2 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -516,42 +516,62 @@ static duk_ret_t duk_poke(duk_context* duk) return 0; } -static duk_ret_t duk_peek4(duk_context* duk) +static duk_ret_t duk_peek1(duk_context* duk) { s32 address = duk_to_int(duk, 0); tic_mem* tic = (tic_mem*)getDukCore(duk); - duk_push_uint(duk, tic_api_peek4(tic, address)); + duk_push_uint(duk, tic_api_peek1(tic, address)); return 1; } -static duk_ret_t duk_poke4(duk_context* duk) +static duk_ret_t duk_poke1(duk_context* duk) { s32 address = duk_to_int(duk, 0); u8 value = duk_to_int(duk, 1); tic_mem* tic = (tic_mem*)getDukCore(duk); - tic_api_poke4(tic, address, value); + tic_api_poke1(tic, address, value); return 0; } -static duk_ret_t duk_peek1(duk_context* duk) +static duk_ret_t duk_peek2(duk_context* duk) { s32 address = duk_to_int(duk, 0); tic_mem* tic = (tic_mem*)getDukCore(duk); - duk_push_uint(duk, tic_api_peek1(tic, address)); + duk_push_uint(duk, tic_api_peek2(tic, address)); return 1; } -static duk_ret_t duk_poke1(duk_context* duk) +static duk_ret_t duk_poke2(duk_context* duk) { s32 address = duk_to_int(duk, 0); u8 value = duk_to_int(duk, 1); tic_mem* tic = (tic_mem*)getDukCore(duk); - tic_api_poke1(tic, address, value); + tic_api_poke2(tic, address, value); + + return 0; +} + +static duk_ret_t duk_peek4(duk_context* duk) +{ + s32 address = duk_to_int(duk, 0); + + tic_mem* tic = (tic_mem*)getDukCore(duk); + duk_push_uint(duk, tic_api_peek4(tic, address)); + return 1; +} + +static duk_ret_t duk_poke4(duk_context* duk) +{ + s32 address = duk_to_int(duk, 0); + u8 value = duk_to_int(duk, 1); + + tic_mem* tic = (tic_mem*)getDukCore(duk); + tic_api_poke4(tic, address, value); return 0; } diff --git a/src/api/lua.c b/src/api/lua.c index 1786448a8..164ad840f 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -93,7 +93,7 @@ static s32 lua_poke(lua_State* lua) return 0; } -static s32 lua_peek4(lua_State* lua) +static s32 lua_peek1(lua_State* lua) { s32 top = lua_gettop(lua); tic_mem* tic = (tic_mem*)getLuaCore(lua); @@ -101,15 +101,15 @@ static s32 lua_peek4(lua_State* lua) if(top == 1) { s32 address = getLuaNumber(lua, 1); - lua_pushinteger(lua, tic_api_peek4(tic, address)); + lua_pushinteger(lua, tic_api_peek1(tic, address)); return 1; } - else luaL_error(lua, "invalid parameters, peek4(addr)\n"); + else luaL_error(lua, "invalid parameters, peek1(addr)\n"); return 0; } -static s32 lua_poke4(lua_State* lua) +static s32 lua_poke1(lua_State* lua) { s32 top = lua_gettop(lua); tic_mem* tic = (tic_mem*)getLuaCore(lua); @@ -119,14 +119,14 @@ static s32 lua_poke4(lua_State* lua) s32 address = getLuaNumber(lua, 1); u8 value = getLuaNumber(lua, 2); - tic_api_poke4(tic, address, value); + tic_api_poke1(tic, address, value); } - else luaL_error(lua, "invalid parameters, poke4(addr,val)\n"); + else luaL_error(lua, "invalid parameters, poke1(addr,val)\n"); return 0; } -static s32 lua_peek1(lua_State* lua) +static s32 lua_peek2(lua_State* lua) { s32 top = lua_gettop(lua); tic_mem* tic = (tic_mem*)getLuaCore(lua); @@ -134,15 +134,15 @@ static s32 lua_peek1(lua_State* lua) if(top == 1) { s32 address = getLuaNumber(lua, 1); - lua_pushinteger(lua, tic_api_peek1(tic, address)); + lua_pushinteger(lua, tic_api_peek2(tic, address)); return 1; } - else luaL_error(lua, "invalid parameters, peek1(addr)\n"); + else luaL_error(lua, "invalid parameters, peek2(addr)\n"); return 0; } -static s32 lua_poke1(lua_State* lua) +static s32 lua_poke2(lua_State* lua) { s32 top = lua_gettop(lua); tic_mem* tic = (tic_mem*)getLuaCore(lua); @@ -152,9 +152,42 @@ static s32 lua_poke1(lua_State* lua) s32 address = getLuaNumber(lua, 1); u8 value = getLuaNumber(lua, 2); - tic_api_poke1(tic, address, value); + tic_api_poke2(tic, address, value); } - else luaL_error(lua, "invalid parameters, poke1(addr,val)\n"); + else luaL_error(lua, "invalid parameters, poke2(addr,val)\n"); + + return 0; +} + +static s32 lua_peek4(lua_State* lua) +{ + s32 top = lua_gettop(lua); + tic_mem* tic = (tic_mem*)getLuaCore(lua); + + if(top == 1) + { + s32 address = getLuaNumber(lua, 1); + lua_pushinteger(lua, tic_api_peek4(tic, address)); + return 1; + } + else luaL_error(lua, "invalid parameters, peek4(addr)\n"); + + return 0; +} + +static s32 lua_poke4(lua_State* lua) +{ + s32 top = lua_gettop(lua); + tic_mem* tic = (tic_mem*)getLuaCore(lua); + + if(top == 2) + { + s32 address = getLuaNumber(lua, 1); + u8 value = getLuaNumber(lua, 2); + + tic_api_poke4(tic, address, value); + } + else luaL_error(lua, "invalid parameters, poke4(addr,val)\n"); return 0; } diff --git a/src/api/squirrel.c b/src/api/squirrel.c index e600a0cf0..85926f976 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -155,7 +155,7 @@ static SQInteger squirrel_poke(HSQUIRRELVM vm) return 0; } -static SQInteger squirrel_peek4(HSQUIRRELVM vm) +static SQInteger squirrel_peek1(HSQUIRRELVM vm) { tic_mem* tic = (tic_mem*)getSquirrelCore(vm); @@ -164,11 +164,11 @@ static SQInteger squirrel_peek4(HSQUIRRELVM vm) return sq_throwerror(vm, "invalid parameters, peek4(address)"); s32 address = getSquirrelNumber(vm, 2); - sq_pushinteger(vm, tic_api_peek4(tic, address)); + sq_pushinteger(vm, tic_api_peek1(tic, address)); return 1; } -static SQInteger squirrel_poke4(HSQUIRRELVM vm) +static SQInteger squirrel_poke1(HSQUIRRELVM vm) { tic_mem* tic = (tic_mem*)getSquirrelCore(vm); @@ -178,12 +178,40 @@ static SQInteger squirrel_poke4(HSQUIRRELVM vm) s32 address = getSquirrelNumber(vm, 2); u8 value = getSquirrelNumber(vm, 3); - tic_api_poke4(tic, address, value); + tic_api_poke1(tic, address, value); return 0; } -static SQInteger squirrel_peek1(HSQUIRRELVM vm) +static SQInteger squirrel_peek2(HSQUIRRELVM vm) +{ + tic_mem* tic = (tic_mem*)getSquirrelCore(vm); + + // check number of args + if (sq_gettop(vm) != 2) + return sq_throwerror(vm, "invalid parameters, peek2(address)"); + s32 address = getSquirrelNumber(vm, 2); + + sq_pushinteger(vm, tic_api_peek2(tic, address)); + return 1; +} + +static SQInteger squirrel_poke2(HSQUIRRELVM vm) +{ + tic_mem* tic = (tic_mem*)getSquirrelCore(vm); + + if (sq_gettop(vm) != 3) + return sq_throwerror( vm, "invalid parameters, poke2(address,value)" ); + + s32 address = getSquirrelNumber(vm, 2); + u8 value = getSquirrelNumber(vm, 3); + + tic_api_poke2(tic, address, value); + + return 0; +} + +static SQInteger squirrel_peek4(HSQUIRRELVM vm) { tic_mem* tic = (tic_mem*)getSquirrelCore(vm); @@ -192,11 +220,11 @@ static SQInteger squirrel_peek1(HSQUIRRELVM vm) return sq_throwerror(vm, "invalid parameters, peek4(address)"); s32 address = getSquirrelNumber(vm, 2); - sq_pushinteger(vm, tic_api_peek1(tic, address)); + sq_pushinteger(vm, tic_api_peek4(tic, address)); return 1; } -static SQInteger squirrel_poke1(HSQUIRRELVM vm) +static SQInteger squirrel_poke4(HSQUIRRELVM vm) { tic_mem* tic = (tic_mem*)getSquirrelCore(vm); @@ -206,7 +234,7 @@ static SQInteger squirrel_poke1(HSQUIRRELVM vm) s32 address = getSquirrelNumber(vm, 2); u8 value = getSquirrelNumber(vm, 3); - tic_api_poke1(tic, address, value); + tic_api_poke4(tic, address, value); return 0; } diff --git a/src/api/wren.c b/src/api/wren.c index a517d4996..8082c857b 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -91,10 +91,12 @@ class TIC {\n\ foreign static poke(addr, val)\n\ foreign static peek(addr, bits)\n\ foreign static poke(addr, val, bits)\n\ - foreign static peek4(addr)\n\ - foreign static poke4(addr, val)\n\ foreign static peek1(addr)\n\ foreign static poke1(addr, val)\n\ + foreign static peek2(addr)\n\ + foreign static poke2(addr, val)\n\ + foreign static peek4(addr)\n\ + foreign static poke4(addr, val)\n\ foreign static memcpy(dst, src, size)\n\ foreign static memset(dst, src, size)\n\ foreign static pmem(index)\n\ @@ -973,41 +975,61 @@ static void wren_poke(WrenVM* vm) tic_api_poke(tic, address, value, bits); } -static void wren_peek4(WrenVM* vm) +static void wren_peek1(WrenVM* vm) { tic_mem* tic = (tic_mem*)getWrenCore(vm); s32 address = getWrenNumber(vm, 1); - wrenSetSlotDouble(vm, 0, tic_api_peek4(tic, address)); + wrenSetSlotDouble(vm, 0, tic_api_peek1(tic, address)); } -static void wren_poke4(WrenVM* vm) +static void wren_poke1(WrenVM* vm) { tic_mem* tic = (tic_mem*)getWrenCore(vm); s32 address = getWrenNumber(vm, 1); u8 value = getWrenNumber(vm, 2); - tic_api_poke4(tic, address, value); + tic_api_poke1(tic, address, value); } -static void wren_peek1(WrenVM* vm) + +static void wren_peek2(WrenVM* vm) { tic_mem* tic = (tic_mem*)getWrenCore(vm); s32 address = getWrenNumber(vm, 1); - wrenSetSlotDouble(vm, 0, tic_api_peek1(tic, address)); + wrenSetSlotDouble(vm, 0, tic_api_peek2(tic, address)); } -static void wren_poke1(WrenVM* vm) +static void wren_poke2(WrenVM* vm) { tic_mem* tic = (tic_mem*)getWrenCore(vm); s32 address = getWrenNumber(vm, 1); u8 value = getWrenNumber(vm, 2); - tic_api_poke1(tic, address, value); + tic_api_poke2(tic, address, value); +} + +static void wren_peek4(WrenVM* vm) +{ + tic_mem* tic = (tic_mem*)getWrenCore(vm); + + s32 address = getWrenNumber(vm, 1); + + wrenSetSlotDouble(vm, 0, tic_api_peek4(tic, address)); +} + +static void wren_poke4(WrenVM* vm) +{ + tic_mem* tic = (tic_mem*)getWrenCore(vm); + + s32 address = getWrenNumber(vm, 1); + u8 value = getWrenNumber(vm, 2); + + tic_api_poke4(tic, address, value); } static void wren_memcpy(WrenVM* vm) @@ -1348,6 +1370,10 @@ static WrenForeignMethodFn foreignTicMethods(const char* signature) if (strcmp(signature, "static TIC.poke(_,_)" ) == 0) return wren_poke; if (strcmp(signature, "static TIC.peek(_,_)" ) == 0) return wren_peek; if (strcmp(signature, "static TIC.poke(_,_,_)" ) == 0) return wren_poke; + if (strcmp(signature, "static TIC.peek1(_)" ) == 0) return wren_peek1; + if (strcmp(signature, "static TIC.poke1(_,_)" ) == 0) return wren_poke1; + if (strcmp(signature, "static TIC.peek2(_)" ) == 0) return wren_peek2; + if (strcmp(signature, "static TIC.poke2(_,_)" ) == 0) return wren_poke2; if (strcmp(signature, "static TIC.peek4(_)" ) == 0) return wren_peek4; if (strcmp(signature, "static TIC.poke4(_,_)" ) == 0) return wren_poke4; if (strcmp(signature, "static TIC.memcpy(_,_,_)" ) == 0) return wren_memcpy; diff --git a/src/core/core.c b/src/core/core.c index 860991c58..07cf357f9 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -84,11 +84,6 @@ u8 tic_api_peek4(tic_mem* memory, s32 address) return tic_api_peek(memory, address, 4); } -void tic_api_poke4(tic_mem* memory, s32 address, u8 value) -{ - tic_api_poke(memory, address, value, 4); -} - u8 tic_api_peek1(tic_mem* memory, s32 address) { return tic_api_peek(memory, address, 1); @@ -99,6 +94,21 @@ void tic_api_poke1(tic_mem* memory, s32 address, u8 value) tic_api_poke(memory, address, value, 1); } +u8 tic_api_peek2(tic_mem* memory, s32 address) +{ + return tic_api_peek(memory, address, 2); +} + +void tic_api_poke2(tic_mem* memory, s32 address, u8 value) +{ + tic_api_poke(memory, address, value, 2); +} + +void tic_api_poke4(tic_mem* memory, s32 address, u8 value) +{ + tic_api_poke(memory, address, value, 4); +} + void tic_api_memcpy(tic_mem* memory, s32 dst, s32 src, s32 size) { tic_core* core = (tic_core*)memory; From 586785478ee90f8c17bd616f5cebaed1076a870c Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Thu, 4 Nov 2021 22:56:08 -0400 Subject: [PATCH 074/379] (chore) more moonscript into separate C file --- CMakeLists.txt | 1 + src/api/lua.c | 195 +++---------------------------------------- src/api/lua_api.h | 20 +++++ src/api/moonscript.c | 186 +++++++++++++++++++++++++++++++++++++++++ src/api/squirrel.c | 4 +- src/api/wren.c | 4 +- 6 files changed, 221 insertions(+), 189 deletions(-) create mode 100644 src/api/lua_api.h create mode 100644 src/api/moonscript.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 44a123f0e..b1795b156 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -302,6 +302,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${TIC80CORE_DIR}/core/sound.c ${TIC80CORE_DIR}/api/js.c ${TIC80CORE_DIR}/api/lua.c + ${TIC80CORE_DIR}/api/moonscript.c ${TIC80CORE_DIR}/api/wren.c ${TIC80CORE_DIR}/api/squirrel.c ${TIC80CORE_DIR}/tic.c diff --git a/src/api/lua.c b/src/api/lua.c index a33108012..50c2332e0 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1328,7 +1328,7 @@ static s32 lua_loadfile(lua_State *lua) return 0; } -static void lua_open_builtins(lua_State *lua) +void lua_open_builtins(lua_State *lua) { static const luaL_Reg loadedlibs[] = { @@ -1349,7 +1349,7 @@ static void lua_open_builtins(lua_State *lua) } } -static void initAPI(tic_core* core) +void initLuaAPI(tic_core* core) { #define API_FUNC_DEF(name, ...) {lua_ ## name, #name}, static const struct{lua_CFunction func; const char* name;} ApiItems[] = {TIC_API_LIST(API_FUNC_DEF)}; @@ -1362,7 +1362,7 @@ static void initAPI(tic_core* core) registerLuaFunction(core, lua_loadfile, "loadfile"); } -static void closeLua(tic_mem* tic) +void closeLua(tic_mem* tic) { tic_core* core = (tic_core*)tic; @@ -1382,7 +1382,7 @@ static bool initLua(tic_mem* tic, const char* code) lua_State* lua = core->currentVM = luaL_newstate(); lua_open_builtins(lua); - initAPI(core); + initLuaAPI(core); { lua_State* lua = core->currentVM; @@ -1434,7 +1434,7 @@ static s32 docall (lua_State *lua, s32 narg, s32 nres) return status; } -static void callLuaTick(tic_mem* tic) +void callLuaTick(tic_mem* tic) { tic_core* core = (tic_core*)tic; @@ -1456,7 +1456,7 @@ static void callLuaTick(tic_mem* tic) } } -static void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name) +void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name) { tic_core* core = (tic_core*)tic; lua_State* lua = core->currentVM; @@ -1474,7 +1474,7 @@ static void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* n } } -static void callLuaScanline(tic_mem* tic, s32 row, void* data) +void callLuaScanline(tic_mem* tic, s32 row, void* data) { callLuaScanlineName(tic, row, data, SCN_FN); @@ -1482,12 +1482,12 @@ static void callLuaScanline(tic_mem* tic, s32 row, void* data) callLuaScanlineName(tic, row, data, "scanline"); } -static void callLuaBorder(tic_mem* tic, s32 row, void* data) +void callLuaBorder(tic_mem* tic, s32 row, void* data) { callLuaScanlineName(tic, row, data, BDR_FN); } -static void callLuaOverline(tic_mem* tic, void* data) +void callLuaOverline(tic_mem* tic, void* data) { tic_core* core = (tic_core*)tic; lua_State* lua = core->currentVM; @@ -1627,181 +1627,6 @@ const tic_script_config* get_lua_script_config() return &LuaSyntaxConfig; } -#if defined(TIC_BUILD_WITH_MOON) - -#include "moonscript.h" - -#define MOON_CODE(...) #__VA_ARGS__ - -static const char* execute_moonscript_src = MOON_CODE( - local fn, err = require('moonscript.base').loadstring(...) - - if not fn then - error(err) - end - return fn() -); - -static void setloaded(lua_State* l, char* name) -{ - s32 top = lua_gettop(l); - lua_getglobal(l, "package"); - lua_getfield(l, -1, "loaded"); - lua_getfield(l, -1, name); - if (lua_isnil(l, -1)) { - lua_pop(l, 1); - lua_pushvalue(l, top); - lua_setfield(l, -2, name); - } - - lua_settop(l, top); -} - -static bool initMoonscript(tic_mem* tic, const char* code) -{ - tic_core* core = (tic_core*)tic; - closeLua(tic); - - lua_State* lua = core->currentVM = luaL_newstate(); - lua_open_builtins(lua); - - luaopen_lpeg(lua); - setloaded(lua, "lpeg"); - - initAPI(core); - - { - lua_State* moon = core->currentVM; - - lua_settop(moon, 0); - - if (luaL_loadbuffer(moon, (const char *)moonscript_lua, moonscript_lua_len, "moonscript.lua") != LUA_OK) - { - core->data->error(core->data->data, "failed to load moonscript.lua"); - return false; - } - - lua_call(moon, 0, 0); - - if (luaL_loadbuffer(moon, execute_moonscript_src, strlen(execute_moonscript_src), "execute_moonscript") != LUA_OK) - { - core->data->error(core->data->data, "failed to load moonscript compiler"); - return false; - } - - lua_pushstring(moon, code); - if (lua_pcall(moon, 1, 1, 0) != LUA_OK) - { - const char* msg = lua_tostring(moon, -1); - - if (msg) - { - core->data->error(core->data->data, msg); - return false; - } - } - } - - return true; -} - -static const char* const MoonKeywords [] = -{ - "false", "true", "nil", "local", "return", - "break", "continue", "for", "while", - "if", "else", "elseif", "unless", "switch", - "when", "and", "or", "in", "do", - "not", "super", "try", "catch", - "with", "export", "import", "then", - "from", "class", "extends", "new", "using", -}; - -static const tic_outline_item* getMoonOutline(const char* code, s32* size) -{ - enum{Size = sizeof(tic_outline_item)}; - - *size = 0; - - static tic_outline_item* items = NULL; - - if(items) - { - free(items); - items = NULL; - } - - const char* ptr = code; - - while(true) - { - static const char FuncString[] = "=->"; - - ptr = strstr(ptr, FuncString); - - if(ptr) - { - const char* end = ptr; - - ptr += sizeof FuncString - 1; - - while(end >= code && !isalnum_(*end)) end--; - - const char* start = end; - - for (const char* val = start-1; val >= code && (isalnum_(*val)); val--, start--); - - if(end > start) - { - items = realloc(items, (*size + 1) * Size); - - items[*size].pos = start; - items[*size].size = (s32)(end - start + 1); - - (*size)++; - } - } - else break; - } - - return items; -} - -tic_script_config MoonSyntaxConfig = -{ - .name = "moon", - .fileExtension = ".moon", - .projectComment = "--", - .init = initMoonscript, - .close = closeLua, - .tick = callLuaTick, - .callback = - { - .scanline = callLuaScanline, - .border = callLuaBorder, - .overline = callLuaOverline, - }, - - .getOutline = getMoonOutline, - .eval = NULL, - - .blockCommentStart = NULL, - .blockCommentEnd = NULL, - .blockCommentStart2 = NULL, - .blockCommentEnd2 = NULL, - .blockStringStart = NULL, - .blockStringEnd = NULL, - .singleComment = "--", - - .keywords = MoonKeywords, - .keywordsCount = COUNT_OF(MoonKeywords), -}; - -const tic_script_config* get_moon_script_config() -{ - return &MoonSyntaxConfig; -} - -#endif /* defined(TIC_BUILD_WITH_MOON) */ #if defined(TIC_BUILD_WITH_FENNEL) @@ -1827,7 +1652,7 @@ static bool initFennel(tic_mem* tic, const char* code) lua_State* lua = core->currentVM = luaL_newstate(); lua_open_builtins(lua); - initAPI(core); + initLuaAPI(core); { lua_State* fennel = core->currentVM; diff --git a/src/api/lua_api.h b/src/api/lua_api.h new file mode 100644 index 000000000..d6cb0fb89 --- /dev/null +++ b/src/api/lua_api.h @@ -0,0 +1,20 @@ +#ifndef lua_api_h + +#include +#include +#include +#include +#include +#include + +extern void callLuaTick(tic_mem* tic); +extern void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name); +extern void callLuaScanline(tic_mem* tic, s32 row, void* data); +extern void callLuaBorder(tic_mem* tic, s32 row, void* data); +extern void callLuaOverline(tic_mem* tic, void* data); +extern void closeLua(tic_mem* tic); +extern void callLuaTick(tic_mem* tic); +extern void lua_open_builtins(lua_State *lua); + +#define lua_api_h +#endif \ No newline at end of file diff --git a/src/api/moonscript.c b/src/api/moonscript.c new file mode 100644 index 000000000..66204db60 --- /dev/null +++ b/src/api/moonscript.c @@ -0,0 +1,186 @@ +#include "core/core.h" + +// Moonscript requires Lua +#if defined(TIC_BUILD_WITH_LUA) + +#include "lua_api.h" + +#if defined(TIC_BUILD_WITH_MOON) + +static inline bool isalnum_(char c) {return isalnum(c) || c == '_';} + +#include "moonscript.h" + +#define MOON_CODE(...) #__VA_ARGS__ + +static const char* execute_moonscript_src = MOON_CODE( + local fn, err = require('moonscript.base').loadstring(...) + + if not fn then + error(err) + end + return fn() +); + +static void setloaded(lua_State* l, char* name) +{ + s32 top = lua_gettop(l); + lua_getglobal(l, "package"); + lua_getfield(l, -1, "loaded"); + lua_getfield(l, -1, name); + if (lua_isnil(l, -1)) { + lua_pop(l, 1); + lua_pushvalue(l, top); + lua_setfield(l, -2, name); + } + + lua_settop(l, top); +} + +static bool initMoonscript(tic_mem* tic, const char* code) +{ + tic_core* core = (tic_core*)tic; + closeLua(tic); + + lua_State* lua = core->currentVM = luaL_newstate(); + lua_open_builtins(lua); + + luaopen_lpeg(lua); + setloaded(lua, "lpeg"); + + initLuaAPI(core); + + { + lua_State* moon = core->currentVM; + + lua_settop(moon, 0); + + if (luaL_loadbuffer(moon, (const char *)moonscript_lua, moonscript_lua_len, "moonscript.lua") != LUA_OK) + { + core->data->error(core->data->data, "failed to load moonscript.lua"); + return false; + } + + lua_call(moon, 0, 0); + + if (luaL_loadbuffer(moon, execute_moonscript_src, strlen(execute_moonscript_src), "execute_moonscript") != LUA_OK) + { + core->data->error(core->data->data, "failed to load moonscript compiler"); + return false; + } + + lua_pushstring(moon, code); + if (lua_pcall(moon, 1, 1, 0) != LUA_OK) + { + const char* msg = lua_tostring(moon, -1); + + if (msg) + { + core->data->error(core->data->data, msg); + return false; + } + } + } + + return true; +} + +static const char* const MoonKeywords [] = +{ + "false", "true", "nil", "local", "return", + "break", "continue", "for", "while", + "if", "else", "elseif", "unless", "switch", + "when", "and", "or", "in", "do", + "not", "super", "try", "catch", + "with", "export", "import", "then", + "from", "class", "extends", "new", "using", +}; + +static const tic_outline_item* getMoonOutline(const char* code, s32* size) +{ + enum{Size = sizeof(tic_outline_item)}; + + *size = 0; + + static tic_outline_item* items = NULL; + + if(items) + { + free(items); + items = NULL; + } + + const char* ptr = code; + + while(true) + { + static const char FuncString[] = "=->"; + + ptr = strstr(ptr, FuncString); + + if(ptr) + { + const char* end = ptr; + + ptr += sizeof FuncString - 1; + + while(end >= code && !isalnum_(*end)) end--; + + const char* start = end; + + for (const char* val = start-1; val >= code && (isalnum_(*val)); val--, start--); + + if(end > start) + { + items = realloc(items, (*size + 1) * Size); + + items[*size].pos = start; + items[*size].size = (s32)(end - start + 1); + + (*size)++; + } + } + else break; + } + + return items; +} + +tic_script_config MoonSyntaxConfig = +{ + .name = "moon", + .fileExtension = ".moon", + .projectComment = "--", + .init = initMoonscript, + .close = closeLua, + .tick = callLuaTick, + .callback = + { + .scanline = callLuaScanline, + .border = callLuaBorder, + .overline = callLuaOverline, + }, + + .getOutline = getMoonOutline, + .eval = NULL, + + .blockCommentStart = NULL, + .blockCommentEnd = NULL, + .blockCommentStart2 = NULL, + .blockCommentEnd2 = NULL, + .blockStringStart = NULL, + .blockStringEnd = NULL, + .singleComment = "--", + + .keywords = MoonKeywords, + .keywordsCount = COUNT_OF(MoonKeywords), +}; + +const tic_script_config* get_moon_script_config() +{ + return &MoonSyntaxConfig; +} + +#endif /* defined(TIC_BUILD_WITH_MOON) */ + +#endif /* defined(TIC_BUILD_WITH_LUA) */ \ No newline at end of file diff --git a/src/api/squirrel.c b/src/api/squirrel.c index e2b1ea71b..0a32d1379 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1447,7 +1447,7 @@ static void squirrel_open_builtins(HSQUIRRELVM vm) sq_poptop(vm); } -static void initAPI(tic_core* core) +static void initLuaAPI(tic_core* core) { HSQUIRRELVM vm = core->currentVM; @@ -1500,7 +1500,7 @@ static bool initSquirrel(tic_mem* tic, const char* code) sq_newclosure(vm, squirrel_errorHandler, 0); sq_seterrorhandler(vm); - initAPI(core); + initLuaAPI(core); { HSQUIRRELVM vm = core->currentVM; diff --git a/src/api/wren.c b/src/api/wren.c index e6ded052e..bfe1012c0 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -1395,7 +1395,7 @@ static WrenForeignMethodFn bindForeignMethod( return foreignTicMethods(fullName); } -static void initAPI(tic_core* core) +static void initLuaAPI(tic_core* core) { wrenSetUserData(core->currentVM, core); @@ -1443,7 +1443,7 @@ static bool initWren(tic_mem* tic, const char* code) WrenVM* vm = core->currentVM = wrenNewVM(&config); - initAPI(core); + initLuaAPI(core); if (wrenInterpret(core->currentVM, "main", code) != WREN_RESULT_SUCCESS) { From a54f4b1ab366471272a48baf2902b52579372066 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 5 Nov 2021 12:54:13 +0300 Subject: [PATCH 075/379] Added CLIP area to the VRAM #1508 --- build/assets/bpp.tic.dat | 2 +- demos/bpp.lua | 12 ++--- src/core/core.c | 5 +- src/core/core.h | 10 ---- src/core/draw.c | 98 +++++++++++++++++++++--------------- src/studio/editors/map.c | 4 +- src/studio/editors/sprite.c | 4 +- src/studio/screens/console.c | 5 +- src/tic.h | 19 ++----- 9 files changed, 78 insertions(+), 81 deletions(-) diff --git a/build/assets/bpp.tic.dat b/build/assets/bpp.tic.dat index 294eccdff..4e62aced8 100644 --- a/build/assets/bpp.tic.dat +++ b/build/assets/bpp.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x5b, 0x5b, 0x6f, 0x23, 0x47, 0x76, 0xae, 0xbe, 0x15, 0x5b, 0x9c, 0x52, 0x5f, 0xc4, 0x8b, 0x4b, 0x66, 0xab, 0xbb, 0x57, 0xd6, 0xd2, 0x1a, 0x89, 0x63, 0xb7, 0x44, 0x99, 0xa6, 0xc7, 0xad, 0xe6, 0x78, 0x86, 0x68, 0x6f, 0x92, 0x89, 0x61, 0xc0, 0x63, 0x39, 0x70, 0x6c, 0x80, 0xe2, 0xa5, 0x25, 0x59, 0x1c, 0x4a, 0x2b, 0xc9, 0x12, 0x65, 0x73, 0x49, 0x04, 0xc8, 0xcf, 0xc8, 0x1f, 0xc8, 0x6f, 0x08, 0x10, 0x18, 0xf0, 0xc3, 0xfe, 0x81, 0x04, 0x08, 0xb0, 0x41, 0xb2, 0xc0, 0x3e, 0xec, 0x63, 0xfc, 0x90, 0x07, 0x23, 0x18, 0x58, 0x39, 0x55, 0x4d, 0x4a, 0x6c, 0x79, 0xbc, 0x58, 0x67, 0x6d, 0x38, 0xc0, 0xb2, 0x46, 0x9f, 0xaa, 0xbb, 0x4e, 0xdd, 0xbf, 0x73, 0x4e, 0xd5, 0xa1, 0x38, 0x26, 0x42, 0x48, 0xf8, 0x1f, 0x07, 0xcd, 0xd2, 0x2c, 0xcd, 0xd2, 0x9f, 0x71, 0x12, 0x15, 0x05, 0x90, 0x42, 0x22, 0x52, 0xe0, 0x6d, 0x92, 0x5f, 0x27, 0x2c, 0x48, 0xa2, 0x24, 0x4b, 0x22, 0x16, 0x53, 0x48, 0x12, 0xa0, 0xaa, 0x8c, 0x13, 0xcd, 0x65, 0x01, 0xba, 0x10, 0x15, 0x11, 0x52, 0x8a, 0xe5, 0xec, 0xfd, 0x39, 0x49, 0xe6, 0x3d, 0x83, 0xcb, 0x11, 0x21, 0x4b, 0x54, 0x91, 0xd3, 0x69, 0x80, 0x03, 0x35, 0xd2, 0xf0, 0x36, 0xc9, 0xaf, 0x93, 0x6d, 0x8a, 0xb2, 0xa2, 0x2a, 0xa2, 0x26, 0xe7, 0x51, 0x56, 0x9c, 0x43, 0xba, 0x99, 0x4f, 0x74, 0xac, 0x8a, 0x32, 0x92, 0xe5, 0x9c, 0x2c, 0xcb, 0x9a, 0xc6, 0x72, 0xf6, 0x7e, 0x2b, 0x19, 0xac, 0x1a, 0xd2, 0x10, 0x13, 0xb0, 0xda, 0x82, 0x98, 0x90, 0x46, 0x2b, 0xc8, 0x28, 0xaf, 0x20, 0x8a, 0x46, 0x80, 0x0a, 0x22, 0x90, 0x23, 0x9e, 0x57, 0x98, 0x98, 0x22, 0x8b, 0x0e, 0xa2, 0x0a, 0xc5, 0xaf, 0xe5, 0x89, 0x5f, 0xe8, 0xa1, 0x46, 0xf7, 0x4d, 0x14, 0xec, 0x9c, 0x22, 0x5a, 0xfe, 0x0f, 0xde, 0xdc, 0x23, 0x50, 0x87, 0x46, 0x94, 0x78, 0x3e, 0xe0, 0x6a, 0xc8, 0x72, 0xf6, 0xce, 0xca, 0xc7, 0xe9, 0x0b, 0x40, 0x83, 0x55, 0x45, 0x43, 0xe8, 0x0e, 0x21, 0x42, 0x11, 0xc5, 0x00, 0x89, 0xc4, 0xeb, 0x37, 0x00, 0x59, 0x44, 0x94, 0x00, 0xc6, 0x84, 0x1c, 0x05, 0x50, 0xca, 0x72, 0xbe, 0x10, 0x98, 0xb8, 0x3c, 0x08, 0x45, 0x39, 0x5d, 0x5c, 0x10, 0x03, 0xa3, 0x86, 0xf6, 0xd5, 0x0c, 0xda, 0x6f, 0x67, 0xd0, 0xb0, 0x59, 0x03, 0x19, 0x74, 0x06, 0x9d, 0x60, 0xaa, 0xaa, 0x98, 0xae, 0x01, 0xac, 0x20, 0xce, 0x55, 0x95, 0x90, 0xc4, 0x1e, 0xb8, 0x7c, 0x1f, 0x6c, 0xde, 0x04, 0x18, 0xc4, 0xb0, 0x0f, 0x98, 0xef, 0x03, 0x16, 0x25, 0x49, 0x91, 0x64, 0x99, 0x31, 0xa8, 0x88, 0x82, 0x2c, 0xa5, 0x52, 0x52, 0x82, 0x9e, 0x14, 0x4e, 0x61, 0x41, 0x90, 0x15, 0x29, 0x25, 0xa6, 0x64, 0x05, 0x2a, 0x88, 0x09, 0xfa, 0x30, 0x74, 0xa2, 0xb0, 0xc6, 0x29, 0xc8, 0x65, 0x11, 0x7a, 0xbb, 0x45, 0x2f, 0x12, 0xa0, 0x21, 0x53, 0x0b, 0x99, 0x69, 0x08, 0x7b, 0x4f, 0x6c, 0xbf, 0x06, 0xbc, 0x19, 0x29, 0xd3, 0x04, 0xe6, 0x88, 0x84, 0x44, 0x53, 0x73, 0x9c, 0x84, 0x82, 0xa9, 0x8e, 0xe6, 0xa4, 0x05, 0x01, 0xcd, 0xcd, 0xcf, 0xab, 0x05, 0xc3, 0x94, 0x55, 0x9d, 0x24, 0xda, 0x13, 0xa8, 0x6d, 0x9a, 0xb2, 0x9c, 0x06, 0xb5, 0x30, 0x81, 0x69, 0x0c, 0x5a, 0xc0, 0x78, 0xbe, 0x6e, 0x8f, 0x40, 0x75, 0x34, 0xd9, 0x10, 0x91, 0x4a, 0x20, 0x67, 0xef, 0x09, 0x05, 0xf1, 0x8d, 0x6a, 0x35, 0x32, 0xea, 0x0f, 0xce, 0x69, 0xe3, 0xb8, 0x46, 0xa9, 0xfb, 0x3a, 0xc1, 0x5e, 0x99, 0xd4, 0x6a, 0x36, 0xa9, 0xf1, 0xc3, 0xf1, 0x41, 0xdf, 0x1b, 0xfc, 0x42, 0x26, 0x8d, 0x76, 0x90, 0xf7, 0x86, 0x8d, 0x32, 0x1d, 0x81, 0xb4, 0x51, 0xab, 0xe1, 0x86, 0x6d, 0xf3, 0x79, 0x7a, 0x1e, 0x42, 0xab, 0xbf, 0xa0, 0xd4, 0x6f, 0x53, 0xba, 0xd0, 0x47, 0xa8, 0x0c, 0xef, 0xb5, 0x80, 0x10, 0xdb, 0xe6, 0x0c, 0xb0, 0x3a, 0xd5, 0x06, 0xc2, 0x75, 0x3a, 0xa4, 0x0d, 0x8c, 0x1a, 0x55, 0x5a, 0xa3, 0xa4, 0xc1, 0x8b, 0x11, 0x67, 0xa8, 0x8f, 0x03, 0xbb, 0x2e, 0x37, 0xdd, 0xb6, 0xdc, 0x70, 0x77, 0xc8, 0x60, 0xf0, 0x0e, 0xc1, 0x8d, 0x10, 0x10, 0x90, 0xe1, 0x90, 0xef, 0xdf, 0xa0, 0x3f, 0x04, 0xe5, 0x7e, 0x00, 0x70, 0x8b, 0x7e, 0xe0, 0x15, 0x1b, 0xa1, 0x37, 0x8c, 0x42, 0xcf, 0x1b, 0x0e, 0x3d, 0x26, 0x1f, 0x0c, 0x10, 0xaa, 0x3f, 0x64, 0x20, 0xd0, 0x82, 0x90, 0x10, 0x34, 0x2d, 0x6c, 0xc0, 0x73, 0x83, 0x70, 0xae, 0x01, 0x4c, 0x9f, 0x42, 0x58, 0x77, 0x03, 0xd6, 0xdf, 0x87, 0x7d, 0xa0, 0xe3, 0x7d, 0xa0, 0x9c, 0x3f, 0x4d, 0x23, 0x4a, 0x36, 0xb7, 0x90, 0xb2, 0x88, 0x28, 0xe4, 0xb2, 0x22, 0x5e, 0xd0, 0x12, 0x9a, 0xa3, 0xcd, 0xdb, 0x24, 0xb7, 0xa0, 0x88, 0x59, 0x8d, 0xbc, 0x98, 0x15, 0x65, 0x90, 0x8a, 0x09, 0x79, 0x5e, 0xd3, 0xf2, 0x39, 0x65, 0x2e, 0x67, 0xc9, 0x16, 0xc9, 0x82, 0x1e, 0xe7, 0x99, 0xa1, 0x4e, 0xeb, 0x47, 0x3e, 0xaf, 0x2b, 0x4b, 0x4b, 0x0b, 0x72, 0xd6, 0xe2, 0xb0, 0x17, 0xb2, 0x04, 0xa9, 0xb1, 0x49, 0xf2, 0xfe, 0x0d, 0x45, 0xcb, 0x65, 0xe7, 0x8c, 0xa5, 0x85, 0x79, 0x41, 0x78, 0xc1, 0x34, 0x35, 0x73, 0x5e, 0x9b, 0x6e, 0x2f, 0xd8, 0xb6, 0x05, 0x0e, 0x49, 0x9c, 0xd3, 0xf5, 0x45, 0x53, 0x10, 0xcc, 0x79, 0x5b, 0x48, 0xf4, 0x6f, 0xda, 0xf6, 0xa2, 0x09, 0xaa, 0xb7, 0x24, 0xab, 0x92, 0x29, 0xcf, 0xcd, 0x99, 0x3a, 0x36, 0x13, 0xed, 0x0b, 0x19, 0x4d, 0xc8, 0x66, 0xa1, 0x65, 0xce, 0x44, 0x66, 0xce, 0x70, 0xcc, 0x45, 0x2d, 0xc9, 0xbf, 0xe5, 0x47, 0xab, 0x2b, 0xe1, 0x87, 0x25, 0x5b, 0xfa, 0xb0, 0xb8, 0x2c, 0x7d, 0xd6, 0x6b, 0xbd, 0x8d, 0x3f, 0x1f, 0x0d, 0xfd, 0x56, 0xcd, 0xe7, 0x24, 0x0d, 0x06, 0x7e, 0x56, 0x96, 0xc3, 0xa2, 0x6d, 0x4b, 0x4d, 0x51, 0x3c, 0x3d, 0x95, 0xa4, 0xbd, 0xda, 0x48, 0x1a, 0x39, 0x23, 0x89, 0xf3, 0x53, 0x37, 0xdc, 0x3a, 0xa0, 0x0d, 0x16, 0x5f, 0x19, 0x52, 0xcf, 0x1e, 0x11, 0xcf, 0x69, 0x91, 0xf2, 0x9b, 0x2d, 0x52, 0x3b, 0x05, 0xef, 0x85, 0xe4, 0x95, 0x3a, 0x05, 0xac, 0xe0, 0x4a, 0xaf, 0x29, 0x06, 0xc3, 0x96, 0x34, 0xfa, 0xfc, 0x74, 0x74, 0x78, 0x5a, 0x1b, 0xb5, 0x5a, 0x36, 0x5f, 0x7f, 0xd5, 0xea, 0xe7, 0xea, 0x2b, 0xf5, 0xa5, 0xfa, 0x8a, 0x2c, 0x0c, 0x03, 0xac, 0x85, 0x21, 0x46, 0x61, 0x18, 0xa2, 0x30, 0x18, 0x30, 0xb9, 0x35, 0x18, 0xf4, 0x57, 0x64, 0xb9, 0x5e, 0x07, 0x05, 0x08, 0x41, 0xe7, 0x42, 0x8c, 0x23, 0x40, 0x18, 0x0c, 0x31, 0x97, 0xd7, 0x55, 0xa3, 0x0e, 0x58, 0x01, 0x64, 0x61, 0xfc, 0x20, 0xa4, 0x5e, 0x14, 0xd2, 0x4d, 0x40, 0x10, 0x71, 0xfd, 0xe9, 0xd6, 0xab, 0x72, 0xf7, 0x71, 0x5d, 0x1e, 0x3c, 0xae, 0xe3, 0x27, 0x3b, 0x21, 0x0e, 0x23, 0x8e, 0x20, 0x0c, 0xf9, 0xfa, 0x34, 0xa2, 0x59, 0xb9, 0x85, 0x9c, 0x48, 0x16, 0x2c, 0x22, 0x2f, 0x10, 0x13, 0x93, 0xac, 0x86, 0xbc, 0x29, 0xff, 0x9b, 0x5f, 0x58, 0x50, 0x72, 0xb9, 0x9c, 0x9c, 0xcd, 0x5a, 0x0c, 0xe0, 0x5b, 0xb2, 0x09, 0xfe, 0xf3, 0x36, 0x9e, 0xcf, 0xcd, 0x89, 0x32, 0x95, 0xc5, 0xb4, 0xb1, 0x20, 0xce, 0x91, 0xa4, 0xfd, 0x22, 0x09, 0xfc, 0xbd, 0x08, 0xe7, 0x06, 0x58, 0xa4, 0xcc, 0xac, 0x52, 0x82, 0x93, 0x60, 0x2a, 0xcd, 0x83, 0x82, 0x99, 0x82, 0x29, 0xcc, 0x9b, 0xf3, 0x69, 0x41, 0x35, 0x0d, 0x21, 0x6f, 0xea, 0xd3, 0x72, 0xc7, 0x34, 0x81, 0x37, 0xb0, 0x70, 0x73, 0xc1, 0x94, 0x8d, 0x85, 0xac, 0xac, 0x65, 0x0b, 0x09, 0xfe, 0x4d, 0x87, 0x98, 0xa6, 0x2a, 0xa7, 0xc1, 0xbf, 0x9b, 0x60, 0xdb, 0xa6, 0xec, 0x24, 0xf4, 0x53, 0xc0, 0x32, 0x94, 0xc2, 0x11, 0x03, 0x52, 0x15, 0xac, 0xc1, 0xc0, 0xc8, 0x4e, 0xf0, 0x4f, 0x7d, 0xbf, 0xbd, 0xd2, 0x6e, 0x46, 0xcd, 0x88, 0x0c, 0x5b, 0x81, 0x57, 0x3b, 0xad, 0xed, 0x4a, 0xb5, 0x53, 0x60, 0xb7, 0x15, 0x30, 0xaf, 0x3d, 0xaa, 0x3f, 0x7c, 0xa8, 0x02, 0xc8, 0xc3, 0xe5, 0x26, 0x69, 0x96, 0x0f, 0x71, 0xcb, 0xa9, 0xe1, 0x9a, 0x5e, 0xc3, 0x76, 0xaa, 0xcc, 0xda, 0x3f, 0xdc, 0x1d, 0x1c, 0x2f, 0x6f, 0x3c, 0x30, 0xb6, 0x5e, 0xf4, 0xa8, 0x45, 0x08, 0xb5, 0x31, 0x26, 0xaf, 0xe3, 0x11, 0x29, 0xe3, 0x11, 0xdf, 0x5f, 0xa9, 0x4a, 0x11, 0x76, 0x7d, 0x44, 0xdc, 0x08, 0x51, 0x2f, 0xf6, 0x17, 0x0d, 0xc0, 0x17, 0x3e, 0xaa, 0xf1, 0xf1, 0x81, 0xff, 0x3a, 0xf0, 0x0f, 0x90, 0xc3, 0x30, 0xa8, 0x02, 0x2f, 0x0d, 0xbc, 0x13, 0x46, 0xd8, 0x0f, 0x03, 0xe6, 0xb5, 0x07, 0x20, 0x31, 0x38, 0x40, 0x91, 0xc2, 0xe2, 0x0e, 0x0d, 0xf3, 0x43, 0x1a, 0xda, 0x3d, 0xea, 0x93, 0x90, 0xf3, 0x5f, 0x1f, 0x68, 0xf5, 0x7a, 0x1b, 0xb7, 0x43, 0x0f, 0x9a, 0x50, 0xfc, 0x8e, 0x4f, 0x70, 0x48, 0x35, 0xc0, 0x50, 0x1b, 0x3b, 0x58, 0x24, 0x90, 0x34, 0x12, 0x89, 0x89, 0x64, 0xd8, 0x19, 0x15, 0x60, 0x00, 0x5c, 0x8d, 0xfb, 0x05, 0xc4, 0xce, 0x63, 0x59, 0xc2, 0x70, 0x24, 0xa4, 0x15, 0xa4, 0xa4, 0x05, 0xa4, 0xa5, 0xb4, 0xa4, 0xff, 0x26, 0x08, 0x63, 0x38, 0x1b, 0x94, 0x94, 0xa2, 0x48, 0x62, 0x4a, 0xd3, 0xf8, 0xb1, 0x75, 0x7d, 0x46, 0x88, 0xa2, 0x2c, 0x02, 0xe1, 0xe9, 0xb4, 0x88, 0x71, 0x1a, 0x2e, 0x07, 0x77, 0xe6, 0x95, 0x3b, 0x53, 0xee, 0x97, 0x1f, 0x06, 0xa2, 0x06, 0x1d, 0xe4, 0xd3, 0x8a, 0xb8, 0x90, 0x56, 0x52, 0xe6, 0x5c, 0xc2, 0x7f, 0xb3, 0xdb, 0x80, 0x9c, 0x9f, 0xb7, 0x80, 0x48, 0x81, 0x23, 0x3f, 0x6f, 0x27, 0x0f, 0x6f, 0x0b, 0xe5, 0x09, 0xca, 0x9b, 0x4b, 0xa0, 0x09, 0x82, 0x08, 0xea, 0x26, 0x32, 0xe7, 0x71, 0x3d, 0x47, 0x41, 0x36, 0x84, 0x79, 0xa6, 0x06, 0x98, 0xce, 0x83, 0x82, 0x98, 0x26, 0x68, 0xc3, 0x94, 0x98, 0xcf, 0x44, 0xbc, 0xa3, 0x6b, 0x62, 0xd6, 0x10, 0x50, 0xce, 0x34, 0xac, 0x9c, 0x99, 0x58, 0x1f, 0x85, 0x15, 0x32, 0x78, 0x1f, 0xd9, 0x3e, 0x6a, 0x2e, 0x63, 0xd4, 0x2a, 0xa7, 0x50, 0x0d, 0x7c, 0x7f, 0xe0, 0xf0, 0x79, 0x3c, 0x00, 0x63, 0x78, 0x00, 0xbe, 0xaa, 0xef, 0x93, 0x7e, 0x14, 0x5a, 0x51, 0x6b, 0x84, 0x07, 0xa3, 0x14, 0xf6, 0xc0, 0x54, 0xd9, 0xfe, 0x39, 0xb2, 0xe1, 0xb2, 0x03, 0x47, 0x0e, 0xc0, 0xee, 0x98, 0x0f, 0x68, 0x59, 0x55, 0xb0, 0x7f, 0x0a, 0xf6, 0xef, 0x80, 0xfd, 0xeb, 0xfc, 0xf2, 0xc1, 0x1c, 0x2d, 0xbd, 0x7f, 0xdf, 0x27, 0xbd, 0x28, 0x22, 0x87, 0xad, 0x32, 0xa0, 0x46, 0xc7, 0xf6, 0xcf, 0xf7, 0x9f, 0xcd, 0xd2, 0x87, 0xf1, 0x5d, 0x18, 0xdf, 0x2f, 0x6a, 0xa8, 0x08, 0x08, 0x6c, 0x3f, 0x3e, 0xb8, 0xab, 0x00, 0x19, 0xf9, 0x96, 0x6d, 0x2d, 0x2f, 0xcb, 0xcb, 0xc5, 0x80, 0x6c, 0x16, 0x31, 0xf1, 0x7d, 0x8b, 0x30, 0x2b, 0xb5, 0xd8, 0xd8, 0x32, 0xf5, 0x56, 0xa0, 0xb2, 0xcf, 0x7c, 0xd1, 0x63, 0xea, 0x3d, 0x8e, 0xb1, 0xf9, 0x18, 0xc4, 0xdc, 0xcb, 0x72, 0x10, 0xbf, 0xaa, 0x6e, 0xd5, 0xeb, 0xf4, 0x09, 0x88, 0x62, 0x54, 0xaf, 0x7d, 0x34, 0x9e, 0x27, 0xc0, 0x0e, 0x68, 0x80, 0xa8, 0xa6, 0x34, 0x38, 0xaf, 0x65, 0x94, 0xd8, 0xbf, 0x94, 0xb2, 0xb8, 0x28, 0x2a, 0x73, 0x73, 0xa2, 0x92, 0x9e, 0x27, 0x70, 0x9a, 0xde, 0xba, 0x5f, 0xe1, 0xf4, 0xbc, 0x2e, 0xe6, 0x14, 0x59, 0x92, 0xf1, 0xc2, 0xc3, 0x3b, 0xb2, 0x8e, 0xa7, 0xe8, 0x47, 0xa2, 0xc4, 0x74, 0x04, 0x34, 0x04, 0x4b, 0xdc, 0x07, 0x88, 0xd2, 0xb7, 0x2f, 0x87, 0xf3, 0x79, 0xdd, 0x36, 0x4d, 0x43, 0x02, 0x82, 0xe9, 0x7c, 0x5e, 0xd0, 0x05, 0x23, 0x39, 0xfe, 0xc4, 0x07, 0x88, 0x60, 0xff, 0xd6, 0x2d, 0xfb, 0x67, 0x2e, 0x1a, 0x7c, 0x80, 0x9c, 0x36, 0x55, 0xd1, 0xcc, 0x83, 0xfd, 0x1b, 0x60, 0xff, 0x53, 0x33, 0x64, 0xd7, 0x55, 0x59, 0xce, 0x22, 0x59, 0x65, 0x3e, 0x20, 0x7e, 0x7f, 0x5e, 0xba, 0xff, 0x37, 0xf7, 0xab, 0x51, 0x14, 0xe1, 0xe1, 0x50, 0xa2, 0x8e, 0x2f, 0xd5, 0x24, 0x4f, 0x72, 0x24, 0x0f, 0x5d, 0xf3, 0x17, 0x30, 0x1f, 0xd0, 0x6c, 0x7e, 0x82, 0x5b, 0xe5, 0x9a, 0x5d, 0x73, 0x5e, 0xb7, 0x02, 0x2d, 0x33, 0x6e, 0xca, 0x78, 0xa0, 0x7f, 0xdf, 0x1c, 0xd0, 0x6e, 0xd3, 0x25, 0xd5, 0x80, 0xd2, 0xc0, 0x1a, 0xd0, 0x3d, 0x02, 0xe7, 0x33, 0x8e, 0x6d, 0xcd, 0xa0, 0x3d, 0xb8, 0x23, 0xbe, 0xc9, 0xed, 0x1f, 0x2e, 0x7f, 0x31, 0x92, 0xf7, 0x33, 0xe4, 0x03, 0xff, 0xf5, 0xe5, 0x65, 0xfc, 0x78, 0x13, 0x53, 0xc0, 0xb2, 0xef, 0x63, 0x5b, 0x76, 0x27, 0x36, 0x08, 0xe3, 0x2f, 0x03, 0xfb, 0xc5, 0xe2, 0x1a, 0x29, 0x16, 0x5f, 0x21, 0x45, 0x2b, 0xa8, 0x5a, 0x6a, 0xe5, 0x5a, 0x85, 0xa1, 0xbb, 0xc7, 0xf5, 0x01, 0xa9, 0xb6, 0xdb, 0xd8, 0x68, 0x7b, 0xa4, 0xda, 0xa7, 0xa4, 0xdd, 0x18, 0xf0, 0xf3, 0x5d, 0xc5, 0xb1, 0xcd, 0x73, 0xd0, 0x77, 0x21, 0x5f, 0x8d, 0x9f, 0xf1, 0x2c, 0xf4, 0x99, 0xa5, 0x59, 0x9a, 0xc5, 0xff, 0x3f, 0x71, 0xfc, 0x4f, 0x20, 0xfe, 0x27, 0x10, 0xff, 0x93, 0x71, 0xfc, 0x4f, 0x7e, 0xbc, 0xf8, 0x7f, 0x3a, 0xee, 0xbd, 0xb9, 0x00, 0x54, 0x2a, 0x31, 0xc6, 0xf1, 0x3f, 0x1d, 0xc7, 0xff, 0xf4, 0x7b, 0xc6, 0xff, 0xc6, 0xff, 0x31, 0xfe, 0x47, 0xab, 0xd0, 0x01, 0x43, 0x36, 0x0b, 0xd2, 0x00, 0x66, 0x9a, 0xe5, 0x31, 0x5b, 0x9c, 0xb3, 0xb3, 0x5b, 0xf5, 0x35, 0x55, 0x4d, 0xaf, 0x65, 0x65, 0x1f, 0x2e, 0x42, 0xfb, 0xfb, 0xcb, 0xe8, 0x93, 0x27, 0x0b, 0x28, 0x38, 0x2e, 0xf1, 0x73, 0xdd, 0x60, 0x15, 0x60, 0x85, 0xc4, 0x83, 0x98, 0xdf, 0x5b, 0x03, 0x58, 0x01, 0xcb, 0x55, 0x83, 0xfd, 0xdc, 0x8a, 0xff, 0x59, 0x77, 0x7e, 0xfc, 0x39, 0x88, 0x01, 0x8f, 0xea, 0x1f, 0x11, 0xff, 0x2b, 0x10, 0xff, 0x2b, 0x10, 0xff, 0xa7, 0x20, 0xfe, 0x97, 0x79, 0xfc, 0x9f, 0x4a, 0xd0, 0x97, 0x4a, 0xc5, 0xf1, 0x7f, 0x6a, 0x1c, 0xff, 0xa7, 0xe4, 0xef, 0x19, 0xff, 0x13, 0xdd, 0x29, 0x68, 0x94, 0xbe, 0x40, 0x34, 0x92, 0x21, 0xd2, 0xa2, 0x66, 0x3b, 0x89, 0xfb, 0x05, 0x81, 0xf8, 0x5f, 0x93, 0x24, 0x7a, 0x47, 0xd7, 0x89, 0x43, 0x33, 0x58, 0xd5, 0xb5, 0xc4, 0xfc, 0x34, 0x0d, 0xe3, 0x4c, 0x06, 0x63, 0x0d, 0x6e, 0x53, 0x19, 0x03, 0x72, 0x0d, 0xdf, 0x8e, 0xff, 0x6d, 0x88, 0x77, 0xe9, 0x54, 0xfc, 0x4f, 0x6e, 0xdf, 0xff, 0x23, 0x2b, 0x8a, 0xce, 0xed, 0x46, 0x03, 0xe2, 0xa7, 0x6a, 0x8f, 0xd2, 0x06, 0xb0, 0x19, 0xf9, 0x74, 0xc8, 0xef, 0x5f, 0xd5, 0x61, 0x75, 0xe8, 0x63, 0xd2, 0xa8, 0x04, 0xb8, 0x51, 0x6e, 0x04, 0xde, 0x08, 0xa4, 0xfc, 0xa6, 0xe7, 0xfb, 0x34, 0x3e, 0xb7, 0x11, 0x82, 0x57, 0xca, 0xe0, 0x43, 0x44, 0x16, 0x01, 0xd3, 0x91, 0x07, 0xcf, 0x16, 0xa5, 0xe3, 0x18, 0xdf, 0x87, 0x78, 0x3f, 0x1a, 0xc7, 0xff, 0x1e, 0xe4, 0x74, 0x1c, 0xff, 0xd3, 0xe4, 0x1c, 0x9a, 0x8d, 0x73, 0xda, 0x80, 0xf1, 0xab, 0x30, 0x82, 0x1c, 0xf9, 0x7e, 0x3c, 0xfe, 0x64, 0x0e, 0x5b, 0x18, 0x37, 0xb7, 0x82, 0x8a, 0xb7, 0xd9, 0xe8, 0xd1, 0x61, 0x13, 0xc6, 0x0f, 0xfc, 0x9b, 0xf6, 0x7c, 0x0e, 0x90, 0x9f, 0xab, 0x46, 0xd4, 0x8d, 0xe7, 0xe0, 0x37, 0xa6, 0x82, 0x6c, 0xb8, 0x08, 0x02, 0xdf, 0x15, 0xd5, 0x37, 0x3c, 0x19, 0xb9, 0x14, 0x72, 0x50, 0x06, 0x55, 0x8d, 0x3f, 0xbf, 0x91, 0xb0, 0xa2, 0x28, 0x02, 0xd0, 0x2e, 0x08, 0x90, 0x63, 0x45, 0x4a, 0x18, 0x38, 0xe8, 0x03, 0x06, 0xfe, 0x05, 0x05, 0xd4, 0x44, 0x61, 0x59, 0x4a, 0xc0, 0x49, 0xfd, 0x80, 0xb8, 0x00, 0x4c, 0x14, 0x28, 0x96, 0x14, 0xf0, 0x25, 0xf0, 0x90, 0xf0, 0x1f, 0x42, 0x4a, 0x12, 0x05, 0xa8, 0x22, 0x28, 0x31, 0x58, 0xed, 0x24, 0x7f, 0xba, 0x96, 0xcb, 0x64, 0x32, 0x4b, 0x19, 0x5d, 0x12, 0x9c, 0x4c, 0x46, 0xcb, 0xe8, 0x09, 0xfe, 0x75, 0xc7, 0xb1, 0x33, 0x92, 0x24, 0x65, 0x74, 0xbd, 0x90, 0x61, 0x99, 0x23, 0x25, 0xe2, 0x83, 0x8c, 0x0d, 0x8d, 0x08, 0xbd, 0xe3, 0x10, 0x9a, 0xca, 0x90, 0xc2, 0x9d, 0x8c, 0x7d, 0x7d, 0x2f, 0x8b, 0xe7, 0x0f, 0xf1, 0xbf, 0xe4, 0xbc, 0x90, 0x91, 0x1c, 0x27, 0x23, 0xe5, 0x0a, 0x19, 0xc7, 0xcc, 0x24, 0xe3, 0x7f, 0x3f, 0xe8, 0xc3, 0xbd, 0x8f, 0x7c, 0x08, 0x77, 0xbf, 0x0f, 0xe1, 0x52, 0xff, 0x19, 0xe4, 0x18, 0xde, 0xfd, 0x28, 0xe8, 0x73, 0xff, 0x33, 0x1c, 0xfa, 0x15, 0x56, 0x82, 0xe1, 0x97, 0x6d, 0x9f, 0x33, 0x29, 0x7b, 0xb7, 0xc7, 0xf1, 0x77, 0xe4, 0x37, 0x5a, 0x11, 0x6d, 0x94, 0x01, 0x05, 0xa0, 0x58, 0x67, 0x79, 0x44, 0xa3, 0x32, 0x10, 0xd8, 0xe2, 0xfb, 0xdb, 0x6a, 0xf9, 0xf8, 0x62, 0x2f, 0xc2, 0xa3, 0xa3, 0x08, 0x1f, 0x7e, 0x1e, 0xe1, 0xd6, 0x29, 0xa0, 0x15, 0x0d, 0xa1, 0x3c, 0xf6, 0x3f, 0x8e, 0x5f, 0xad, 0x16, 0xa3, 0xfa, 0x56, 0x4d, 0x3a, 0xd9, 0x0a, 0xa5, 0xbf, 0x0c, 0x42, 0xe9, 0x93, 0xcd, 0x70, 0xef, 0xc9, 0x69, 0x8d, 0xc7, 0x67, 0xce, 0x68, 0xe4, 0x17, 0x43, 0x16, 0xb4, 0x63, 0x29, 0x0c, 0x82, 0x53, 0xc8, 0x5b, 0x61, 0x88, 0xf7, 0x6a, 0x23, 0x9d, 0xcb, 0x5f, 0xf6, 0xfb, 0x7b, 0x2c, 0xee, 0x88, 0xd8, 0x67, 0x0f, 0xd4, 0xab, 0xc5, 0xcf, 0xe5, 0xca, 0x9e, 0x6f, 0xef, 0xf1, 0xfd, 0xdb, 0xbb, 0xf0, 0x71, 0x8f, 0x5d, 0x6c, 0x7b, 0x8f, 0xe0, 0x72, 0xfb, 0x08, 0xef, 0x9c, 0x3f, 0x82, 0xee, 0x5e, 0x1e, 0xbd, 0xfc, 0xb2, 0x1d, 0x87, 0xe7, 0x31, 0xff, 0x12, 0x10, 0x07, 0x5c, 0xc9, 0x4c, 0x01, 0x12, 0xf6, 0x0d, 0x42, 0xf1, 0x06, 0x29, 0x7e, 0x10, 0x4c, 0xf3, 0x0f, 0x0e, 0x42, 0x61, 0x86, 0x1f, 0xfb, 0x0f, 0x40, 0xea, 0x7b, 0xc5, 0xff, 0xba, 0xa6, 0xdb, 0x40, 0x7f, 0x0a, 0xa0, 0xe9, 0x19, 0xdd, 0x92, 0x40, 0x01, 0xd0, 0xd4, 0xfd, 0x1f, 0x84, 0x26, 0xc9, 0x64, 0x72, 0x00, 0x87, 0x64, 0x34, 0x07, 0xe2, 0x8f, 0xc4, 0xfd, 0x3f, 0x93, 0x87, 0xe2, 0x3c, 0x98, 0xb6, 0x8d, 0x65, 0xf0, 0x1f, 0x80, 0xef, 0x17, 0xff, 0x07, 0x76, 0xe0, 0x03, 0x5b, 0x11, 0x40, 0x0b, 0xca, 0x81, 0x8f, 0xcb, 0x95, 0x63, 0xfc, 0x26, 0xdb, 0xaf, 0x88, 0xf3, 0x33, 0x8c, 0xa2, 0x16, 0xbd, 0xc1, 0x21, 0x8d, 0xfc, 0x11, 0xe0, 0x82, 0xfa, 0x94, 0xf3, 0xfb, 0xe5, 0x97, 0x23, 0x3f, 0x8a, 0x3c, 0x08, 0xc8, 0x28, 0xa1, 0x94, 0x10, 0x9f, 0x62, 0x12, 0x81, 0x6b, 0xff, 0x92, 0x8e, 0xe3, 0x7f, 0x30, 0x53, 0xec, 0x41, 0xfc, 0xef, 0x3d, 0x3f, 0xfe, 0xaf, 0xf9, 0x8e, 0x1d, 0x45, 0x95, 0x72, 0xf4, 0xa8, 0x92, 0x0a, 0x1e, 0xd9, 0x01, 0xfe, 0xab, 0x4a, 0x03, 0xe6, 0xd0, 0xd2, 0xed, 0x3d, 0xfe, 0xf9, 0x43, 0xed, 0xa5, 0x47, 0x1f, 0xfc, 0xf5, 0x4b, 0xe1, 0x0e, 0xe1, 0x28, 0x02, 0x6c, 0x80, 0xb6, 0x63, 0xdb, 0xf8, 0x55, 0xd6, 0x7e, 0xf7, 0xed, 0x1a, 0xad, 0x84, 0x1b, 0xaa, 0xff, 0x0a, 0x55, 0x2d, 0x9f, 0xa8, 0x36, 0xc5, 0x6a, 0x85, 0xbe, 0xa4, 0x3e, 0xb2, 0x6a, 0x2a, 0xf7, 0x31, 0xe0, 0x86, 0x44, 0x63, 0x05, 0xc9, 0xc6, 0x43, 0x7e, 0x4e, 0x18, 0x00, 0xd7, 0x40, 0x93, 0xc0, 0xc6, 0xe7, 0xf1, 0xb7, 0x04, 0x36, 0x0f, 0x56, 0x0e, 0x64, 0x0a, 0x28, 0x95, 0xb4, 0x7f, 0x38, 0x5d, 0x59, 0xfc, 0x8f, 0x27, 0xf1, 0x3f, 0xc6, 0x62, 0xc2, 0xbf, 0x0a, 0xe0, 0xda, 0x25, 0x7e, 0x04, 0x30, 0xfb, 0x8f, 0x7d, 0xc0, 0x74, 0xfc, 0xcf, 0x94, 0x49, 0x04, 0x1f, 0x20, 0xa6, 0x62, 0x1d, 0xba, 0x6d, 0xff, 0x22, 0xd4, 0x90, 0x6d, 0xdd, 0x46, 0x8b, 0x99, 0x14, 0x07, 0x7b, 0x4e, 0xc4, 0xe7, 0x16, 0xb2, 0x35, 0xac, 0x2d, 0x16, 0x9c, 0xc5, 0xc5, 0x14, 0x76, 0xe0, 0x99, 0x4e, 0xc7, 0xff, 0x12, 0xa1, 0x92, 0x0e, 0x6a, 0x00, 0x3e, 0x40, 0x07, 0x40, 0xbe, 0x98, 0x99, 0x8e, 0xff, 0xd9, 0x62, 0x30, 0xc4, 0xff, 0x18, 0xdc, 0x04, 0x06, 0x47, 0x63, 0xe5, 0x32, 0xb7, 0xe2, 0x7f, 0xcc, 0xe1, 0xf9, 0x81, 0x8f, 0x1a, 0x11, 0x46, 0x03, 0x40, 0xc4, 0xf2, 0x80, 0xf3, 0xd7, 0x80, 0xf8, 0xbb, 0x01, 0x6e, 0x7c, 0xe0, 0x07, 0x03, 0x70, 0x0b, 0x51, 0x34, 0x04, 0x60, 0xf6, 0xa9, 0x20, 0x61, 0x67, 0xba, 0x8f, 0xa9, 0x87, 0x59, 0x74, 0x3b, 0x89, 0xff, 0x99, 0x1d, 0xf2, 0xdc, 0x03, 0xc2, 0x41, 0xd5, 0xe8, 0x24, 0xfe, 0x7f, 0x1d, 0x1c, 0xf6, 0x08, 0xaa, 0x1c, 0x02, 0x5a, 0xa0, 0x31, 0xad, 0x58, 0xbf, 0x54, 0x90, 0xaa, 0x14, 0x23, 0xc3, 0xad, 0xf8, 0xa8, 0xdb, 0x2b, 0xa2, 0x73, 0x3e, 0x7e, 0x11, 0x7d, 0x64, 0x5b, 0xf1, 0xfc, 0x28, 0x8c, 0xbf, 0x82, 0xba, 0x16, 0x2e, 0x9d, 0x17, 0xc1, 0xff, 0xe4, 0xc1, 0x17, 0xbd, 0x83, 0x07, 0x7d, 0x1f, 0xf3, 0xf1, 0x2d, 0x42, 0xd9, 0x47, 0xe0, 0xb8, 0xa2, 0xd1, 0x62, 0x8f, 0xd0, 0x7c, 0x44, 0x68, 0x10, 0x59, 0x7e, 0x25, 0x22, 0x2f, 0x46, 0xec, 0xf8, 0x61, 0xc6, 0xc0, 0x6e, 0x4c, 0xf9, 0x4a, 0xde, 0xca, 0x0f, 0x5f, 0x29, 0x6a, 0x3b, 0xc5, 0x22, 0x06, 0x90, 0x7f, 0x69, 0x5b, 0xd7, 0x7b, 0x88, 0x15, 0xe0, 0x97, 0x3b, 0x78, 0x59, 0x82, 0x0b, 0x9f, 0xf0, 0xad, 0xf8, 0xff, 0xc6, 0xfe, 0xe5, 0x5b, 0xf6, 0xcf, 0xb6, 0x97, 0xb9, 0x05, 0x51, 0xc1, 0x92, 0x02, 0x57, 0x2b, 0x45, 0x4e, 0x7d, 0xef, 0xf8, 0x5f, 0x07, 0xce, 0x33, 0xc0, 0x7d, 0x66, 0x51, 0xb2, 0x74, 0x5b, 0xd2, 0x25, 0x8a, 0x12, 0xfc, 0x01, 0x75, 0x26, 0x1c, 0xf2, 0x39, 0x0c, 0xf6, 0x6f, 0xdd, 0xb2, 0x7f, 0x76, 0xc6, 0x16, 0x16, 0x1d, 0x59, 0x5b, 0x24, 0x98, 0xf9, 0x80, 0x02, 0xfd, 0x8e, 0xf8, 0x9f, 0xfc, 0xe1, 0xf8, 0x3f, 0x00, 0xbe, 0x59, 0xfc, 0x0f, 0x3f, 0xc0, 0x34, 0x6e, 0xc0, 0xbf, 0x80, 0xed, 0x30, 0x19, 0x1f, 0xe2, 0x01, 0xd8, 0x3f, 0x89, 0x71, 0x08, 0xb7, 0x83, 0x51, 0x75, 0x40, 0x2b, 0xd3, 0xf1, 0x3f, 0x78, 0x74, 0x0a, 0xa4, 0x13, 0x0b, 0xee, 0x01, 0x15, 0x9f, 0xd0, 0x16, 0x85, 0xf8, 0x9f, 0xdd, 0x0d, 0xf9, 0xfd, 0xf0, 0x26, 0xfe, 0x67, 0xb7, 0x02, 0x8e, 0x5b, 0xf1, 0x7f, 0xa5, 0x5b, 0xf1, 0x7b, 0xe7, 0x5d, 0x76, 0xf4, 0x54, 0xed, 0x01, 0x39, 0xc6, 0x0d, 0xc2, 0xc7, 0x97, 0x27, 0xe3, 0x17, 0xa3, 0x1d, 0x88, 0xfd, 0x63, 0x9c, 0xe7, 0x77, 0xaa, 0x25, 0xed, 0x95, 0xe9, 0xf1, 0x7b, 0x51, 0xc0, 0xaf, 0xa1, 0xf4, 0x9c, 0x50, 0xab, 0x5b, 0xa4, 0xe7, 0x70, 0x57, 0x01, 0xd3, 0x19, 0xc7, 0xfd, 0x63, 0x78, 0x10, 0xfb, 0xd3, 0x6c, 0xfc, 0x4c, 0xc4, 0xcf, 0x6c, 0x54, 0xd0, 0x0a, 0xc4, 0xcc, 0x15, 0xf2, 0xa6, 0x83, 0x5e, 0x30, 0x9d, 0x42, 0xbe, 0x90, 0x2b, 0x24, 0xe6, 0x65, 0x3b, 0x8e, 0xb6, 0x60, 0x22, 0x73, 0xc1, 0x74, 0xb4, 0x82, 0x83, 0xe4, 0x82, 0xee, 0x24, 0xae, 0xd7, 0x86, 0xf5, 0xbe, 0x51, 0xb5, 0x90, 0x3b, 0x08, 0xde, 0x7a, 0x10, 0x64, 0xd1, 0x37, 0x4b, 0xd9, 0xb7, 0x7e, 0x35, 0x97, 0x45, 0x6f, 0xa4, 0xd4, 0xf7, 0xf9, 0xa7, 0xf0, 0x17, 0x56, 0x80, 0x0f, 0x97, 0x47, 0xa3, 0x8b, 0x7f, 0x5c, 0xc3, 0x17, 0xbf, 0x5c, 0x43, 0x17, 0x3f, 0x5b, 0xf3, 0x0e, 0xc5, 0xb5, 0x11, 0x94, 0x7b, 0xd3, 0xfd, 0x30, 0x55, 0xfc, 0x07, 0x58, 0xe7, 0xd7, 0xff, 0x04, 0xf8, 0x46, 0x47, 0x5f, 0x5f, 0xd5, 0xd0, 0x57, 0x57, 0x2f, 0xcf, 0xa2, 0xb3, 0x1f, 0x39, 0xa5, 0x75, 0x8d, 0xa4, 0xe7, 0x4c, 0x2c, 0x2f, 0x39, 0x4e, 0xe1, 0x85, 0x02, 0x2e, 0x58, 0xc9, 0xd3, 0x53, 0xcd, 0x11, 0x35, 0x0b, 0x97, 0xc7, 0xb4, 0xb9, 0x14, 0x28, 0xc8, 0x5e, 0x92, 0x72, 0x64, 0xee, 0x87, 0x1c, 0xff, 0x2b, 0xb8, 0x0c, 0x30, 0x7c, 0x8d, 0x74, 0xf4, 0xef, 0x80, 0x7f, 0x03, 0x7c, 0x35, 0xc6, 0xd7, 0x28, 0x35, 0x23, 0xe8, 0x47, 0x4e, 0x8e, 0xc3, 0x7c, 0x22, 0x51, 0x97, 0x72, 0xce, 0xd2, 0x52, 0x8e, 0xe5, 0x72, 0xc2, 0xbe, 0x1d, 0x51, 0xd1, 0x1d, 0x3c, 0x6f, 0x38, 0xda, 0x92, 0x09, 0xb9, 0x00, 0xef, 0xf6, 0x0f, 0xca, 0xff, 0x95, 0x73, 0x83, 0x5f, 0xfb, 0xe8, 0x0b, 0xa9, 0x86, 0x7e, 0x8b, 0xe8, 0x8c, 0x98, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x1f, 0x20, 0x7d, 0xe3, 0x38, 0xe8, 0xaa, 0x56, 0x63, 0xf8, 0x06, 0x20, 0x5e, 0x5d, 0x4d, 0x30, 0x02, 0x5c, 0x5d, 0xff, 0x1d, 0x87, 0x7d, 0x25, 0xfb, 0xfa, 0x9b, 0xa4, 0xcb, 0x6f, 0x01, 0x96, 0x39, 0xe2, 0xc4, 0xbe, 0x08, 0xff, 0x7b, 0xc0, 0x6f, 0xc6, 0xf8, 0x72, 0x9c, 0x0f, 0xd1, 0x6f, 0xe1, 0xf7, 0xd7, 0x01, 0x42, 0xcf, 0xd8, 0x58, 0x1c, 0x02, 0xba, 0x42, 0x12, 0x83, 0x70, 0xc5, 0xff, 0x1e, 0x34, 0x4b, 0x3f, 0x65, 0x62, 0x1c, 0x5f, 0x8d, 0xae, 0x80, 0xfb, 0x09, 0xb8, 0x1e, 0xa0, 0x2b, 0xd0, 0x8b, 0x7f, 0xd6, 0x75, 0xce, 0x37, 0xe3, 0x5e, 0x5f, 0xb6, 0x90, 0x6e, 0x2d, 0x23, 0xfd, 0xb9, 0xbd, 0xb0, 0xff, 0xa9, 0xf2, 0xbb, 0x2b, 0xe0, 0xfc, 0x2a, 0x99, 0xc7, 0xff, 0x83, 0x85, 0x93, 0x0f, 0x4c, 0x3f, 0x63, 0x7f, 0xfd, 0x13, 0x9f, 0x5d, 0xb1, 0xbf, 0x06, 0x8a, 0x40, 0xbd, 0x38, 0xa3, 0xff, 0xff, 0x4b, 0x7a, 0xc6, 0xbf, 0x16, 0x60, 0x18, 0x71, 0xfe, 0xee, 0x04, 0xde, 0xb5, 0xed, 0xb3, 0x74, 0xfd, 0xd7, 0x98, 0xf7, 0x01, 0x17, 0x17, 0x08, 0x2d, 0x4f, 0xf3, 0xff, 0x9b, 0xff, 0x02, 0x80, 0x13, 0xf8, 0xfd, 0xef, 0xe2, 0x9c, 0xbd, 0x0f, 0x87, 0x31, 0xd7, 0xdf, 0x5c, 0x71, 0x60, 0xe0, 0x1e, 0x9c, 0x00, 0xc7, 0xb3, 0xe9, 0xef, 0x08, 0xcc, 0xd2, 0x4f, 0x96, 0xbc, 0x77, 0x81, 0xf7, 0x09, 0xc6, 0x5f, 0x0f, 0x01, 0x37, 0x6d, 0xa5, 0x6e, 0xfd, 0xed, 0x2d, 0x00, 0xd2, 0xad, 0xb5, 0x84, 0x3e, 0x24, 0xed, 0x9f, 0xd9, 0x3c, 0xe3, 0xfd, 0xd7, 0xe0, 0xfc, 0xff, 0xf3, 0xef, 0x40, 0x0f, 0xb8, 0xfd, 0x03, 0xc7, 0x44, 0x44, 0xc4, 0x16, 0x91, 0x5d, 0x13, 0x51, 0x8d, 0x30, 0x60, 0x28, 0x7b, 0x76, 0x25, 0xff, 0x37, 0xfb, 0x2e, 0x80, 0xac, 0xfc, 0x39, 0x6d, 0xf6, 0x42, 0x26, 0x9b, 0x9b, 0x0b, 0xfe, 0xb4, 0x3e, 0x60, 0xcb, 0xfe, 0x15, 0xa3, 0x7b, 0xf7, 0xdc, 0xb3, 0x83, 0xb3, 0x6e, 0xe7, 0xbe, 0xeb, 0x3e, 0xec, 0x1e, 0x9c, 0xb9, 0xa7, 0x9d, 0xbd, 0xa7, 0x9d, 0xde, 0x99, 0xdb, 0xee, 0x3c, 0x3d, 0x72, 0x5b, 0xbb, 0x27, 0x67, 0x69, 0xa8, 0xb1, 0xfb, 0xe9, 0xd9, 0xfe, 0xd1, 0xc9, 0x7d, 0xb7, 0xdd, 0xee, 0x74, 0x3b, 0x20, 0xbe, 0x64, 0x85, 0xed, 0xce, 0x69, 0x0b, 0x5a, 0xb9, 0x3b, 0xbb, 0x27, 0x07, 0xbb, 0xcd, 0x6e, 0xc7, 0x7d, 0xf8, 0xee, 0xbb, 0xee, 0x49, 0xa7, 0xd7, 0xee, 0x9c, 0x1c, 0xf4, 0xf6, 0x5c, 0x56, 0xe5, 0xb4, 0x75, 0x72, 0x70, 0x7c, 0x76, 0xdf, 0xed, 0x7e, 0xba, 0x9b, 0x4e, 0x7f, 0xb0, 0xbd, 0x51, 0x59, 0xdb, 0x4a, 0x1f, 0x45, 0xd1, 0x69, 0xe7, 0xcc, 0xdd, 0x4e, 0x7f, 0x9e, 0x86, 0xc6, 0x5e, 0xc9, 0x65, 0x69, 0x23, 0xce, 0x36, 0x4b, 0xac, 0xec, 0x03, 0xf6, 0xf2, 0xc1, 0xfa, 0x46, 0x9c, 0xb1, 0xb2, 0xcd, 0x35, 0x28, 0x83, 0x5f, 0xac, 0x8c, 0x65, 0x50, 0xf6, 0xab, 0xf4, 0xd1, 0xd3, 0xdd, 0x63, 0x77, 0xdb, 0xfd, 0xdc, 0x2b, 0x6d, 0x94, 0xca, 0xa5, 0xcd, 0x5f, 0xa5, 0xd3, 0xd1, 0xa7, 0xbd, 0xd6, 0xd9, 0xc1, 0x51, 0xcf, 0x3d, 0x09, 0x4f, 0x76, 0x9f, 0x76, 0x56, 0xfb, 0xa5, 0xcb, 0xd2, 0x45, 0x69, 0xbf, 0x34, 0x5e, 0x53, 0xe9, 0xf4, 0xec, 0xb2, 0xdb, 0xb9, 0x0b, 0x43, 0x74, 0x8f, 0x5a, 0xbb, 0x5d, 0xf7, 0xb0, 0xd3, 0x61, 0x1d, 0x1c, 0x77, 0x3a, 0x87, 0x5b, 0xab, 0x9b, 0x6b, 0x5e, 0xdf, 0x2b, 0x87, 0xe1, 0x23, 0x26, 0x3f, 0x3e, 0x3a, 0xec, 0x4c, 0x15, 0x95, 0x26, 0xbb, 0xc2, 0x64, 0xd7, 0x83, 0x34, 0xdb, 0x27, 0xab, 0xfd, 0xcb, 0xd2, 0xc9, 0x11, 0x2f, 0x9e, 0x74, 0xba, 0x7f, 0xf2, 0xd9, 0xf6, 0x2a, 0x94, 0xfd, 0x7c, 0xf3, 0xee, 0xf6, 0x36, 0xac, 0xee, 0x00, 0x36, 0xa4, 0xe4, 0xb6, 0x78, 0x8d, 0x83, 0x88, 0x89, 0xdd, 0xb3, 0xfd, 0x4e, 0xcf, 0x6d, 0x6d, 0xf7, 0xb9, 0x6c, 0xfb, 0xe2, 0x5e, 0x99, 0x0b, 0x3b, 0xdd, 0xd3, 0x0e, 0x94, 0x5e, 0xc6, 0xa5, 0xfb, 0xf7, 0xca, 0x2e, 0xe4, 0x5c, 0xc2, 0x7f, 0x45, 0x47, 0x27, 0xee, 0x01, 0x74, 0xc8, 0xa4, 0x6e, 0xfb, 0x88, 0x97, 0x4d, 0xc6, 0x6c, 0x1d, 0xc0, 0x32, 0x5a, 0xeb, 0x07, 0x6b, 0xd5, 0xf5, 0x6a, 0x42, 0xd0, 0x7c, 0x0f, 0x04, 0x4f, 0x77, 0xcf, 0xf6, 0x5f, 0x39, 0xd9, 0xed, 0xb5, 0x8f, 0x9e, 0xae, 0x6e, 0x94, 0xb6, 0xee, 0x8e, 0x6b, 0x9c, 0x1e, 0x9f, 0xac, 0x8e, 0x1f, 0xe1, 0x85, 0xed, 0xcc, 0x7a, 0x4c, 0xcd, 0xdf, 0x36, 0xdf, 0x5b, 0xdb, 0xfc, 0xb8, 0x74, 0x2d, 0x63, 0x53, 0x86, 0xd6, 0x6c, 0x14, 0x98, 0x03, 0xac, 0xf8, 0x5b, 0x92, 0xfe, 0x25, 0x93, 0xb4, 0x0e, 0x6e, 0x24, 0x8c, 0x13, 0xaf, 0xc4, 0x18, 0x82, 0xde, 0x3e, 0x5e, 0x87, 0xfd, 0x18, 0x8b, 0xe2, 0xd1, 0xe3, 0x95, 0xb1, 0xdf, 0x90, 0x4d, 0xcd, 0xef, 0xb4, 0xd3, 0x69, 0xaf, 0xf6, 0xd7, 0x2f, 0x6f, 0x38, 0xea, 0x6f, 0x6e, 0xf7, 0xd7, 0x57, 0x2f, 0xee, 0x6d, 0xdc, 0x5d, 0xab, 0xba, 0x97, 0x9b, 0xdb, 0x97, 0xeb, 0xab, 0xfb, 0xfc, 0x85, 0xb5, 0x64, 0x4b, 0xe0, 0x33, 0x2f, 0x31, 0xa6, 0xbd, 0xbb, 0xd3, 0x45, 0x93, 0xc5, 0x94, 0x3f, 0x2e, 0xf5, 0x37, 0xbf, 0x53, 0xfa, 0x3a, 0x48, 0xdd, 0xd2, 0xe5, 0xe6, 0x77, 0x88, 0xdf, 0x88, 0x1b, 0x8f, 0xc5, 0xf0, 0xc3, 0x38, 0x1f, 0xf7, 0xc5, 0x1f, 0x37, 0x4b, 0x9b, 0x93, 0xe7, 0x7e, 0xa9, 0x7c, 0xfd, 0xb8, 0x59, 0xda, 0x18, 0x37, 0x38, 0xe9, 0xb4, 0xce, 0x60, 0x45, 0xd5, 0xd2, 0x25, 0xe0, 0x62, 0xad, 0x7a, 0x6f, 0xa3, 0x52, 0xda, 0x8f, 0xb3, 0x8d, 0xe7, 0x6a, 0x1a, 0x53, 0xca, 0xbb, 0x69, 0xbe, 0x35, 0x53, 0xea, 0x7c, 0xd4, 0x3b, 0x7b, 0x6f, 0xbf, 0xd3, 0x81, 0xae, 0x4a, 0xee, 0xe5, 0xb5, 0x3a, 0x96, 0xdc, 0xdd, 0xee, 0xd9, 0x64, 0xe2, 0xab, 0x13, 0x1d, 0x5d, 0xdb, 0x5a, 0x87, 0xe2, 0xb5, 0x8d, 0xcd, 0x6a, 0xbc, 0x2d, 0x9c, 0x0a, 0xaf, 0xb4, 0x55, 0xaa, 0x7e, 0xab, 0xdf, 0x27, 0x9d, 0xfe, 0xd9, 0xea, 0x19, 0xfc, 0xe2, 0x35, 0x27, 0xbd, 0x8e, 0x3b, 0xfd, 0x93, 0x8c, 0x04, 0x26, 0x7c, 0xd3, 0xb1, 0x57, 0x7a, 0xad, 0x54, 0x2d, 0x45, 0xbb, 0xa0, 0xe1, 0x30, 0x99, 0x71, 0xf7, 0x7f, 0x68, 0xe5, 0xcc, 0x75, 0xc4, 0x9d, 0x9d, 0x72, 0xc5, 0xdf, 0x68, 0x1e, 0x1f, 0xbb, 0x0f, 0xdf, 0x76, 0x8f, 0x77, 0xf7, 0x3a, 0xee, 0xee, 0x49, 0xe7, 0x3e, 0xab, 0xf1, 0x46, 0xc9, 0xdd, 0x00, 0x7f, 0xb0, 0x51, 0x06, 0xbc, 0x96, 0x4e, 0xc7, 0xd3, 0x65, 0x63, 0x6e, 0x2f, 0x3f, 0xd9, 0xef, 0xb8, 0xbf, 0xfc, 0xf4, 0xa0, 0x75, 0xe8, 0x36, 0x4f, 0x8e, 0x2e, 0x7a, 0x1f, 0xf5, 0xa2, 0xa3, 0xbe, 0xfb, 0xc9, 0xa7, 0x4f, 0x8f, 0x4f, 0xdd, 0xa3, 0xf3, 0xce, 0xc9, 0x47, 0x3d, 0x30, 0x41, 0xb7, 0xbb, 0xfb, 0xd9, 0x25, 0x58, 0xd2, 0xde, 0xcf, 0x96, 0xc7, 0x6d, 0x4f, 0x3b, 0xdd, 0x6d, 0xef, 0x66, 0x77, 0x9e, 0xfc, 0xc5, 0xa3, 0x55, 0x36, 0xd1, 0x56, 0xf7, 0x74, 0x75, 0xe3, 0xb5, 0x6f, 0x4f, 0xd9, 0x03, 0x6f, 0xe4, 0xdd, 0x9d, 0x58, 0x28, 0xd8, 0x76, 0xf3, 0xac, 0x77, 0xbc, 0xea, 0xdd, 0x8d, 0xed, 0x9b, 0x75, 0x06, 0x94, 0x74, 0x41, 0x59, 0x7f, 0x5e, 0x1d, 0x2b, 0xfc, 0xa4, 0xce, 0xc6, 0xad, 0x3a, 0xeb, 0xd7, 0x75, 0xa0, 0x12, 0xac, 0x8c, 0x2f, 0xf7, 0xec, 0xe8, 0x0c, 0xe6, 0x74, 0x00, 0xee, 0xb4, 0x0f, 0xee, 0x34, 0x3d, 0x37, 0x07, 0x82, 0xe6, 0xb4, 0x87, 0xde, 0x76, 0x99, 0xb1, 0x8f, 0x5d, 0xdd, 0x06, 0xb8, 0x1a, 0x06, 0xb6, 0x29, 0x5b, 0x25, 0xb7, 0xca, 0xde, 0xb6, 0x60, 0x76, 0x73, 0x73, 0x71, 0xcb, 0xad, 0x3f, 0xb2, 0xcb, 0x4d, 0x77, 0xb5, 0xdd, 0x89, 0x76, 0x3f, 0x8d, 0x39, 0x9a, 0x52, 0xbc, 0x32, 0x74, 0xce, 0x00, 0xd3, 0x7d, 0xf5, 0xd5, 0x4d, 0x9e, 0x83, 0x8b, 0xbb, 0xee, 0x9f, 0x4f, 0x39, 0xde, 0xc6, 0x49, 0xff, 0xee, 0x2a, 0xd3, 0x82, 0xbb, 0xb1, 0x9c, 0x3d, 0x82, 0x04, 0x36, 0x1f, 0x28, 0x05, 0x26, 0x99, 0xdb, 0x08, 0xdf, 0xbe, 0x66, 0xf9, 0xf9, 0xcb, 0x5b, 0xdf, 0x5a, 0x67, 0x8c, 0xb3, 0x89, 0xdc, 0x68, 0x2a, 0x2c, 0x0c, 0xa6, 0x51, 0x01, 0x30, 0xf9, 0x78, 0x3a, 0x7c, 0x36, 0xdb, 0xdb, 0x1b, 0x5c, 0x7f, 0xdc, 0xf4, 0xff, 0x02, 0x57, 0x04, 0x9f, 0x6f, \ No newline at end of file +0x78, 0xda, 0xed, 0x5b, 0x5b, 0x6f, 0x23, 0x47, 0x76, 0xae, 0xbe, 0x15, 0x5b, 0x9c, 0x52, 0x5f, 0xc4, 0x8b, 0x4b, 0x66, 0xab, 0xbb, 0x57, 0xd6, 0xd2, 0x1a, 0x89, 0x63, 0xb7, 0x44, 0x99, 0xa6, 0xc7, 0xad, 0xe6, 0x78, 0x86, 0x68, 0x6f, 0x92, 0x89, 0x61, 0xc0, 0x63, 0x39, 0x70, 0x6c, 0x80, 0xe2, 0xa5, 0x25, 0x59, 0x1c, 0x4a, 0x2b, 0x69, 0x24, 0xca, 0xe6, 0x92, 0x08, 0x90, 0x9f, 0x91, 0x3f, 0x90, 0xdf, 0x10, 0x20, 0x30, 0xe0, 0x87, 0xfd, 0x03, 0x79, 0x08, 0xb0, 0x41, 0xb2, 0xc1, 0x3e, 0xec, 0x63, 0xfc, 0x90, 0x07, 0x23, 0x18, 0x58, 0x39, 0x55, 0x4d, 0x4a, 0x6c, 0xd9, 0x5e, 0xac, 0xb3, 0x36, 0x1c, 0x60, 0x59, 0xa3, 0x4f, 0xd5, 0x5d, 0xa7, 0xee, 0xdf, 0x39, 0xa7, 0xea, 0x50, 0x1c, 0x13, 0x21, 0x24, 0xfc, 0x8f, 0x83, 0x66, 0x69, 0x96, 0x66, 0xe9, 0xcf, 0x38, 0x89, 0x8a, 0x02, 0x48, 0x21, 0x11, 0x29, 0xf0, 0x36, 0xc9, 0xaf, 0x13, 0x16, 0x24, 0x51, 0x92, 0x25, 0x11, 0x8b, 0x29, 0x24, 0x09, 0x50, 0x55, 0xc6, 0x89, 0xe6, 0xb2, 0x00, 0x5d, 0x88, 0x8a, 0x08, 0x29, 0xc5, 0x72, 0xf6, 0xfe, 0x2d, 0x49, 0xe6, 0x3d, 0x83, 0xcb, 0x11, 0x21, 0x4b, 0x54, 0x91, 0xd3, 0x69, 0x80, 0x03, 0x35, 0xd2, 0xf0, 0x36, 0xc9, 0xaf, 0x93, 0x6d, 0x8a, 0xb2, 0xa2, 0x2a, 0xa2, 0x26, 0xe7, 0x51, 0x56, 0x9c, 0x43, 0xba, 0x99, 0x4f, 0x74, 0xac, 0x8a, 0x32, 0x92, 0xe5, 0x9c, 0x2c, 0xcb, 0x9a, 0xc6, 0x72, 0xf6, 0x7e, 0x2b, 0x19, 0xac, 0x1a, 0xd2, 0x10, 0x13, 0xb0, 0xda, 0x82, 0x98, 0x90, 0x46, 0x2b, 0xc8, 0x28, 0xaf, 0x20, 0x8a, 0x46, 0x80, 0x0a, 0x22, 0x90, 0x23, 0x9e, 0x57, 0x98, 0x98, 0x22, 0x8b, 0x0e, 0xa2, 0x0a, 0xc5, 0xaf, 0xe5, 0x89, 0x5f, 0xe8, 0xa1, 0x46, 0xf7, 0x4d, 0x14, 0xec, 0x9c, 0x22, 0x5a, 0xfe, 0x77, 0xde, 0xdc, 0x23, 0x50, 0x87, 0x46, 0x94, 0x78, 0x3e, 0xe0, 0x6a, 0xc8, 0x72, 0xf6, 0xce, 0xca, 0xc7, 0xe9, 0x73, 0x40, 0x83, 0x55, 0x45, 0x43, 0xe8, 0x0e, 0x21, 0x42, 0x11, 0xc5, 0x00, 0x89, 0xc4, 0xeb, 0x37, 0x00, 0x59, 0x44, 0x94, 0x00, 0xc6, 0x84, 0x1c, 0x05, 0x50, 0xca, 0x72, 0xbe, 0x10, 0x98, 0xb8, 0x3c, 0x08, 0x45, 0x39, 0x5d, 0x5c, 0x10, 0x03, 0xa3, 0x86, 0xf6, 0xd5, 0x0c, 0xda, 0x6f, 0x67, 0xd0, 0xb0, 0x59, 0x03, 0x19, 0x74, 0x06, 0x9d, 0x60, 0xaa, 0xaa, 0x98, 0xae, 0x01, 0xac, 0x20, 0xce, 0x55, 0x95, 0x90, 0xc4, 0x1e, 0xb8, 0x7c, 0x1f, 0x6c, 0xde, 0x04, 0x18, 0xc4, 0xb0, 0x0f, 0x98, 0xef, 0x03, 0x16, 0x25, 0x49, 0x91, 0x64, 0x99, 0x31, 0xa8, 0x88, 0x82, 0x2c, 0xa5, 0x52, 0x52, 0x82, 0x9e, 0x14, 0x4e, 0x61, 0x41, 0x90, 0x15, 0x29, 0x25, 0xa6, 0x64, 0x05, 0x2a, 0x88, 0x09, 0xfa, 0x30, 0x74, 0xa2, 0xb0, 0xc6, 0x29, 0xc8, 0x65, 0x11, 0x7a, 0xbb, 0x45, 0x2f, 0x12, 0xa0, 0x21, 0x53, 0x0b, 0x99, 0x69, 0x08, 0x7b, 0x4f, 0x6c, 0xbf, 0x06, 0xbc, 0x19, 0x29, 0xd3, 0x04, 0xe6, 0x88, 0x84, 0x44, 0x53, 0x73, 0x9c, 0x84, 0x82, 0xa9, 0x8e, 0xe6, 0xa4, 0x05, 0x01, 0xcd, 0xcd, 0xcf, 0xab, 0x05, 0xc3, 0x94, 0x55, 0x9d, 0x24, 0xda, 0x13, 0xa8, 0x6d, 0x9a, 0xb2, 0x9c, 0x06, 0xb5, 0x30, 0x81, 0x69, 0x0c, 0x5a, 0xc0, 0x78, 0xbe, 0x6e, 0x8f, 0x40, 0x75, 0x34, 0xd9, 0x10, 0x91, 0x4a, 0x20, 0x67, 0xef, 0x09, 0x05, 0xf1, 0x8d, 0x6a, 0x35, 0x32, 0xea, 0x0f, 0xce, 0x69, 0xe3, 0xb8, 0x46, 0xa9, 0xfb, 0x3a, 0xc1, 0x5e, 0x99, 0xd4, 0x6a, 0x36, 0xa9, 0xf1, 0xc3, 0xf1, 0x41, 0xdf, 0x1b, 0xfc, 0x42, 0x26, 0x8d, 0x76, 0x90, 0xf7, 0x86, 0x8d, 0x32, 0x1d, 0x81, 0xb4, 0x51, 0xab, 0xe1, 0x86, 0x6d, 0xf3, 0x79, 0x7a, 0x1e, 0x42, 0xab, 0xbf, 0xa0, 0xd4, 0x6f, 0x53, 0xba, 0xd0, 0x47, 0xa8, 0x0c, 0xef, 0xb5, 0x80, 0x10, 0xdb, 0xe6, 0x0c, 0xb0, 0x3a, 0xd5, 0x06, 0xc2, 0x75, 0x3a, 0xa4, 0x0d, 0x8c, 0x1a, 0x55, 0x5a, 0xa3, 0xa4, 0xc1, 0x8b, 0x11, 0x67, 0xa8, 0x8f, 0x03, 0xbb, 0x2e, 0x37, 0xdd, 0xb6, 0xdc, 0x70, 0x77, 0xc8, 0x60, 0xf0, 0x0e, 0xc1, 0x8d, 0x10, 0x10, 0x90, 0xe1, 0x90, 0xef, 0xdf, 0xa0, 0x3f, 0x04, 0xe5, 0x7e, 0x00, 0x70, 0x8b, 0x7e, 0xe0, 0x15, 0x1b, 0xa1, 0x37, 0x8c, 0x42, 0xcf, 0x1b, 0x0e, 0x3d, 0x26, 0x1f, 0x0c, 0x10, 0xaa, 0x3f, 0x64, 0x20, 0xd0, 0x82, 0x90, 0x10, 0x34, 0x2d, 0x6c, 0xc0, 0x73, 0x83, 0x70, 0xae, 0x01, 0x4c, 0x9f, 0x42, 0x58, 0x77, 0x03, 0xd6, 0xdf, 0x87, 0x7d, 0xa0, 0xe3, 0x7d, 0xa0, 0x9c, 0x3f, 0x4d, 0x23, 0x4a, 0x36, 0xb7, 0x90, 0xb2, 0x88, 0x28, 0xe4, 0xb2, 0x22, 0x5e, 0xd0, 0x12, 0x9a, 0xa3, 0xcd, 0xdb, 0x24, 0xb7, 0xa0, 0x88, 0x59, 0x8d, 0xbc, 0x98, 0x15, 0x65, 0x90, 0x8a, 0x09, 0x79, 0x5e, 0xd3, 0xf2, 0x39, 0x65, 0x2e, 0x67, 0xc9, 0x16, 0xc9, 0x82, 0x1e, 0xe7, 0x99, 0xa1, 0x4e, 0xeb, 0x47, 0x3e, 0xaf, 0x2b, 0x4b, 0x4b, 0x0b, 0x72, 0xd6, 0xe2, 0xb0, 0x17, 0xb2, 0x04, 0xa9, 0xb1, 0x49, 0xf2, 0xfe, 0x0d, 0x45, 0xcb, 0x65, 0xe7, 0x8c, 0xa5, 0x85, 0x79, 0x41, 0x78, 0xc1, 0x34, 0x35, 0x73, 0x5e, 0x9b, 0x6e, 0x2f, 0xd8, 0xb6, 0x05, 0x0e, 0x49, 0x9c, 0xd3, 0xf5, 0x45, 0x53, 0x10, 0xcc, 0x79, 0x5b, 0x48, 0xf4, 0x6f, 0xda, 0xf6, 0xa2, 0x09, 0xaa, 0xb7, 0x24, 0xab, 0x92, 0x29, 0xcf, 0xcd, 0x99, 0x3a, 0x36, 0x13, 0xed, 0x0b, 0x19, 0x4d, 0xc8, 0x66, 0xa1, 0x65, 0xce, 0x44, 0x66, 0xce, 0x70, 0xcc, 0x45, 0x2d, 0xc9, 0xbf, 0xe5, 0x47, 0xab, 0x2b, 0xe1, 0x87, 0x25, 0x5b, 0xfa, 0xb0, 0xb8, 0x2c, 0x7d, 0xda, 0x6b, 0xbd, 0x8d, 0x3f, 0x1b, 0x0d, 0xfd, 0x56, 0xcd, 0xe7, 0x24, 0x0d, 0x06, 0x7e, 0x56, 0x96, 0xc3, 0xa2, 0x6d, 0x4b, 0x4d, 0x51, 0x3c, 0x3d, 0x95, 0xa4, 0xbd, 0xda, 0x48, 0x1a, 0x39, 0x23, 0x89, 0xf3, 0x53, 0x37, 0xdc, 0x3a, 0xa0, 0x0d, 0x16, 0x5f, 0x19, 0x52, 0xcf, 0x1e, 0x11, 0xcf, 0x69, 0x91, 0xf2, 0x9b, 0x2d, 0x52, 0x3b, 0x05, 0xef, 0x85, 0xe4, 0x95, 0x3a, 0x05, 0xac, 0xe0, 0x4a, 0xaf, 0x29, 0x06, 0xc3, 0x96, 0x34, 0xfa, 0xec, 0x74, 0x74, 0x78, 0x5a, 0x1b, 0xb5, 0x5a, 0x36, 0x5f, 0x7f, 0xd5, 0xea, 0xe7, 0xea, 0x2b, 0xf5, 0xa5, 0xfa, 0x8a, 0x2c, 0x0c, 0x03, 0xac, 0x85, 0x21, 0x46, 0x61, 0x18, 0xa2, 0x30, 0x18, 0x30, 0xb9, 0x35, 0x18, 0xf4, 0x57, 0x64, 0xb9, 0x5e, 0x07, 0x05, 0x08, 0x41, 0xe7, 0x42, 0x8c, 0x23, 0x40, 0x18, 0x0c, 0x31, 0x97, 0xd7, 0x55, 0xa3, 0x0e, 0x58, 0x01, 0x64, 0x61, 0xfc, 0x20, 0xa4, 0x5e, 0x14, 0xd2, 0x4d, 0x40, 0x10, 0x71, 0xfd, 0xe9, 0xd6, 0xab, 0x72, 0xf7, 0x71, 0x5d, 0x1e, 0x3c, 0xae, 0xe3, 0x27, 0x3b, 0x21, 0x0e, 0x23, 0x8e, 0x20, 0x0c, 0xf9, 0xfa, 0x34, 0xa2, 0x59, 0xb9, 0x85, 0x9c, 0x48, 0x16, 0x2c, 0x22, 0x2f, 0x10, 0x13, 0x93, 0xac, 0x86, 0xbc, 0x29, 0xff, 0x9b, 0x5f, 0x58, 0x50, 0x72, 0xb9, 0x9c, 0x9c, 0xcd, 0x5a, 0x0c, 0xe0, 0x5b, 0xb2, 0x09, 0xfe, 0xf3, 0x36, 0x9e, 0xcf, 0xcd, 0x89, 0x32, 0x95, 0xc5, 0xb4, 0xb1, 0x20, 0xce, 0x91, 0xa4, 0xfd, 0x22, 0x09, 0xfc, 0xbd, 0x08, 0xe7, 0x06, 0x58, 0xa4, 0xcc, 0xac, 0x52, 0x82, 0x93, 0x60, 0x2a, 0xcd, 0x83, 0x82, 0x99, 0x82, 0x29, 0xcc, 0x9b, 0xf3, 0x69, 0x41, 0x35, 0x0d, 0x21, 0x6f, 0xea, 0xd3, 0x72, 0xc7, 0x34, 0x81, 0x37, 0xb0, 0x70, 0x73, 0xc1, 0x94, 0x8d, 0x85, 0xac, 0xac, 0x65, 0x0b, 0x09, 0xfe, 0x4d, 0x87, 0x98, 0xa6, 0x2a, 0xa7, 0xc1, 0xbf, 0x9b, 0x60, 0xdb, 0xa6, 0xec, 0x24, 0xf4, 0x53, 0xc0, 0x32, 0x94, 0xc2, 0x11, 0x03, 0x52, 0x15, 0xac, 0xc1, 0xc0, 0xc8, 0x4e, 0xf0, 0x4f, 0x7d, 0xbf, 0xbd, 0xd2, 0x6e, 0x46, 0xcd, 0x88, 0x0c, 0x5b, 0x81, 0x57, 0x3b, 0xad, 0xed, 0x4a, 0xb5, 0x53, 0x60, 0xb7, 0x15, 0x30, 0xaf, 0x3d, 0xaa, 0x3f, 0x7c, 0xa8, 0x02, 0xc8, 0xc3, 0xe5, 0x26, 0x69, 0x96, 0x0f, 0x71, 0xcb, 0xa9, 0xe1, 0x9a, 0x5e, 0xc3, 0x76, 0xaa, 0xcc, 0xda, 0x3f, 0xdc, 0x1d, 0x1c, 0x2f, 0x6f, 0x3c, 0x30, 0xb6, 0x5e, 0xf4, 0xa8, 0x45, 0x08, 0xb5, 0x31, 0x26, 0xaf, 0xe3, 0x11, 0x29, 0xe3, 0x11, 0xdf, 0x5f, 0xa9, 0x4a, 0x11, 0x76, 0x7d, 0x44, 0xdc, 0x08, 0x51, 0x2f, 0xf6, 0x17, 0x0d, 0xc0, 0xe7, 0x3e, 0xaa, 0xf1, 0xf1, 0x81, 0xff, 0x3a, 0xf0, 0x0f, 0x90, 0xc3, 0x30, 0xa8, 0x02, 0x2f, 0x0d, 0xbc, 0x13, 0x46, 0xd8, 0x0f, 0x03, 0xe6, 0xb5, 0x07, 0x20, 0x31, 0x38, 0x40, 0x91, 0xc2, 0xe2, 0x0e, 0x0d, 0xf3, 0x43, 0x1a, 0xda, 0x3d, 0xea, 0x93, 0x90, 0xf3, 0x5f, 0x1f, 0x68, 0xf5, 0x7a, 0x1b, 0xb7, 0x43, 0x0f, 0x9a, 0x50, 0xfc, 0x8e, 0x4f, 0x70, 0x48, 0x35, 0xc0, 0x50, 0x1b, 0x3b, 0x58, 0x24, 0x90, 0x34, 0x12, 0x89, 0x89, 0x64, 0xd8, 0x19, 0x15, 0x60, 0x00, 0x5c, 0x8d, 0xfb, 0x05, 0xc4, 0xce, 0x63, 0x59, 0xc2, 0x70, 0x24, 0xa4, 0x15, 0xa4, 0xa4, 0x05, 0xa4, 0xa5, 0xb4, 0xa4, 0xff, 0x26, 0x08, 0x63, 0x38, 0x1b, 0x94, 0x94, 0xa2, 0x48, 0x62, 0x4a, 0xd3, 0xf8, 0xb1, 0x75, 0x7d, 0x46, 0x88, 0xa2, 0x2c, 0x02, 0xe1, 0xe9, 0xb4, 0x88, 0x71, 0x1a, 0x2e, 0x07, 0x77, 0xe6, 0x95, 0x3b, 0x53, 0xee, 0x97, 0x1f, 0x06, 0xa2, 0x06, 0x1d, 0xe4, 0xd3, 0x8a, 0xb8, 0x90, 0x56, 0x52, 0xe6, 0x5c, 0xc2, 0x7f, 0xb3, 0xdb, 0x80, 0x9c, 0x9f, 0xb7, 0x80, 0x48, 0x81, 0x23, 0x3f, 0x6f, 0x27, 0x0f, 0x6f, 0x0b, 0xe5, 0x09, 0xca, 0x9b, 0x4b, 0xa0, 0x09, 0x82, 0x08, 0xea, 0x26, 0x32, 0xe7, 0x71, 0x3d, 0x47, 0x41, 0x36, 0x84, 0x79, 0xa6, 0x06, 0x98, 0xce, 0x83, 0x82, 0x98, 0x26, 0x68, 0xc3, 0x94, 0x98, 0xcf, 0x44, 0xbc, 0xa3, 0x6b, 0x62, 0xd6, 0x10, 0x50, 0xce, 0x34, 0xac, 0x9c, 0x99, 0x58, 0x1f, 0x85, 0x15, 0x32, 0x78, 0x1f, 0xd9, 0x3e, 0x6a, 0x2e, 0x63, 0xd4, 0x2a, 0xa7, 0x50, 0x0d, 0x7c, 0x7f, 0xe0, 0xf0, 0x79, 0x3c, 0x00, 0x63, 0x78, 0x00, 0xbe, 0xaa, 0xef, 0x93, 0x7e, 0x14, 0x5a, 0x51, 0x6b, 0x84, 0x07, 0xa3, 0x14, 0xf6, 0xc0, 0x54, 0xd9, 0xfe, 0x39, 0xb2, 0xe1, 0xb2, 0x03, 0x47, 0x0e, 0xc0, 0xee, 0x98, 0x0f, 0x68, 0x59, 0x55, 0xb0, 0x7f, 0x0a, 0xf6, 0xef, 0x80, 0xfd, 0xeb, 0xfc, 0xf2, 0xc1, 0x1c, 0x2d, 0xbd, 0x7f, 0xdf, 0x27, 0xbd, 0x28, 0x22, 0x87, 0xad, 0x32, 0xa0, 0x46, 0xc7, 0xf6, 0xcf, 0xf7, 0x9f, 0xcd, 0xd2, 0x87, 0xf1, 0x5d, 0x18, 0xdf, 0x2f, 0x6a, 0xa8, 0x08, 0x08, 0x6c, 0x3f, 0x3e, 0xb8, 0xab, 0x00, 0x19, 0xf9, 0x96, 0x6d, 0x2d, 0x2f, 0xcb, 0xcb, 0xc5, 0x80, 0x6c, 0x16, 0x31, 0xf1, 0x7d, 0x8b, 0x30, 0x2b, 0xb5, 0xd8, 0xd8, 0x32, 0xf5, 0x56, 0xa0, 0xb2, 0xcf, 0x7c, 0xd1, 0x63, 0xea, 0x3d, 0x8e, 0xb1, 0xf9, 0x18, 0xc4, 0xdc, 0xcb, 0x72, 0x10, 0xbf, 0xaa, 0x6e, 0xd5, 0xeb, 0xf4, 0x09, 0x88, 0x62, 0x54, 0xaf, 0x7d, 0x34, 0x9e, 0x27, 0xc0, 0x0e, 0x68, 0x80, 0xa8, 0xa6, 0x34, 0x38, 0xaf, 0x65, 0x94, 0xd8, 0xbf, 0x94, 0xb2, 0xb8, 0x28, 0x2a, 0x73, 0x73, 0xa2, 0x92, 0x9e, 0x27, 0x70, 0x9a, 0xde, 0xba, 0x5f, 0xe1, 0xf4, 0xbc, 0x2e, 0xe6, 0x14, 0x59, 0x92, 0xf1, 0xc2, 0xc3, 0x3b, 0xb2, 0x8e, 0xa7, 0xe8, 0x47, 0xa2, 0xc4, 0x74, 0x04, 0x34, 0x04, 0x4b, 0xdc, 0x07, 0x88, 0xd2, 0x37, 0x2f, 0x87, 0xf3, 0x79, 0xdd, 0x36, 0x4d, 0x43, 0x02, 0x82, 0xe9, 0x7c, 0x5e, 0xd0, 0x05, 0x23, 0x39, 0xfe, 0xc4, 0x07, 0x88, 0x60, 0xff, 0xd6, 0x2d, 0xfb, 0x67, 0x2e, 0x1a, 0x7c, 0x80, 0x9c, 0x36, 0x55, 0xd1, 0xcc, 0x83, 0xfd, 0x1b, 0x60, 0xff, 0x53, 0x33, 0x64, 0xd7, 0x55, 0x59, 0xce, 0x22, 0x59, 0x65, 0x3e, 0x20, 0x7e, 0xff, 0xb6, 0x74, 0xff, 0x6f, 0xee, 0x57, 0xa3, 0x28, 0xc2, 0xc3, 0xa1, 0x44, 0x1d, 0x5f, 0xaa, 0x49, 0x9e, 0xe4, 0x48, 0x1e, 0xba, 0xe6, 0x2f, 0x60, 0x3e, 0xa0, 0xd9, 0xfc, 0x04, 0xb7, 0xca, 0x35, 0xbb, 0xe6, 0xbc, 0x6e, 0x05, 0x5a, 0x66, 0xdc, 0x94, 0xf1, 0x40, 0xff, 0xbe, 0x39, 0xa0, 0xdd, 0xa6, 0x4b, 0xaa, 0x01, 0xa5, 0x81, 0x35, 0xa0, 0x7b, 0x04, 0xce, 0x67, 0x1c, 0xdb, 0x9a, 0x41, 0x7b, 0x70, 0x47, 0x7c, 0x93, 0xdb, 0x3f, 0x5c, 0xfe, 0x62, 0x24, 0xef, 0x67, 0xc8, 0x07, 0xfe, 0xeb, 0xcb, 0xcb, 0xf8, 0xf1, 0x26, 0xa6, 0x80, 0x65, 0xdf, 0xc7, 0xb6, 0xec, 0x4e, 0x6c, 0x10, 0xc6, 0x5f, 0x06, 0xf6, 0x8b, 0xc5, 0x35, 0x52, 0x2c, 0xbe, 0x42, 0x8a, 0x56, 0x50, 0xb5, 0xd4, 0xca, 0xb5, 0x0a, 0x43, 0x77, 0x8f, 0xeb, 0x03, 0x52, 0x6d, 0xb7, 0xb1, 0xd1, 0xf6, 0x48, 0xb5, 0x4f, 0x49, 0xbb, 0x31, 0xe0, 0xe7, 0xbb, 0x8a, 0x63, 0x9b, 0xe7, 0xa0, 0xef, 0x42, 0xbe, 0x1a, 0x3f, 0xe3, 0x59, 0xe8, 0x33, 0x4b, 0xb3, 0x34, 0x8b, 0xff, 0x7f, 0xe2, 0xf8, 0x9f, 0x40, 0xfc, 0x4f, 0x20, 0xfe, 0x27, 0xe3, 0xf8, 0x9f, 0xfc, 0x78, 0xf1, 0xff, 0x74, 0xdc, 0x7b, 0x73, 0x01, 0xa8, 0x54, 0x62, 0x8c, 0xe3, 0x7f, 0x3a, 0x8e, 0xff, 0xe9, 0xf7, 0x8c, 0xff, 0x8d, 0xff, 0x63, 0xfc, 0x8f, 0x56, 0xa1, 0x03, 0x86, 0x6c, 0x16, 0xa4, 0x01, 0xcc, 0x34, 0xcb, 0x63, 0xb6, 0x38, 0x67, 0x67, 0xb7, 0xea, 0x6b, 0xaa, 0x9a, 0x5e, 0xcb, 0xca, 0x3e, 0x5c, 0x84, 0xf6, 0xf7, 0x97, 0xd1, 0x27, 0x4f, 0x16, 0x50, 0x70, 0x5c, 0xe2, 0xe7, 0xba, 0xc1, 0x2a, 0xc0, 0x0a, 0x89, 0x07, 0x31, 0xbf, 0xb7, 0x06, 0xb0, 0x02, 0x96, 0xab, 0x06, 0xfb, 0xb9, 0x15, 0xff, 0xb3, 0xee, 0xfc, 0xf8, 0x73, 0x10, 0x03, 0x1e, 0xd5, 0x3f, 0x22, 0xfe, 0x57, 0x20, 0xfe, 0x57, 0x20, 0xfe, 0x4f, 0x41, 0xfc, 0x2f, 0xf3, 0xf8, 0x3f, 0x95, 0xa0, 0x2f, 0x95, 0x8a, 0xe3, 0xff, 0xd4, 0x38, 0xfe, 0x4f, 0xc9, 0xdf, 0x33, 0xfe, 0x27, 0xba, 0x53, 0xd0, 0x28, 0x7d, 0x81, 0x68, 0x24, 0x43, 0xa4, 0x45, 0xcd, 0x76, 0x12, 0xf7, 0x0b, 0x02, 0xf1, 0xbf, 0x26, 0x49, 0xf4, 0x8e, 0xae, 0x13, 0x87, 0x66, 0xb0, 0xaa, 0x6b, 0x89, 0xf9, 0x69, 0x1a, 0xc6, 0x99, 0x0c, 0xc6, 0x1a, 0xdc, 0xa6, 0x32, 0x06, 0xe4, 0x1a, 0xbe, 0x1d, 0xff, 0xdb, 0x10, 0xef, 0xd2, 0xa9, 0xf8, 0x9f, 0xdc, 0xbe, 0xff, 0x47, 0x56, 0x14, 0x9d, 0xdb, 0x8d, 0x06, 0xc4, 0x4f, 0xd5, 0x1e, 0xa5, 0x0d, 0x60, 0x33, 0xf2, 0xe9, 0x90, 0xdf, 0xbf, 0xaa, 0xc3, 0xea, 0xd0, 0xc7, 0xa4, 0x51, 0x09, 0x70, 0xa3, 0xdc, 0x08, 0xbc, 0x11, 0x48, 0xf9, 0x4d, 0xcf, 0xf7, 0x69, 0x7c, 0x6e, 0x23, 0x04, 0xaf, 0x94, 0xc1, 0x87, 0x88, 0x2c, 0x02, 0xa6, 0x23, 0x0f, 0x9e, 0x2d, 0x4a, 0xc7, 0x31, 0xbe, 0x0f, 0xf1, 0x7e, 0x34, 0x8e, 0xff, 0x3d, 0xc8, 0xe9, 0x38, 0xfe, 0xa7, 0xc9, 0x39, 0x34, 0x1b, 0xe7, 0xb4, 0x01, 0xe3, 0x57, 0x61, 0x04, 0x39, 0xf2, 0xfd, 0x78, 0xfc, 0xc9, 0x1c, 0xb6, 0x30, 0x6e, 0x6e, 0x05, 0x15, 0x6f, 0xb3, 0xd1, 0xa3, 0xc3, 0x26, 0x8c, 0x1f, 0xf8, 0x37, 0xed, 0xf9, 0x1c, 0x20, 0x3f, 0x57, 0x8d, 0xa8, 0x1b, 0xcf, 0xc1, 0x6f, 0x4c, 0x05, 0xd9, 0x70, 0x11, 0x04, 0xbe, 0x2b, 0xaa, 0x6f, 0x78, 0x32, 0x72, 0x29, 0xe4, 0xa0, 0x0c, 0xaa, 0x1a, 0x7f, 0x7e, 0x23, 0x61, 0x45, 0x51, 0x04, 0xa0, 0x5d, 0x10, 0x20, 0xc7, 0x8a, 0x94, 0x30, 0x70, 0xd0, 0x07, 0x0c, 0xfc, 0x0b, 0x0a, 0xa8, 0x89, 0xc2, 0xb2, 0x94, 0x80, 0x93, 0xfa, 0x01, 0x71, 0x01, 0x98, 0x28, 0x50, 0x2c, 0x29, 0xe0, 0x4b, 0xe0, 0x21, 0xe1, 0x3f, 0x84, 0x94, 0x24, 0x0a, 0x50, 0x45, 0x50, 0x62, 0xb0, 0xda, 0x49, 0xfe, 0x74, 0x2d, 0x97, 0xc9, 0x64, 0x96, 0x32, 0xba, 0x24, 0x38, 0x99, 0x8c, 0x96, 0xd1, 0x13, 0xfc, 0xeb, 0x8e, 0x63, 0x67, 0x24, 0x49, 0xca, 0xe8, 0x7a, 0x21, 0xc3, 0x32, 0x47, 0x4a, 0xc4, 0x07, 0x19, 0x1b, 0x1a, 0x11, 0x7a, 0xc7, 0x21, 0x34, 0x95, 0x21, 0x85, 0x3b, 0x19, 0xfb, 0xfa, 0x5e, 0x16, 0xcf, 0x1f, 0xe2, 0x7f, 0xc9, 0x79, 0x21, 0x23, 0x39, 0x4e, 0x46, 0xca, 0x15, 0x32, 0x8e, 0x99, 0x49, 0xc6, 0xff, 0x7e, 0xd0, 0x87, 0x7b, 0x1f, 0xf9, 0x10, 0xee, 0x7e, 0x1f, 0xc2, 0xa5, 0xfe, 0x53, 0xc8, 0x31, 0xbc, 0xfb, 0x51, 0xd0, 0xe7, 0xfe, 0x67, 0x38, 0xf4, 0x2b, 0xac, 0x04, 0xc3, 0x2f, 0xdb, 0x3e, 0x67, 0x52, 0xf6, 0x6e, 0x8f, 0xe3, 0xef, 0xc8, 0x6f, 0xb4, 0x22, 0xda, 0x28, 0x03, 0x0a, 0x40, 0xb1, 0xce, 0xf2, 0x88, 0x46, 0x65, 0x20, 0xb0, 0xc5, 0xf7, 0xb7, 0xd5, 0xf2, 0xf1, 0xc5, 0x5e, 0x84, 0x47, 0x47, 0x11, 0x3e, 0xfc, 0x2c, 0xc2, 0xad, 0x53, 0x40, 0x2b, 0x1a, 0x42, 0x79, 0xec, 0x7f, 0x1c, 0xbf, 0x5a, 0x2d, 0x46, 0xf5, 0xad, 0x9a, 0x74, 0xb2, 0x15, 0x4a, 0x7f, 0x19, 0x84, 0xd2, 0x27, 0x9b, 0xe1, 0xde, 0x93, 0xd3, 0x1a, 0x8f, 0xcf, 0x9c, 0xd1, 0xc8, 0x2f, 0x86, 0x2c, 0x68, 0xc7, 0x52, 0x18, 0x04, 0xa7, 0x90, 0xb7, 0xc2, 0x10, 0xef, 0xd5, 0x46, 0x3a, 0x97, 0xbf, 0xec, 0xf7, 0xf7, 0x58, 0xdc, 0x11, 0xb1, 0xcf, 0x1e, 0xa8, 0x57, 0x8b, 0x9f, 0xcb, 0x95, 0x3d, 0xdf, 0xde, 0xe3, 0xfb, 0xb7, 0x77, 0xe1, 0xe3, 0x1e, 0xbb, 0xd8, 0xf6, 0x1e, 0xc1, 0xe5, 0xf6, 0x11, 0xde, 0x39, 0x7f, 0x04, 0xdd, 0xbd, 0x3c, 0x7a, 0xf9, 0x65, 0x3b, 0x0e, 0xcf, 0x63, 0xfe, 0x25, 0x20, 0x0e, 0xb8, 0x92, 0x99, 0x02, 0x24, 0xec, 0x1b, 0x84, 0xe2, 0x0d, 0x52, 0xfc, 0x20, 0x98, 0xe6, 0x1f, 0x1c, 0x84, 0xc2, 0x0c, 0x3f, 0xf6, 0x1f, 0x80, 0xd4, 0xf7, 0x8a, 0xff, 0x75, 0x4d, 0xb7, 0x81, 0xfe, 0x14, 0x40, 0xd3, 0x33, 0xba, 0x25, 0x81, 0x02, 0xa0, 0xa9, 0xfb, 0x3f, 0x08, 0x4d, 0x92, 0xc9, 0xe4, 0x00, 0x0e, 0xc9, 0x68, 0x0e, 0xc4, 0x1f, 0x89, 0xfb, 0x7f, 0x26, 0x0f, 0xc5, 0x79, 0x30, 0x6d, 0x1b, 0xcb, 0xe0, 0x3f, 0x00, 0xdf, 0x2f, 0xfe, 0x0f, 0xec, 0xc0, 0x07, 0xb6, 0x22, 0x80, 0x16, 0x94, 0x03, 0x1f, 0x97, 0x2b, 0xc7, 0xf8, 0x4d, 0xb6, 0x5f, 0x11, 0xe7, 0x67, 0x18, 0x45, 0x2d, 0x7a, 0x83, 0x43, 0x1a, 0xf9, 0x23, 0xc0, 0x05, 0xf5, 0x29, 0xe7, 0xf7, 0x8b, 0x2f, 0x46, 0x7e, 0x14, 0x79, 0x10, 0x90, 0x51, 0x42, 0x29, 0x21, 0x3e, 0xc5, 0x24, 0x02, 0xd7, 0xfe, 0x05, 0x1d, 0xc7, 0xff, 0x60, 0xa6, 0xd8, 0x83, 0xf8, 0xdf, 0xfb, 0xf6, 0xf8, 0xbf, 0xe6, 0x3b, 0x76, 0x14, 0x55, 0xca, 0xd1, 0xa3, 0x4a, 0x2a, 0x78, 0x64, 0x07, 0xf8, 0xaf, 0x2a, 0x0d, 0x98, 0x43, 0x4b, 0xb7, 0xf7, 0xf8, 0xe7, 0x0f, 0xb5, 0x97, 0x1e, 0x7d, 0xf0, 0xd7, 0x2f, 0x85, 0x3b, 0x84, 0xa3, 0x08, 0xb0, 0x01, 0xda, 0x8e, 0x6d, 0xe3, 0x57, 0x59, 0xfb, 0xdd, 0xb7, 0x6b, 0xb4, 0x12, 0x6e, 0xa8, 0xfe, 0x2b, 0x54, 0xb5, 0x7c, 0xa2, 0xda, 0x14, 0xab, 0x15, 0xfa, 0x92, 0xfa, 0xc8, 0xaa, 0xa9, 0xdc, 0xc7, 0x80, 0x1b, 0x12, 0x8d, 0x15, 0x24, 0x1b, 0x0f, 0xf9, 0x39, 0x61, 0x00, 0x5c, 0x03, 0x4d, 0x02, 0x1b, 0x9f, 0xc7, 0xdf, 0x12, 0xd8, 0x3c, 0x58, 0x39, 0x90, 0x29, 0xa0, 0x54, 0xd2, 0xfe, 0xe1, 0x74, 0x65, 0xf1, 0x3f, 0x9e, 0xc4, 0xff, 0x18, 0x8b, 0x09, 0xff, 0x2a, 0x80, 0x6b, 0x97, 0xf8, 0x11, 0xc0, 0xec, 0x3f, 0xf6, 0x01, 0xd3, 0xf1, 0x3f, 0x53, 0x26, 0x11, 0x7c, 0x80, 0x98, 0x8a, 0x75, 0xe8, 0xb6, 0xfd, 0x8b, 0x50, 0x43, 0xb6, 0x75, 0x1b, 0x2d, 0x66, 0x52, 0x1c, 0xec, 0x39, 0x11, 0x9f, 0x5b, 0xc8, 0xd6, 0xb0, 0xb6, 0x58, 0x70, 0x16, 0x17, 0x53, 0xd8, 0x81, 0x67, 0x3a, 0x1d, 0xff, 0x4b, 0x84, 0x4a, 0x3a, 0xa8, 0x01, 0xf8, 0x00, 0x1d, 0x00, 0xf9, 0x62, 0x66, 0x3a, 0xfe, 0x67, 0x8b, 0xc1, 0x10, 0xff, 0x63, 0x70, 0x13, 0x18, 0x1c, 0x8d, 0x95, 0xcb, 0xdc, 0x8a, 0xff, 0x31, 0x87, 0xe7, 0x07, 0x3e, 0x6a, 0x44, 0x18, 0x0d, 0x00, 0x11, 0xcb, 0x03, 0xce, 0x5f, 0x03, 0xe2, 0xef, 0x06, 0xb8, 0xf1, 0x81, 0x1f, 0x0c, 0xc0, 0x2d, 0x44, 0xd1, 0x10, 0x80, 0xd9, 0xa7, 0x82, 0x84, 0x9d, 0xe9, 0x3e, 0xa6, 0x1e, 0x66, 0xd1, 0xed, 0x24, 0xfe, 0x67, 0x76, 0xc8, 0x73, 0x0f, 0x08, 0x07, 0x55, 0xa3, 0x93, 0xf8, 0xff, 0x75, 0x70, 0xd8, 0x23, 0xa8, 0x72, 0x08, 0x68, 0x81, 0xc6, 0xb4, 0x62, 0xfd, 0x52, 0x41, 0xaa, 0x52, 0x8c, 0x0c, 0xb7, 0xe2, 0xa3, 0x6e, 0xaf, 0x88, 0xce, 0xf9, 0xf8, 0x45, 0xf4, 0x91, 0x6d, 0xc5, 0xf3, 0xa3, 0x30, 0xfe, 0x0a, 0xea, 0x5a, 0xb8, 0x74, 0x5e, 0x04, 0xff, 0x93, 0x07, 0x5f, 0xf4, 0x0e, 0x1e, 0xf4, 0x7d, 0xcc, 0xc7, 0xb7, 0x08, 0x65, 0x1f, 0x81, 0xe3, 0x8a, 0x46, 0x8b, 0x3d, 0x42, 0xf3, 0x11, 0xa1, 0x41, 0x64, 0xf9, 0x95, 0x88, 0xbc, 0x18, 0xb1, 0xe3, 0x87, 0x19, 0x03, 0xbb, 0x31, 0xe5, 0x2b, 0x79, 0x2b, 0x3f, 0x7c, 0xa5, 0xa8, 0xed, 0x14, 0x8b, 0x18, 0x40, 0xfe, 0xa5, 0x6d, 0x5d, 0xef, 0x21, 0x56, 0x80, 0x5f, 0xee, 0xe0, 0x65, 0x09, 0x2e, 0x7c, 0xc2, 0x37, 0xe2, 0xff, 0x1b, 0xfb, 0x97, 0x6f, 0xd9, 0x3f, 0xdb, 0x5e, 0xe6, 0x16, 0x44, 0x05, 0x4b, 0x0a, 0x5c, 0xad, 0x14, 0x39, 0xf5, 0xbd, 0xe3, 0x7f, 0x1d, 0x38, 0xcf, 0x00, 0xf7, 0x99, 0x45, 0xc9, 0xd2, 0x6d, 0x49, 0x97, 0x28, 0x4a, 0xf0, 0x07, 0xd4, 0x99, 0x70, 0xc8, 0xe7, 0x30, 0xd8, 0xbf, 0x75, 0xcb, 0xfe, 0xd9, 0x19, 0x5b, 0x58, 0x74, 0x64, 0x6d, 0x91, 0x60, 0xe6, 0x03, 0x0a, 0xf4, 0x3b, 0xe2, 0x7f, 0xf2, 0x87, 0xe3, 0xff, 0x00, 0xf8, 0x66, 0xf1, 0x3f, 0xfc, 0x00, 0xd3, 0xb8, 0x01, 0xff, 0x02, 0xb6, 0xc3, 0x64, 0x7c, 0x88, 0x07, 0x60, 0xff, 0x24, 0xc6, 0x21, 0xdc, 0x0e, 0x46, 0xd5, 0x01, 0xad, 0x4c, 0xc7, 0xff, 0xe0, 0xd1, 0x29, 0x90, 0x4e, 0x2c, 0xb8, 0x07, 0x54, 0x7c, 0x42, 0x5b, 0x14, 0xe2, 0x7f, 0x76, 0x37, 0xe4, 0xf7, 0xc3, 0x9b, 0xf8, 0x9f, 0xdd, 0x0a, 0x38, 0x6e, 0xc5, 0xff, 0x95, 0x6e, 0xc5, 0xef, 0x9d, 0x77, 0xd9, 0xd1, 0x53, 0xb5, 0x07, 0xe4, 0x18, 0x37, 0x08, 0x1f, 0x5f, 0x9e, 0x8c, 0x5f, 0x8c, 0x76, 0x20, 0xf6, 0x8f, 0x71, 0x9e, 0xdf, 0xa9, 0x96, 0xb4, 0x57, 0xa6, 0xc7, 0xef, 0x45, 0x01, 0xbf, 0x86, 0xd2, 0x73, 0x42, 0xad, 0x6e, 0x91, 0x9e, 0xc3, 0x5d, 0x05, 0x4c, 0x67, 0x1c, 0xf7, 0x8f, 0xe1, 0x41, 0xec, 0x4f, 0xb3, 0xf1, 0x33, 0x11, 0x3f, 0xb5, 0x51, 0x41, 0x2b, 0x10, 0x33, 0x57, 0xc8, 0x9b, 0x0e, 0x7a, 0xc1, 0x74, 0x0a, 0xf9, 0x42, 0xae, 0x90, 0x98, 0x97, 0xed, 0x38, 0xda, 0x82, 0x89, 0xcc, 0x05, 0xd3, 0xd1, 0x0a, 0x0e, 0x92, 0x0b, 0xba, 0x93, 0xb8, 0x5e, 0x1b, 0xd6, 0xfb, 0x46, 0xd5, 0x42, 0xee, 0x20, 0x78, 0xeb, 0x41, 0x90, 0x45, 0x5f, 0x2f, 0x65, 0xdf, 0xfa, 0xd5, 0x5c, 0x16, 0xbd, 0x91, 0x52, 0xdf, 0xe7, 0x9f, 0xc2, 0x5f, 0x58, 0x01, 0x3e, 0x5c, 0x1e, 0x8d, 0x2e, 0xfe, 0x71, 0x0d, 0x5f, 0xfc, 0x72, 0x0d, 0x5d, 0xfc, 0x6c, 0xcd, 0x3b, 0x14, 0xd7, 0x46, 0x50, 0xee, 0x4d, 0xf7, 0xc3, 0x54, 0xf1, 0x1f, 0x60, 0x9d, 0x5f, 0xfd, 0x13, 0xe0, 0x6b, 0x1d, 0x7d, 0x75, 0x55, 0x43, 0x5f, 0x5e, 0xbd, 0x3c, 0x8b, 0xce, 0x7e, 0xe4, 0x94, 0xd6, 0x35, 0x92, 0x9e, 0x33, 0xb1, 0xbc, 0xe4, 0x38, 0x85, 0x17, 0x0a, 0xb8, 0x60, 0x25, 0x4f, 0x4f, 0x35, 0x47, 0xd4, 0x2c, 0x5c, 0x1e, 0xd3, 0xe6, 0x52, 0xa0, 0x20, 0x7b, 0x49, 0xca, 0x91, 0xb9, 0x1f, 0x72, 0xfc, 0x2f, 0xe1, 0x32, 0xc0, 0xf0, 0x15, 0xd2, 0xd1, 0xbf, 0x01, 0xfe, 0x15, 0xf0, 0xe5, 0x18, 0x5f, 0xa1, 0xd4, 0x8c, 0xa0, 0x1f, 0x39, 0x39, 0x0e, 0xf3, 0x89, 0x44, 0x5d, 0xca, 0x39, 0x4b, 0x4b, 0x39, 0x96, 0xcb, 0x09, 0xfb, 0x76, 0x44, 0x45, 0x77, 0xf0, 0xbc, 0xe1, 0x68, 0x4b, 0x26, 0xe4, 0x02, 0xbc, 0xdb, 0x3f, 0x28, 0xff, 0x57, 0xce, 0x0d, 0x7e, 0xed, 0xa3, 0xcf, 0xa5, 0x1a, 0xfa, 0x2d, 0xa2, 0x33, 0x62, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x7e, 0x80, 0xf4, 0xb5, 0xe3, 0xa0, 0xab, 0x5a, 0x8d, 0xe1, 0x6b, 0x80, 0x78, 0x75, 0x35, 0xc1, 0x08, 0x70, 0x75, 0xfd, 0x77, 0x1c, 0xf6, 0x95, 0xec, 0xeb, 0x6f, 0x92, 0x2e, 0xbf, 0x05, 0x58, 0xe6, 0x88, 0x13, 0xfb, 0x22, 0xfc, 0xef, 0x01, 0xbf, 0x19, 0xe3, 0x8b, 0x71, 0x3e, 0x44, 0xbf, 0x85, 0xdf, 0x5f, 0x05, 0x08, 0x3d, 0x67, 0x63, 0x71, 0x08, 0xe8, 0x0a, 0x49, 0x0c, 0xc2, 0x15, 0xff, 0x7b, 0xd0, 0x2c, 0xfd, 0x94, 0x89, 0x71, 0x7c, 0x35, 0xba, 0x02, 0xee, 0x27, 0xe0, 0x7a, 0x80, 0xae, 0x40, 0x2f, 0xfe, 0x59, 0xd7, 0x39, 0xdf, 0x8c, 0x7b, 0x7d, 0xd9, 0x42, 0xba, 0xb5, 0x8c, 0xf4, 0x6f, 0xed, 0x85, 0xfd, 0x4f, 0x95, 0xdf, 0x5d, 0x01, 0xe7, 0x57, 0xc9, 0x3c, 0xfe, 0x1f, 0x2c, 0x9c, 0x7c, 0x60, 0xfa, 0x39, 0xfb, 0xeb, 0x9f, 0xf8, 0xfc, 0x8a, 0xfd, 0x35, 0x50, 0x04, 0xea, 0xc5, 0x19, 0xfd, 0xff, 0x5f, 0xd2, 0x73, 0xfe, 0xb5, 0x00, 0xc3, 0x88, 0xf3, 0x77, 0x27, 0xf0, 0xae, 0x6d, 0x9f, 0xa5, 0xeb, 0xbf, 0xc6, 0xbc, 0x0f, 0xb8, 0xb8, 0x40, 0x68, 0x79, 0x9a, 0xff, 0xdf, 0xfc, 0x17, 0x00, 0x9c, 0xc0, 0xef, 0x7f, 0x17, 0xe7, 0xec, 0x7d, 0x38, 0x8c, 0xb9, 0xfe, 0xfa, 0x8a, 0x03, 0x03, 0xf7, 0xe0, 0x04, 0x38, 0x9e, 0x4f, 0x7f, 0x47, 0x60, 0x96, 0x7e, 0xb2, 0xe4, 0xbd, 0x0b, 0xbc, 0x4f, 0x30, 0xfe, 0x7a, 0x08, 0xb8, 0x69, 0x2b, 0x75, 0xeb, 0x6f, 0x6f, 0x01, 0x90, 0x6e, 0xad, 0x25, 0xf4, 0x21, 0x69, 0xff, 0xcc, 0xe6, 0x19, 0xef, 0xbf, 0x06, 0xe7, 0xff, 0x1f, 0x7f, 0x07, 0x7a, 0xc0, 0xed, 0x1f, 0x38, 0x26, 0x22, 0x22, 0xb6, 0x88, 0xec, 0x9a, 0x88, 0x6a, 0x84, 0x01, 0x43, 0xd9, 0xf3, 0x2b, 0xf9, 0xbf, 0xd9, 0x77, 0x01, 0x64, 0xe5, 0xcf, 0x69, 0xb3, 0x17, 0x32, 0xd9, 0xdc, 0x5c, 0xf0, 0xa7, 0xf5, 0x01, 0x5b, 0xf6, 0x9f, 0x18, 0xdd, 0xbb, 0xe7, 0x9e, 0x1d, 0x9c, 0x75, 0x3b, 0xf7, 0x5d, 0xf7, 0x61, 0xf7, 0xe0, 0xcc, 0x3d, 0xed, 0xec, 0x3d, 0xed, 0xf4, 0xce, 0xdc, 0x76, 0xe7, 0xe9, 0x91, 0xdb, 0xda, 0x3d, 0x39, 0x4b, 0x43, 0x8d, 0xdd, 0x67, 0x67, 0xfb, 0x47, 0x27, 0xf7, 0xdd, 0x76, 0xbb, 0xd3, 0xed, 0x80, 0xf8, 0x92, 0x15, 0xb6, 0x3b, 0xa7, 0x2d, 0x68, 0xe5, 0xee, 0xec, 0x9e, 0x1c, 0xec, 0x36, 0xbb, 0x1d, 0xf7, 0xe1, 0xbb, 0xef, 0xba, 0x27, 0x9d, 0x5e, 0xbb, 0x73, 0x72, 0xd0, 0xdb, 0x73, 0x59, 0x95, 0xd3, 0xd6, 0xc9, 0xc1, 0xf1, 0xd9, 0x7d, 0xb7, 0xfb, 0x6c, 0x37, 0x9d, 0xfe, 0x60, 0x7b, 0xa3, 0xb2, 0xb6, 0x95, 0x3e, 0x8a, 0xa2, 0xd3, 0xce, 0x99, 0xbb, 0x9d, 0xfe, 0x2c, 0x0d, 0x8d, 0xbd, 0x92, 0xcb, 0xd2, 0x46, 0x9c, 0x6d, 0x96, 0x58, 0xd9, 0x07, 0xec, 0xe5, 0x83, 0xf5, 0x8d, 0x38, 0x63, 0x65, 0x9b, 0x6b, 0x50, 0x06, 0xbf, 0x58, 0x19, 0xcb, 0xa0, 0xec, 0x57, 0xe9, 0xa3, 0xa7, 0xbb, 0xc7, 0xee, 0xb6, 0xfb, 0x99, 0x57, 0xda, 0x28, 0x95, 0x4b, 0x9b, 0xbf, 0x4a, 0xa7, 0xa3, 0x67, 0xbd, 0xd6, 0xd9, 0xc1, 0x51, 0xcf, 0x3d, 0x09, 0x4f, 0x76, 0x9f, 0x76, 0x56, 0xfb, 0xa5, 0xcb, 0xd2, 0x45, 0x69, 0xbf, 0x34, 0x5e, 0x53, 0xe9, 0xf4, 0xec, 0xb2, 0xdb, 0xb9, 0x0b, 0x43, 0x74, 0x8f, 0x5a, 0xbb, 0x5d, 0xf7, 0xb0, 0xd3, 0x61, 0x1d, 0x1c, 0x77, 0x3a, 0x87, 0x5b, 0xab, 0x9b, 0x6b, 0x5e, 0xdf, 0x2b, 0x87, 0x61, 0x75, 0x7d, 0x83, 0xd5, 0x38, 0x3e, 0x3a, 0xec, 0x24, 0x0a, 0x4b, 0x93, 0x9d, 0x61, 0xd2, 0xeb, 0x81, 0x9a, 0xed, 0x93, 0xd5, 0xfe, 0x65, 0xe9, 0xe4, 0x88, 0x17, 0x4f, 0x3a, 0xde, 0x3f, 0xf9, 0x74, 0x7b, 0x15, 0xca, 0x7e, 0xbe, 0x79, 0x77, 0x7b, 0x1b, 0x56, 0x78, 0x00, 0x9b, 0x52, 0x72, 0x5b, 0xbc, 0xc6, 0x41, 0xc4, 0xc4, 0xee, 0xd9, 0x7e, 0xa7, 0xe7, 0xb6, 0xb6, 0xfb, 0x5c, 0xb6, 0x7d, 0x71, 0xaf, 0xcc, 0x85, 0x9d, 0xee, 0x69, 0x07, 0x4a, 0x2f, 0xe3, 0xd2, 0xfd, 0x7b, 0x65, 0x17, 0x72, 0x2e, 0xe1, 0xbf, 0xa2, 0xa3, 0x13, 0xf7, 0x00, 0x3a, 0x64, 0x52, 0xb7, 0x7d, 0xc4, 0xcb, 0x26, 0x63, 0xb6, 0x0e, 0x60, 0x29, 0xad, 0xf5, 0x83, 0xb5, 0xea, 0x7a, 0x35, 0x21, 0x68, 0xbe, 0x07, 0x82, 0xa7, 0xbb, 0x67, 0xfb, 0xaf, 0x9c, 0xec, 0xf6, 0xda, 0x47, 0x4f, 0x57, 0x37, 0x4a, 0x5b, 0x77, 0xc7, 0x35, 0x4e, 0x8f, 0x4f, 0x56, 0xc7, 0x8f, 0xf0, 0xc2, 0x76, 0x67, 0x3d, 0xa6, 0xe7, 0x6f, 0x9b, 0xef, 0xad, 0x6d, 0x7e, 0x5c, 0xba, 0x96, 0xb1, 0x29, 0x43, 0x6b, 0x36, 0x0a, 0xcc, 0x01, 0x56, 0xfc, 0x0d, 0x49, 0xff, 0x92, 0x49, 0x5a, 0x07, 0x37, 0x12, 0xc6, 0x8b, 0x57, 0x62, 0x2c, 0x41, 0x6f, 0x1f, 0xaf, 0xc3, 0x7e, 0x8c, 0x45, 0xf1, 0xe8, 0xf1, 0xca, 0xd8, 0x6f, 0xc8, 0xa6, 0xe6, 0x77, 0xda, 0xe9, 0xb4, 0x57, 0xfb, 0xeb, 0x97, 0x37, 0x3c, 0xf5, 0x37, 0xb7, 0xfb, 0xeb, 0xab, 0x17, 0xf7, 0x36, 0xee, 0xae, 0x55, 0xdd, 0xcb, 0xcd, 0xed, 0xcb, 0xf5, 0xd5, 0x7d, 0xfe, 0xc2, 0x5a, 0xb2, 0x25, 0xf0, 0x99, 0x97, 0x18, 0xdb, 0xde, 0xdd, 0xe9, 0xa2, 0xc9, 0x62, 0xca, 0x1f, 0x97, 0xfa, 0x9b, 0xdf, 0x29, 0x7d, 0x1d, 0xa4, 0x6e, 0xe9, 0x72, 0xf3, 0x3b, 0xc4, 0x6f, 0xc4, 0x8d, 0xc7, 0x62, 0xf8, 0x61, 0x9c, 0x8f, 0xfb, 0xe2, 0x8f, 0x9b, 0xa5, 0xcd, 0xc9, 0x73, 0xbf, 0x54, 0xbe, 0x7e, 0xdc, 0x2c, 0x6d, 0x8c, 0x1b, 0x9c, 0x74, 0x5a, 0x67, 0xb0, 0xa2, 0x6a, 0xe9, 0x12, 0x70, 0xb1, 0x56, 0xbd, 0xb7, 0x51, 0x29, 0xed, 0xc7, 0xd9, 0x77, 0xe9, 0x1a, 0x53, 0xcd, 0xbb, 0x69, 0xbe, 0x39, 0x53, 0x4a, 0x7d, 0xd4, 0x3b, 0x7b, 0x6f, 0xbf, 0xd3, 0x81, 0xce, 0x4a, 0xee, 0xe5, 0xb5, 0x42, 0x96, 0xdc, 0xdd, 0xee, 0xd9, 0x64, 0xea, 0xab, 0x13, 0x2d, 0x5d, 0xdb, 0x5a, 0x87, 0xe2, 0xb5, 0x8d, 0xcd, 0x6a, 0xbc, 0x31, 0x9c, 0x0c, 0xaf, 0xb4, 0x55, 0xaa, 0x7e, 0xa3, 0xdf, 0x27, 0x9d, 0xfe, 0xd9, 0xea, 0x19, 0xfc, 0xe2, 0x35, 0x27, 0xbd, 0x8e, 0x3b, 0xfd, 0x93, 0x4d, 0x05, 0x26, 0x7d, 0xd3, 0xb9, 0x57, 0x7a, 0xad, 0x54, 0x2d, 0x45, 0xbb, 0xa0, 0xe7, 0x30, 0xa1, 0xf1, 0x10, 0x7f, 0x78, 0xfd, 0xcc, 0x8d, 0xc4, 0xdd, 0x9d, 0x72, 0x03, 0xd8, 0x68, 0x1e, 0x1f, 0xbb, 0x0f, 0xdf, 0x76, 0x8f, 0x77, 0xf7, 0x3a, 0xee, 0xee, 0x49, 0xe7, 0x3e, 0xab, 0xf1, 0x46, 0xc9, 0xdd, 0x80, 0x66, 0x1b, 0x65, 0xc0, 0x6b, 0xe9, 0x74, 0x3c, 0x69, 0x36, 0xea, 0xf6, 0xf2, 0x93, 0xfd, 0x8e, 0xfb, 0xcb, 0x67, 0x07, 0xad, 0x43, 0xb7, 0x79, 0x72, 0x74, 0xd1, 0xfb, 0xa8, 0x17, 0x1d, 0xf5, 0xdd, 0x4f, 0x9e, 0x3d, 0x3d, 0x3e, 0x75, 0x8f, 0xce, 0x3b, 0x27, 0x1f, 0xf5, 0xc0, 0x14, 0xdd, 0xee, 0xee, 0xa7, 0x97, 0x60, 0x51, 0x7b, 0x3f, 0x5b, 0x1e, 0xb7, 0x3d, 0xed, 0x74, 0xb7, 0xbd, 0x9b, 0x3d, 0x7a, 0xf2, 0x17, 0x8f, 0x56, 0xd9, 0x54, 0x5b, 0xdd, 0xd3, 0xd5, 0x8d, 0xd7, 0xbe, 0x39, 0x69, 0x0f, 0x26, 0xed, 0xdd, 0x9d, 0x58, 0x2a, 0xd8, 0x78, 0xf3, 0xac, 0x77, 0xbc, 0xea, 0xdd, 0x8d, 0xed, 0x9c, 0x75, 0x06, 0xc4, 0x74, 0x41, 0x69, 0x7f, 0x5e, 0x1d, 0x2b, 0xfe, 0xa4, 0xce, 0xc6, 0xad, 0x3a, 0xeb, 0xd7, 0x75, 0xa0, 0x12, 0xac, 0x8c, 0x2f, 0xf7, 0xec, 0xe8, 0x0c, 0xe6, 0x74, 0x00, 0xae, 0xb5, 0x0f, 0xae, 0x35, 0x3d, 0x37, 0x07, 0x82, 0xe6, 0xb4, 0xb7, 0xde, 0x76, 0x99, 0xd1, 0x8f, 0xdd, 0xde, 0x06, 0xb8, 0x1c, 0x06, 0xb6, 0x29, 0x5b, 0x25, 0xb7, 0xca, 0xde, 0xb6, 0x60, 0x76, 0x73, 0x73, 0x71, 0xcb, 0xad, 0x3f, 0xb2, 0xcb, 0x4d, 0x77, 0xb5, 0xdd, 0x89, 0x76, 0x9f, 0xc5, 0x2c, 0x4d, 0xa9, 0x5f, 0x19, 0x3a, 0x67, 0x80, 0xe9, 0xbe, 0xfa, 0xea, 0x26, 0xcf, 0xc1, 0xd5, 0x5d, 0xf7, 0xcf, 0xa7, 0x1c, 0x6f, 0xe3, 0xa4, 0x7f, 0x77, 0x95, 0xe9, 0xc1, 0xdd, 0x58, 0xce, 0x1e, 0x41, 0x02, 0x9b, 0x0f, 0x94, 0x02, 0x93, 0xcc, 0x7d, 0x84, 0x6f, 0x5f, 0xb3, 0xfc, 0xed, 0xcb, 0x5b, 0xdf, 0x5a, 0x67, 0x8c, 0xb3, 0x89, 0xdc, 0xe8, 0x2b, 0x2c, 0x0c, 0xa6, 0x51, 0x01, 0x30, 0xf9, 0x78, 0x3a, 0x7c, 0x36, 0xdb, 0xdb, 0x1b, 0x5c, 0x7f, 0xdc, 0xf4, 0xff, 0x02, 0x9e, 0xdc, 0xa1, 0x61, \ No newline at end of file diff --git a/demos/bpp.lua b/demos/bpp.lua index b3432f890..f16f07317 100644 --- a/demos/bpp.lua +++ b/demos/bpp.lua @@ -13,8 +13,8 @@ offset = omap = {0,1,3,2} function rFrame(x,y,w,h,segment,style) - local keep = peek4(2*0x03FFC) - poke4(2*0x03FFC, segment) + local keep = peek4(2*0x03FF8+1) + poke4(2*0x03FF8+1, segment) function bdr(xy,rot) local hrz=(rot%2)==0, iend, c if hrz then c=x iend=w-3 @@ -46,7 +46,7 @@ function rFrame(x,y,w,h,segment,style) bdr(x2,1) rect(x+8,y+8,w*8-16,h*8-16,1) - poke4(2*0x03FFC, keep) + poke4(2*0x03FF8+1, keep) end function rFontSheet(x, y, segment, alt) @@ -54,10 +54,10 @@ function rFontSheet(x, y, segment, alt) end function rText(text,x,y,segment,alt) - local keep = peek4(2*0x03FFC) - poke4(2*0x03FFC, segment) + local keep = peek4(2*0x03FF8+1) + poke4(2*0x03FF8+1, segment) font(text,x,y,0,5,8,false,1,alt) - poke4(2*0x03FFC, keep) + poke4(2*0x03FF8+1, keep) end -- segments for 1bpp BG page are: diff --git a/src/core/core.c b/src/core/core.c index 07cf357f9..b5dca7fd8 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -224,7 +224,7 @@ static void resetPalette(tic_mem* memory) static void resetBlitSegment(tic_mem* memory) { - memory->ram.vram.blit.segment = TIC_DEFAULT_BLIT_MODE; + memory->ram.vram.vars.blit = TIC_DEFAULT_BLIT_MODE; } static bool compareMetatag(const char* code, const char* tag, const char* value, const char* comment) @@ -296,10 +296,11 @@ static void soundClear(tic_mem* memory) void tic_api_reset(tic_mem* memory) { + memset(&memory->ram.vram.vars, 0, sizeof memory->ram.vram.vars); + resetPalette(memory); resetBlitSegment(memory); - memset(&memory->ram.vram.vars, 0, sizeof memory->ram.vram.vars); memory->ram.input.mouse.relative = 0; tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); diff --git a/src/core/core.h b/src/core/core.h index c2589db7f..b2ac249dd 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -88,14 +88,6 @@ typedef struct } tic_command_data; -typedef struct -{ - s32 l; - s32 t; - s32 r; - s32 b; -} tic_clip_data; - typedef struct { bool active; @@ -120,8 +112,6 @@ typedef struct u32 holds[tic_keys_count]; } keyboard; - tic_clip_data clip; - struct { tic_sound_register_data left[TIC_SOUND_CHANNELS]; diff --git a/src/core/draw.c b/src/core/draw.c index c64780113..23749f9e4 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -60,7 +60,9 @@ static inline u8 mapColor(tic_mem* tic, u8 color) static void setPixel(tic_core* core, s32 x, s32 y, u8 color) { - if (x < core->state.clip.l || y < core->state.clip.t || x >= core->state.clip.r || y >= core->state.clip.b) return; + const tic_vram* vram = &core->memory.ram.vram; + + if (x < vram->clip.l || y < vram->clip.t || x >= vram->clip.r || y >= vram->clip.b) return; tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } @@ -72,18 +74,20 @@ static u8 getPixel(tic_core* core, s32 x, s32 y) #define EARLY_CLIP(x, y, width, height) \ ( \ - (((y)+(height)-1) < core->state.clip.t) \ - || (((x)+(width)-1) < core->state.clip.l) \ - || ((y) >= core->state.clip.b) \ - || ((x) >= core->state.clip.r) \ + (((y)+(height)-1) < vram->clip.t) \ + || (((x)+(width)-1) < vram->clip.l) \ + || ((y) >= vram->clip.b) \ + || ((x) >= vram->clip.r) \ ) static void drawHLine(tic_core* core, s32 x, s32 y, s32 width, u8 color) { - if (y < core->state.clip.t || core->state.clip.b <= y) return; + const tic_vram* vram = &core->memory.ram.vram; + + if (y < vram->clip.t || vram->clip.b <= y) return; - s32 xl = MAX(x, core->state.clip.l); - s32 xr = MIN(x + width, core->state.clip.r); + s32 xl = MAX(x, vram->clip.l); + s32 xr = MIN(x + width, vram->clip.r); s32 start = y * TIC80_WIDTH; for(s32 i = start + xl, end = start + xr; i < end; ++i) @@ -92,7 +96,9 @@ static void drawHLine(tic_core* core, s32 x, s32 y, s32 width, u8 color) static void drawVLine(tic_core* core, s32 x, s32 y, s32 height, u8 color) { - if (x < core->state.clip.l || core->state.clip.r <= x) return; + const tic_vram* vram = &core->memory.ram.vram; + + if (x < vram->clip.l || vram->clip.r <= x) return; s32 yl = y < 0 ? 0 : y; s32 yr = y + height >= TIC80_HEIGHT ? TIC80_HEIGHT : y + height; @@ -132,6 +138,7 @@ static void drawRectBorder(tic_core* core, s32 x, s32 y, s32 width, s32 height, static void drawTile(tic_core* core, tic_tileptr* tile, s32 x, s32 y, u8* colors, s32 count, s32 scale, tic_flip flip, tic_rotate rotate) { + const tic_vram* vram = &core->memory.ram.vram; u8* mapping = getPalette(&core->memory, colors, count); rotate &= 0b11; @@ -145,10 +152,10 @@ static void drawTile(tic_core* core, tic_tileptr* tile, s32 x, s32 y, u8* colors if (scale == 1) { // the most common path s32 sx, sy, ex, ey; - sx = core->state.clip.l - x; if (sx < 0) sx = 0; - sy = core->state.clip.t - y; if (sy < 0) sy = 0; - ex = core->state.clip.r - x; if (ex > TIC_SPRITESIZE) ex = TIC_SPRITESIZE; - ey = core->state.clip.b - y; if (ey > TIC_SPRITESIZE) ey = TIC_SPRITESIZE; + sx = vram->clip.l - x; if (sx < 0) sx = 0; + sy = vram->clip.t - y; if (sy < 0) sy = 0; + ex = vram->clip.r - x; if (ex > TIC_SPRITESIZE) ex = TIC_SPRITESIZE; + ey = vram->clip.b - y; if (ey > TIC_SPRITESIZE) ey = TIC_SPRITESIZE; y += sy; x += sx; switch (orientation) { @@ -187,10 +194,12 @@ static void drawTile(tic_core* core, tic_tileptr* tile, s32 x, s32 y, u8* colors static void drawSprite(tic_core* core, s32 index, s32 x, s32 y, s32 w, s32 h, u8* colors, s32 count, s32 scale, tic_flip flip, tic_rotate rotate) { + const tic_vram* vram = &core->memory.ram.vram; + if (index < 0) return; - tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.blit.segment); + tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.vars.blit); if (w == 1 && h == 1) { tic_tileptr tile = tic_tilesheet_gettile(&sheet, index, false); drawTile(core, &tile, x, y, colors, count, scale, flip, rotate); @@ -247,7 +256,7 @@ static void drawMap(tic_core* core, const tic_map* src, s32 x, s32 y, s32 width, { const s32 size = TIC_SPRITESIZE * scale; - tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.blit.segment); + tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.vars.blit); for (s32 j = y, jj = sy; j < y + height; j++, jj += size) for (s32 i = x, ii = sx; i < x + width; i++, ii += size) @@ -273,6 +282,8 @@ static void drawMap(tic_core* core, const tic_map* src, s32 x, s32 y, s32 width, static s32 drawChar(tic_core* core, tic_tileptr* font_char, s32 x, s32 y, s32 scale, bool fixed, u8* mapping) { + const tic_vram* vram = &core->memory.ram.vram; + enum { Size = TIC_SPRITESIZE }; s32 j = 0, start = 0, end = Size; @@ -336,16 +347,17 @@ static s32 drawText(tic_core* core, tic_tilesheet* font_face, const char* text, void tic_api_clip(tic_mem* memory, s32 x, s32 y, s32 width, s32 height) { tic_core* core = (tic_core*)memory; + tic_vram* vram = &memory->ram.vram; - core->state.clip.l = x; - core->state.clip.t = y; - core->state.clip.r = x + width; - core->state.clip.b = y + height; + vram->clip.l = x; + vram->clip.t = y; + vram->clip.r = x + width; + vram->clip.b = y + height; - if (core->state.clip.l < 0) core->state.clip.l = 0; - if (core->state.clip.t < 0) core->state.clip.t = 0; - if (core->state.clip.r > TIC80_WIDTH) core->state.clip.r = TIC80_WIDTH; - if (core->state.clip.b > TIC80_HEIGHT) core->state.clip.b = TIC80_HEIGHT; + if (vram->clip.l < 0) vram->clip.l = 0; + if (vram->clip.t < 0) vram->clip.t = 0; + if (vram->clip.r > TIC80_WIDTH) vram->clip.r = TIC80_WIDTH; + if (vram->clip.b > TIC80_HEIGHT) vram->clip.b = TIC80_HEIGHT; } void tic_api_rect(tic_mem* memory, s32 x, s32 y, s32 width, s32 height, u8 color) @@ -357,15 +369,17 @@ void tic_api_rect(tic_mem* memory, s32 x, s32 y, s32 width, s32 height, u8 color void tic_api_cls(tic_mem* memory, u8 color) { - static const tic_clip_data EmptyClip = { 0, 0, TIC80_WIDTH, TIC80_HEIGHT }; + tic_vram* vram = &memory->ram.vram; + + static const u8 EmptyClip[] = { 0, 0, TIC80_WIDTH, TIC80_HEIGHT }; tic_core* core = (tic_core*)memory; - if (memcmp(&core->state.clip, &EmptyClip, sizeof(tic_clip_data)) == 0) + if (memcmp(&vram->clip, &EmptyClip, sizeof EmptyClip) == 0) tic_api_memset(memory, 0, (color & 0xf) | (color << TIC_PALETTE_BPP), sizeof(tic_screen)); else - tic_api_rect(memory, core->state.clip.l, core->state.clip.t, - core->state.clip.r - core->state.clip.l, core->state.clip.b - core->state.clip.t, color); + tic_api_rect(memory, vram->clip.l, vram->clip.t, + vram->clip.r - vram->clip.l, vram->clip.b - vram->clip.t, color); } s32 tic_api_font(tic_mem* memory, const char* text, s32 x, s32 y, u8 chromakey, s32 w, s32 h, bool fixed, s32 scale, bool alt) @@ -374,10 +388,10 @@ s32 tic_api_font(tic_mem* memory, const char* text, s32 x, s32 y, u8 chromakey, // Compatibility : flip top and bottom of the spritesheet // to preserve tic_api_font's default target - u8 segment = memory->ram.vram.blit.segment >> 1; + u8 segment = memory->ram.vram.vars.blit >> 1; u8 flipmask = 1; while (segment >>= 1) flipmask <<= 1; - tic_tilesheet font_face = getTileSheetFromSegment(memory, memory->ram.vram.blit.segment ^ flipmask); + tic_tilesheet font_face = getTileSheetFromSegment(memory, memory->ram.vram.vars.blit ^ flipmask); return drawText((tic_core*)memory, &font_face, text, x, y, w, h, fixed, mapping, scale, alt); } @@ -534,14 +548,16 @@ static void setElliSide(tic_mem* tic, s32 x, s32 y, u8 color) static void drawSidesBuffer(tic_mem* memory, s32 y0, s32 y1, u8 color) { + tic_vram* vram = &memory->ram.vram; + tic_core* core = (tic_core*)memory; - s32 yt = MAX(core->state.clip.t, y0); - s32 yb = MIN(core->state.clip.b, y1 + 1); + s32 yt = MAX(vram->clip.t, y0); + s32 yb = MIN(vram->clip.b, y1 + 1); u8 final_color = mapColor(&core->memory, color); for (s32 y = yt; y < yb; y++) { - s32 xl = MAX(SidesBuffer.Left[y], core->state.clip.l); - s32 xr = MIN(SidesBuffer.Right[y] + 1, core->state.clip.r); + s32 xl = MAX(SidesBuffer.Left[y], vram->clip.l); + s32 xr = MIN(SidesBuffer.Right[y] + 1, vram->clip.r); s32 start = y * TIC80_WIDTH; for(s32 i = start + xl, end = start + xr; i < end; ++i) @@ -689,11 +705,13 @@ static void ticTexLine(tic_mem* memory, TexVert* v0, TexVert* v1) static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, float y2, float x3, float y3, float u1, float v1, float u2, float v2, float u3, float v3, bool use_map, u8* colors, s32 count) { tic_mem* memory = &core->memory; + tic_vram* vram = &memory->ram.vram; + u8* mapping = getPalette(memory, colors, count); TexVert V0, V1, V2; const u8* map = memory->ram.map.data; - tic_tilesheet sheet = getTileSheetFromSegment(memory, memory->ram.vram.blit.segment); + tic_tilesheet sheet = getTileSheetFromSegment(memory, memory->ram.vram.vars.blit); V0.x = x1; V0.y = y1; V0.u = u1; V0.v = v1; V1.x = x2; V1.y = y2; V1.u = u2; V1.v = v2; @@ -726,7 +744,7 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f // if it's backwards skip it s32 width = SidesBuffer.Right[y] - SidesBuffer.Left[y]; // if it's off top or bottom , skip this line - if ((y < core->state.clip.t) || (y > core->state.clip.b)) + if ((y < vram->clip.t) || (y > vram->clip.b)) width = 0; if (width > 0) { @@ -735,15 +753,15 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f s32 left = SidesBuffer.Left[y]; s32 right = SidesBuffer.Right[y]; // check right edge, and CLAMP it - if (right > core->state.clip.r) - right = core->state.clip.r; + if (right > vram->clip.r) + right = vram->clip.r; // check left edge and offset UV's if we are off the left - if (left < core->state.clip.l) + if (left < vram->clip.l) { - s32 dist = core->state.clip.l - SidesBuffer.Left[y]; + s32 dist = vram->clip.l - SidesBuffer.Left[y]; u += dudxs * dist; v += dvdxs * dist; - left = core->state.clip.l; + left = vram->clip.l; } // are we drawing from the map . ok then at least check before the inner loop if (use_map == true) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index 8a905acff..c876fe376 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -420,12 +420,12 @@ static void initBlitMode(Map* map) { tic_mem* tic = map->tic; tiles2ram(&tic->ram, getBankTiles()); - tic_tool_poke4(&tic->ram.vram.blit, 0, tic_blit_calc_segment(&map->sheet.blit)); + tic->ram.vram.vars.blit = tic_blit_calc_segment(&map->sheet.blit); } static void resetBlitMode(tic_mem* tic) { - tic_tool_poke4(&tic->ram.vram.blit, 0, TIC_DEFAULT_BLIT_MODE); + tic->ram.vram.vars.blit = TIC_DEFAULT_BLIT_MODE; } static void drawSheetReg(Map* map, s32 x, s32 y) diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index 3e01c1e5a..c4067c16e 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -1290,9 +1290,9 @@ static void drawSheet(Sprite* sprite, s32 x, s32 y) { tic_mem* tic = sprite->tic; tiles2ram(&tic->ram, sprite->src); - tic_tool_poke4(&tic->ram.vram.blit, 0, tic_blit_calc_segment(&sprite->blit)); + tic->ram.vram.vars.blit = tic_blit_calc_segment(&sprite->blit); tic_api_spr(tic, 0, x, y, TIC_SPRITESHEET_COLS, TIC_SPRITESHEET_COLS, NULL, 0, 1, tic_no_flip, tic_no_rotate); - tic_tool_poke4(&tic->ram.vram.blit, 0, TIC_DEFAULT_BLIT_MODE); + tic->ram.vram.vars.blit = TIC_DEFAULT_BLIT_MODE; } static void flipSpriteHorz(Sprite* sprite) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index ae75674cb..ef06e1197 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2749,11 +2749,10 @@ static s32 createVRamTable(char* buf) {offsetof(tic_ram, vram.screen), "SCREEN"}, {offsetof(tic_ram, vram.palette), "PALETTE"}, {offsetof(tic_ram, vram.mapping), "PALETTE MAP"}, - {offsetof(tic_ram, vram.vars.colors), "BORDER COLOR"}, + {offsetof(tic_ram, vram.vars), "BORDER / BLIT SEG"}, {offsetof(tic_ram, vram.vars.offset), "SCREEN OFFSET"}, {offsetof(tic_ram, vram.vars.cursor), "MOUSE CURSOR"}, - {offsetof(tic_ram, vram.blit), "BLIT SEGMENT"}, - {offsetof(tic_ram, vram.reserved), "... (reserved) "}, + {offsetof(tic_ram, vram.clip), "CLIP"}, {TIC_VRAM_SIZE, ""}, }; diff --git a/src/tic.h b/src/tic.h index ef7f95e05..e4edaf731 100644 --- a/src/tic.h +++ b/src/tic.h @@ -464,16 +464,8 @@ typedef union struct { - union - { - u8 colors; - - struct - { - u8 border:TIC_PALETTE_BPP; - u8 tmp:TIC_PALETTE_BPP; - }; - }; + u8 border:TIC_PALETTE_BPP; + u8 blit:4; struct { @@ -491,11 +483,8 @@ typedef union struct { - u8 segment:4; - u8 reserved:4; - } blit; - - u8 reserved[3]; + u8 l, t, r, b; + } clip; }; u8 data[TIC_VRAM_SIZE]; From 44fc510911bf29b3d704c9accb553549789d1897 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 5 Nov 2021 07:12:39 -0400 Subject: [PATCH 076/379] fix goof --- src/api/squirrel.c | 2 +- src/api/wren.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 0a32d1379..5356a056e 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1447,7 +1447,7 @@ static void squirrel_open_builtins(HSQUIRRELVM vm) sq_poptop(vm); } -static void initLuaAPI(tic_core* core) +static void initAPI(tic_core* core) { HSQUIRRELVM vm = core->currentVM; diff --git a/src/api/wren.c b/src/api/wren.c index bfe1012c0..9ed1b596d 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -1395,7 +1395,7 @@ static WrenForeignMethodFn bindForeignMethod( return foreignTicMethods(fullName); } -static void initLuaAPI(tic_core* core) +static void initAPI(tic_core* core) { wrenSetUserData(core->currentVM, core); From e1afcfee23da64b0429e35e9bdf8ce6652a7a7fd Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 5 Nov 2021 14:56:09 +0300 Subject: [PATCH 077/379] build fix for #1670 --- src/api/squirrel.c | 2 +- src/api/wren.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 6f02e3112..85926f976 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1556,7 +1556,7 @@ static bool initSquirrel(tic_mem* tic, const char* code) sq_newclosure(vm, squirrel_errorHandler, 0); sq_seterrorhandler(vm); - initLuaAPI(core); + initAPI(core); { HSQUIRRELVM vm = core->currentVM; diff --git a/src/api/wren.c b/src/api/wren.c index e78831648..8082c857b 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -1489,7 +1489,7 @@ static bool initWren(tic_mem* tic, const char* code) WrenVM* vm = core->currentVM = wrenNewVM(&config); - initLuaAPI(core); + initAPI(core); if (wrenInterpret(core->currentVM, "main", code) != WREN_RESULT_SUCCESS) { From 474dc3cb774ef979bc96f1de811994072d482ae6 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 5 Nov 2021 15:08:11 +0300 Subject: [PATCH 078/379] build fix for #1670 --- src/api/lua_api.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/api/lua_api.h b/src/api/lua_api.h index d6cb0fb89..b4df9f33a 100644 --- a/src/api/lua_api.h +++ b/src/api/lua_api.h @@ -15,6 +15,7 @@ extern void callLuaOverline(tic_mem* tic, void* data); extern void closeLua(tic_mem* tic); extern void callLuaTick(tic_mem* tic); extern void lua_open_builtins(lua_State *lua); +extern void initLuaAPI(core); #define lua_api_h #endif \ No newline at end of file From b1e4f03b30c51ff5e8f118672817683aef699c41 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 5 Nov 2021 08:04:56 -0400 Subject: [PATCH 079/379] fix up --- src/api/lua_api.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/api/lua_api.h b/src/api/lua_api.h index b4df9f33a..df9f2a081 100644 --- a/src/api/lua_api.h +++ b/src/api/lua_api.h @@ -7,6 +7,9 @@ #include #include +s32 luaopen_lpeg(lua_State *lua); + +extern void initLuaAPI(tic_core* core); extern void callLuaTick(tic_mem* tic); extern void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name); extern void callLuaScanline(tic_mem* tic, s32 row, void* data); From d8d232178f5387e59b890b165a35be6e97b7c2c1 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 5 Nov 2021 08:48:52 -0400 Subject: [PATCH 080/379] pull fennel out into sep file --- CMakeLists.txt | 1 + src/api/fennel.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++ src/api/lua.c | 185 ------------------------------------------- src/api/lua_api.h | 1 - 4 files changed, 195 insertions(+), 186 deletions(-) create mode 100644 src/api/fennel.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b1795b156..bb5d07508 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,6 +303,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${TIC80CORE_DIR}/api/js.c ${TIC80CORE_DIR}/api/lua.c ${TIC80CORE_DIR}/api/moonscript.c + ${TIC80CORE_DIR}/api/fennel.c ${TIC80CORE_DIR}/api/wren.c ${TIC80CORE_DIR}/api/squirrel.c ${TIC80CORE_DIR}/tic.c diff --git a/src/api/fennel.c b/src/api/fennel.c new file mode 100644 index 000000000..6c7a9795f --- /dev/null +++ b/src/api/fennel.c @@ -0,0 +1,194 @@ +#include "core/core.h" + +// Fennel requires Lua +#if defined(TIC_BUILD_WITH_LUA) + +#include "lua_api.h" + +#if defined(TIC_BUILD_WITH_FENNEL) + +#include "fennel.h" + +#define FENNEL_CODE(...) #__VA_ARGS__ + +static const char* execute_fennel_src = FENNEL_CODE( + local fennel = require("fennel") + debug.traceback = fennel.traceback + local opts = {filename="game", allowedGlobals = false} + local src = ... + if(src:find("\n;; strict: true")) then opts.allowedGlobals = nil end + local ok, msg = pcall(fennel.eval, src, opts) + if(not ok) then return msg end +); + +static bool initFennel(tic_mem* tic, const char* code) +{ + tic_core* core = (tic_core*)tic; + closeLua(tic); + + lua_State* lua = core->currentVM = luaL_newstate(); + lua_open_builtins(lua); + + initLuaAPI(core); + + { + lua_State* fennel = core->currentVM; + + lua_settop(fennel, 0); + + if (luaL_loadbuffer(fennel, (const char *)loadfennel_lua, + loadfennel_lua_len, "fennel.lua") != LUA_OK) + { + core->data->error(core->data->data, "failed to load fennel compiler"); + return false; + } + + lua_call(fennel, 0, 0); + + if (luaL_loadbuffer(fennel, execute_fennel_src, strlen(execute_fennel_src), "execute_fennel") != LUA_OK) + { + core->data->error(core->data->data, "failed to load fennel compiler"); + return false; + } + + lua_pushstring(fennel, code); + lua_call(fennel, 1, 1); + const char* err = lua_tostring(fennel, -1); + + if (err) + { + core->data->error(core->data->data, err); + return false; + } + } + + return true; +} + +static const char* const FennelKeywords [] = +{ + "lua", "hashfn","macro", "macros", "macroexpand", "macrodebug", + "do", "values", "if", "when", "each", "for", "fn", "lambda", "partial", + "while", "set", "global", "var", "local", "let", "tset", "doto", "match", + "or", "and", "true", "false", "nil", "not", "not=", "length", "set-forcibly!", + "rshift", "lshift", "bor", "band", "bnot", "bxor", "pick-values", "pick-args", + ".", "..", "#", "...", ":", "->", "->>", "-?>", "-?>>", "$", "with-open" +}; + +static const tic_outline_item* getFennelOutline(const char* code, s32* size) +{ + enum{Size = sizeof(tic_outline_item)}; + + *size = 0; + + static tic_outline_item* items = NULL; + + if(items) + { + free(items); + items = NULL; + } + + const char* ptr = code; + + while(true) + { + static const char FuncString[] = "(fn "; + + ptr = strstr(ptr, FuncString); + + if(ptr) + { + ptr += sizeof FuncString - 1; + + const char* start = ptr; + const char* end = start; + + while(*ptr) + { + char c = *ptr; + + if(c == ' ' || c == '\t' || c == '\n' || c == '[') + { + end = ptr; + break; + } + + ptr++; + } + + if(end > start) + { + items = realloc(items, (*size + 1) * Size); + + items[*size].pos = start; + items[*size].size = (s32)(end - start); + + (*size)++; + } + } + else break; + } + + return items; +} + +static void evalFennel(tic_mem* tic, const char* code) { + tic_core* core = (tic_core*)tic; + lua_State* fennel = core->currentVM; + + lua_settop(fennel, 0); + + if (luaL_loadbuffer(fennel, execute_fennel_src, strlen(execute_fennel_src), "execute_fennel") != LUA_OK) + { + core->data->error(core->data->data, "failed to load fennel compiler"); + } + + lua_pushstring(fennel, code); + lua_call(fennel, 1, 1); + const char* err = lua_tostring(fennel, -1); + + if (err) + { + core->data->error(core->data->data, err); + } +} + +tic_script_config FennelSyntaxConfig = +{ + .name = "fennel", + .fileExtension = ".fnl", + .projectComment = ";;", + .init = initFennel, + .close = closeLua, + .tick = callLuaTick, + .callback = + { + .scanline = callLuaScanline, + .border = callLuaBorder, + .overline = callLuaOverline, + }, + + .getOutline = getFennelOutline, + .eval = evalFennel, + + .blockCommentStart = NULL, + .blockCommentEnd = NULL, + .blockCommentStart2 = NULL, + .blockCommentEnd2 = NULL, + .blockStringStart = NULL, + .blockStringEnd = NULL, + .singleComment = ";", + + .keywords = FennelKeywords, + .keywordsCount = COUNT_OF(FennelKeywords), +}; + +const tic_script_config* get_fennel_script_config() +{ + return &FennelSyntaxConfig; +} + +#endif /* defined(TIC_BUILD_WITH_FENNEL) */ + +#endif \ No newline at end of file diff --git a/src/api/lua.c b/src/api/lua.c index c033b05b6..6863ab4fc 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1694,190 +1694,5 @@ const tic_script_config* get_lua_script_config() } -#if defined(TIC_BUILD_WITH_FENNEL) - -#include "fennel.h" - -#define FENNEL_CODE(...) #__VA_ARGS__ - -static const char* execute_fennel_src = FENNEL_CODE( - local fennel = require("fennel") - debug.traceback = fennel.traceback - local opts = {filename="game", allowedGlobals = false} - local src = ... - if(src:find("\n;; strict: true")) then opts.allowedGlobals = nil end - local ok, msg = pcall(fennel.eval, src, opts) - if(not ok) then return msg end -); - -static bool initFennel(tic_mem* tic, const char* code) -{ - tic_core* core = (tic_core*)tic; - closeLua(tic); - - lua_State* lua = core->currentVM = luaL_newstate(); - lua_open_builtins(lua); - - initLuaAPI(core); - - { - lua_State* fennel = core->currentVM; - - lua_settop(fennel, 0); - - if (luaL_loadbuffer(fennel, (const char *)loadfennel_lua, - loadfennel_lua_len, "fennel.lua") != LUA_OK) - { - core->data->error(core->data->data, "failed to load fennel compiler"); - return false; - } - - lua_call(fennel, 0, 0); - - if (luaL_loadbuffer(fennel, execute_fennel_src, strlen(execute_fennel_src), "execute_fennel") != LUA_OK) - { - core->data->error(core->data->data, "failed to load fennel compiler"); - return false; - } - - lua_pushstring(fennel, code); - lua_call(fennel, 1, 1); - const char* err = lua_tostring(fennel, -1); - - if (err) - { - core->data->error(core->data->data, err); - return false; - } - } - - return true; -} - -static const char* const FennelKeywords [] = -{ - "lua", "hashfn","macro", "macros", "macroexpand", "macrodebug", - "do", "values", "if", "when", "each", "for", "fn", "lambda", "partial", - "while", "set", "global", "var", "local", "let", "tset", "doto", "match", - "or", "and", "true", "false", "nil", "not", "not=", "length", "set-forcibly!", - "rshift", "lshift", "bor", "band", "bnot", "bxor", "pick-values", "pick-args", - ".", "..", "#", "...", ":", "->", "->>", "-?>", "-?>>", "$", "with-open" -}; - -static const tic_outline_item* getFennelOutline(const char* code, s32* size) -{ - enum{Size = sizeof(tic_outline_item)}; - - *size = 0; - - static tic_outline_item* items = NULL; - - if(items) - { - free(items); - items = NULL; - } - - const char* ptr = code; - - while(true) - { - static const char FuncString[] = "(fn "; - - ptr = strstr(ptr, FuncString); - - if(ptr) - { - ptr += sizeof FuncString - 1; - - const char* start = ptr; - const char* end = start; - - while(*ptr) - { - char c = *ptr; - - if(c == ' ' || c == '\t' || c == '\n' || c == '[') - { - end = ptr; - break; - } - - ptr++; - } - - if(end > start) - { - items = realloc(items, (*size + 1) * Size); - - items[*size].pos = start; - items[*size].size = (s32)(end - start); - - (*size)++; - } - } - else break; - } - - return items; -} - -static void evalFennel(tic_mem* tic, const char* code) { - tic_core* core = (tic_core*)tic; - lua_State* fennel = core->currentVM; - - lua_settop(fennel, 0); - - if (luaL_loadbuffer(fennel, execute_fennel_src, strlen(execute_fennel_src), "execute_fennel") != LUA_OK) - { - core->data->error(core->data->data, "failed to load fennel compiler"); - } - - lua_pushstring(fennel, code); - lua_call(fennel, 1, 1); - const char* err = lua_tostring(fennel, -1); - - if (err) - { - core->data->error(core->data->data, err); - } -} - -tic_script_config FennelSyntaxConfig = -{ - .name = "fennel", - .fileExtension = ".fnl", - .projectComment = ";;", - .init = initFennel, - .close = closeLua, - .tick = callLuaTick, - .callback = - { - .scanline = callLuaScanline, - .border = callLuaBorder, - .overline = callLuaOverline, - }, - - .getOutline = getFennelOutline, - .eval = evalFennel, - - .blockCommentStart = NULL, - .blockCommentEnd = NULL, - .blockCommentStart2 = NULL, - .blockCommentEnd2 = NULL, - .blockStringStart = NULL, - .blockStringEnd = NULL, - .singleComment = ";", - - .keywords = FennelKeywords, - .keywordsCount = COUNT_OF(FennelKeywords), -}; - -const tic_script_config* get_fennel_script_config() -{ - return &FennelSyntaxConfig; -} - -#endif /* defined(TIC_BUILD_WITH_FENNEL) */ #endif /* defined(TIC_BUILD_WITH_LUA) */ diff --git a/src/api/lua_api.h b/src/api/lua_api.h index df9f2a081..9f34c07ce 100644 --- a/src/api/lua_api.h +++ b/src/api/lua_api.h @@ -18,7 +18,6 @@ extern void callLuaOverline(tic_mem* tic, void* data); extern void closeLua(tic_mem* tic); extern void callLuaTick(tic_mem* tic); extern void lua_open_builtins(lua_State *lua); -extern void initLuaAPI(core); #define lua_api_h #endif \ No newline at end of file From 5a6be87276c38bca4f83bbf5355fa3182628fc4c Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 5 Nov 2021 18:18:18 -0400 Subject: [PATCH 081/379] skip sharp column --- src/studio/editors/music.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/studio/editors/music.c b/src/studio/editors/music.c index de535ad87..624361868 100644 --- a/src/studio/editors/music.c +++ b/src/studio/editors/music.c @@ -280,6 +280,10 @@ static void leftCol(Music* music) { if (music->tracker.edit.x > 0) { + // skip sharp column + if(music->tracker.edit.x == 2) { + music->tracker.edit.x--; + } music->tracker.edit.x--; updateTracker(music); } @@ -289,6 +293,10 @@ static void rightCol(Music* music) { if (music->tracker.edit.x < TRACKER_COLS - 1) { + // skip sharp column + if(music->tracker.edit.x == 0) { + music->tracker.edit.x++; + } music->tracker.edit.x++; updateTracker(music); } From a690ca96ef995935204f041f02d6786e7ed5f639 Mon Sep 17 00:00:00 2001 From: Lukas Zapletal Date: Sun, 7 Nov 2021 13:26:08 +0100 Subject: [PATCH 082/379] add Fedora building instructions --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 92192ff50..dde47d107 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,18 @@ git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 ``` + +### Fedora + +run the following commands in the Terminal +``` +sudo dnf -y groupinstall "Development Tools" +sudo dnf -y install git cmake libglvnd-devel libglvnd-gles freeglut-devel +git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build +cmake .. +make -j4 +``` + Install with [Install instructions](#install-instructions) ### Raspberry Pi (Retropie) From b639b794735423efd6c58a7018b0841c1022b20a Mon Sep 17 00:00:00 2001 From: Lukas Zapletal Date: Sun, 7 Nov 2021 13:26:52 +0100 Subject: [PATCH 083/379] remove trailing whitespace from README --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index dde47d107..d0557f029 100644 --- a/README.md +++ b/README.md @@ -123,13 +123,13 @@ Install with [Install instructions](#install-instructions) First, add jessie-backports repo to your `/etc/apt/sources.list` -`deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main` +`deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main` Then run the following commands in the Terminal ``` # required public keys -gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553 +gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553 gpg -a --export 8B48AD6246925553 | sudo apt-key add - gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010 gpg -a --export 7638D0442B90D010 | sudo apt-key add - @@ -165,36 +165,36 @@ make -j4 # Install instructions -## Linux +## Linux To install run `sudo make install -j4` TIC-80 can now be run with `tic80` ## iOS / tvOS -You can find iOS/tvOS version here +You can find iOS/tvOS version here - 0.60.3: https://github.com/brunophilipe/TIC-80 - 0.45.0: https://github.com/CliffsDover/TIC-80 ## Credits -* Filippo Rivato - [Twitter @HomineLudens](https://twitter.com/HomineLudens) -* Fred Bednarski - [Twitter @FredBednarski](https://twitter.com/FredBednarski) -* Al Rado - [Twitter @alrado2](https://twitter.com/alrado2) -* Trevor Martin - [Twitter @trelemar](https://twitter.com/trelemar) -* MonstersGoBoom - [Twitter @MonstersGoBoom](https://twitter.com/MonstersGo) -* Matheus Lessa - [Twitter @matheuslrod](https://twitter.com/matheuslrod) -* CliffsDover - [Twitter @DancingBottle](https://twitter.com/DancingBottle) -* Frantisek Jahoda - [GitHub @jahodfra](https://github.com/jahodfra) -* Guilherme Medeiros - [GitHub @frenetic](https://github.com/frenetic) -* Andrei Rudenko - [GitHub @RudenkoArts](https://github.com/RudenkoArts) -* Phil Hagelberg - [@technomancy](https://technomancy.us/colophon) +* Filippo Rivato - [Twitter @HomineLudens](https://twitter.com/HomineLudens) +* Fred Bednarski - [Twitter @FredBednarski](https://twitter.com/FredBednarski) +* Al Rado - [Twitter @alrado2](https://twitter.com/alrado2) +* Trevor Martin - [Twitter @trelemar](https://twitter.com/trelemar) +* MonstersGoBoom - [Twitter @MonstersGoBoom](https://twitter.com/MonstersGo) +* Matheus Lessa - [Twitter @matheuslrod](https://twitter.com/matheuslrod) +* CliffsDover - [Twitter @DancingBottle](https://twitter.com/DancingBottle) +* Frantisek Jahoda - [GitHub @jahodfra](https://github.com/jahodfra) +* Guilherme Medeiros - [GitHub @frenetic](https://github.com/frenetic) +* Andrei Rudenko - [GitHub @RudenkoArts](https://github.com/RudenkoArts) +* Phil Hagelberg - [@technomancy](https://technomancy.us/colophon) * Rob Loach - [Twitter @RobLoach](https://twitter.com/RobLoach) [GitHub @RobLoach](https://github.com/RobLoach) * Wade Brainerd - [GitHub @wadetb](https://github.com/wadetb) * Paul Robinson - [GitHub @paul59](https://github.com/paul59) * Stefan Devai - [GitHub @stefandevai](https://github.com/stefandevai) [Blog stefandevai.me](https://stefandevai.me) * Damien de Lemeny - [GitHub @ddelemeny](https://github.com/ddelemeny) * Adrian Siekierka - [GitHub @asiekierka](https://github.com/asiekierka) [Website](https://asie.pl/) -* Jay Em (Sweetie16 palette) - [Twitter @GrafxKid](https://twitter.com/GrafxKid) +* Jay Em (Sweetie16 palette) - [Twitter @GrafxKid](https://twitter.com/GrafxKid) * msx80 - [Twitter @msx80](https://twitter.com/msx80) [Github msx80](https://github.com/msx80) * Josh Goebel - [Twitter @dreamer3](https://twitter.com/dreamer3) [Github joshgoebel](https://github.com/joshgoebel) * Joshua Minor - [GitHub @jminor](https://github.com/jminor) From 4280174b6625cde48d67b32439a663b4a6fa9d9e Mon Sep 17 00:00:00 2001 From: Lukas Zapletal Date: Sun, 7 Nov 2021 15:48:19 +0100 Subject: [PATCH 084/379] add MacOS application instructions --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index d0557f029..434db8e93 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,20 @@ cmake .. make -j4 ``` +to create application icon for development version +``` +mkdir -p ~/Applications/TIC80dev.app/Contents/{MacOS,Resources} +cp -f macosx/tic80.plist ~/Applications/TIC80dev.app/Contents/Info.plist +cp -f macosx/tic80.icns ~/Applications/TIC80dev.app/Contents/Resources +cat > ~/Applications/TIC80dev.app/MacOS/TIC80dev </dev/null +EOF +chmod +x ~/Applications/TIC80dev.app/MacOS/TIC80 +``` +Make sure to update the absolute path to the tic80 binary in the script, or +update the launch arguments. + # Install instructions ## Linux From eb918c2d775cba4d696fb746028f3db0feedab8d Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 9 Nov 2021 09:06:15 -0500 Subject: [PATCH 085/379] suggest pro when trying to open source with standard --- CMakeLists.txt | 4 ++-- src/studio/screens/console.c | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb5d07508..551f7c110 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -748,9 +748,9 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/ext/png.c ) -if(${BUILD_PRO}) +#if(${BUILD_PRO}) set(TIC80STUDIO_SRC ${TIC80STUDIO_SRC} ${TIC80LIB_DIR}/studio/project.c) -endif() +#endif() set(TIC80_OUTPUT tic80) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index ef06e1197..b5ca4cd29 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -59,6 +59,7 @@ #define CONSOLE_BACK_TEXT_COLOR tic_color_grey #define CONSOLE_FRONT_TEXT_COLOR tic_color_light_grey #define CONSOLE_ERROR_TEXT_COLOR tic_color_red +#define CONSOLE_LINK_TEXT_COLOR tic_color_blue #define CONSOLE_CURSOR_BLINK_PERIOD TIC80_FRAMERATE #define CONSOLE_CURSOR_DELAY (TIC80_FRAMERATE / 2) #define CONSOLE_BUFFER_WIDTH (STUDIO_TEXT_BUFFER_WIDTH) @@ -418,6 +419,11 @@ static void printFront(Console* console, const char* text) consolePrint(console, text, CONSOLE_FRONT_TEXT_COLOR); } +static void printLink(Console* console, const char* text) +{ + consolePrint(console, text, CONSOLE_LINK_TEXT_COLOR); +} + static void printError(Console* console, const char* text) { consolePrint(console, text, CONSOLE_ERROR_TEXT_COLOR); @@ -926,7 +932,20 @@ static void onLoadCommandConfirmed(Console* console) } else printError(console, "\nfile not found"); #else - printError(console, "\ncart loading error"); + if(tic_project_ext(name)) { + printError(console, "\nproject loading error"); + printFront(console, "\nThis version only supports binary cartridges (GIF, PNG, or TIC)."); + printLine(console); + printFront(console, "\nTIC-80 "); + consolePrint(console,"PRO",tic_color_light_blue); + printFront(console, " is needed for projects."); + printLine(console); + printFront(console, "\nLearn more:\n"); + printLink(console, "https://tic80.com/pro"); + } else { + printError(console, "\ncart loading error"); + } + #endif } } From 366aaac163cdb9f0a92546acd390d45860c35b49 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 9 Nov 2021 09:39:50 -0500 Subject: [PATCH 086/379] we always need project now --- CMakeLists.txt | 5 +---- src/studio/screens/console.c | 3 --- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 551f7c110..9e04f0cb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -738,6 +738,7 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/studio/editors/sfx.c ${TIC80LIB_DIR}/studio/editors/music.c ${TIC80LIB_DIR}/studio/studio.c + ${TIC80LIB_DIR}/studio/project.c ${TIC80LIB_DIR}/studio/config.c ${TIC80LIB_DIR}/studio/demos.c ${TIC80LIB_DIR}/studio/fs.c @@ -748,10 +749,6 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/ext/png.c ) -#if(${BUILD_PRO}) - set(TIC80STUDIO_SRC ${TIC80STUDIO_SRC} ${TIC80LIB_DIR}/studio/project.c) -#endif() - set(TIC80_OUTPUT tic80) add_library(tic80studio STATIC diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index b5ca4cd29..ab496141a 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -29,11 +29,8 @@ #include "zip.h" #include "studio/demos.h" -#if defined(TIC80_PRO) #include "studio/project.h" -#else #include "cart.h" -#endif #include #include From ccc6c1ecc178d7952bdfcebf57ef881dd0903594 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 9 Nov 2021 19:33:34 +0300 Subject: [PATCH 087/379] added some pro builds to the CI --- .github/workflows/build.yml | 61 +++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3899bda31..d32b8b637 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,6 +36,29 @@ jobs: name: 'tic80-winxp-stub' path: build/bin/tic80*.exe +# === Windows XP PRO === + winxp-pro: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Build + shell: cmd + run: | + cd build + cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_PRO=On .. + cmake --build . --config %BUILD_TYPE% --parallel + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: 'tic80-winxp-pro' + path: build/bin/tic80.exe + # === Windows === windows: runs-on: windows-latest @@ -82,6 +105,12 @@ jobs: cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_PRO=On .. cmake --build . --config %BUILD_TYPE% --parallel + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: 'tic80-windows-pro' + path: build/bin/tic80.exe + # === Windows Sokol === windows-sokol: runs-on: windows-latest @@ -128,6 +157,18 @@ jobs: cmake --build . --config $BUILD_TYPE --parallel cpack + - name: Deploy DEB + uses: actions/upload-artifact@v2 + with: + name: 'tic80-linux-deb-pro' + path: build/tic80.deb + + - name: Deploy ZIP + uses: actions/upload-artifact@v2 + with: + name: 'tic80-linux-pro' + path: build/bin/tic80 + # === Ubuntu === linux: runs-on: ubuntu-latest @@ -390,6 +431,18 @@ jobs: cpack cp *.dmg tic80.dmg + - name: Deploy DMG + uses: actions/upload-artifact@v2 + with: + name: 'tic80-macos-dmg-pro' + path: build/tic80.dmg + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: 'tic80-macos-pro' + path: build/bin/tic80 + # === Android === android: runs-on: ubuntu-latest @@ -606,11 +659,15 @@ jobs: uses: geekyeggo/delete-artifact@v1 with: name: | - tic80-rpi - tic80-macos tic80-winxp-stub tic80-windows-stub tic80-linux-stub tic80-rpi-stub tic80-macos-stub tic80-wasm-stub +# tic80-macos-pro +# tic80-macos-dmg-pro +# tic80-winxp-pro +# tic80-windows-pro +# tic80-linux-deb-pro +# tic80-linux-pro From 7cd7dd19f9225e1bd66309a99c956c8dc93975ad Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 9 Nov 2021 19:36:00 +0300 Subject: [PATCH 088/379] build fix --- .github/workflows/build.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d32b8b637..6da14ce4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -665,9 +665,9 @@ jobs: tic80-rpi-stub tic80-macos-stub tic80-wasm-stub -# tic80-macos-pro -# tic80-macos-dmg-pro -# tic80-winxp-pro -# tic80-windows-pro -# tic80-linux-deb-pro -# tic80-linux-pro + tic80-macos-pro + tic80-macos-dmg-pro + tic80-winxp-pro + tic80-windows-pro + tic80-linux-deb-pro + tic80-linux-pro From a7d2f59f23315e570aeb934a7fbe7c9bcb101874 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 10 Nov 2021 07:48:36 -0500 Subject: [PATCH 089/379] Revert "we always need project now" This reverts commit 366aaac163cdb9f0a92546acd390d45860c35b49. --- CMakeLists.txt | 5 ++++- src/studio/screens/console.c | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e04f0cb0..551f7c110 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -738,7 +738,6 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/studio/editors/sfx.c ${TIC80LIB_DIR}/studio/editors/music.c ${TIC80LIB_DIR}/studio/studio.c - ${TIC80LIB_DIR}/studio/project.c ${TIC80LIB_DIR}/studio/config.c ${TIC80LIB_DIR}/studio/demos.c ${TIC80LIB_DIR}/studio/fs.c @@ -749,6 +748,10 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/ext/png.c ) +#if(${BUILD_PRO}) + set(TIC80STUDIO_SRC ${TIC80STUDIO_SRC} ${TIC80LIB_DIR}/studio/project.c) +#endif() + set(TIC80_OUTPUT tic80) add_library(tic80studio STATIC diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index ab496141a..b5ca4cd29 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -29,8 +29,11 @@ #include "zip.h" #include "studio/demos.h" +#if defined(TIC80_PRO) #include "studio/project.h" +#else #include "cart.h" +#endif #include #include From a69a5701946c1f61b9f727b1bfb1b33d258049d5 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 10 Nov 2021 09:09:51 -0500 Subject: [PATCH 090/379] move tic_project_ext to tools --- CMakeLists.txt | 4 ++-- src/studio/project.c | 11 ----------- src/studio/project.h | 1 - src/studio/screens/console.c | 4 ++-- src/tools.c | 11 +++++++++++ src/tools.h | 2 ++ 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 551f7c110..bb5d07508 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -748,9 +748,9 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/ext/png.c ) -#if(${BUILD_PRO}) +if(${BUILD_PRO}) set(TIC80STUDIO_SRC ${TIC80STUDIO_SRC} ${TIC80LIB_DIR}/studio/project.c) -#endif() +endif() set(TIC80_OUTPUT tic80) diff --git a/src/studio/project.c b/src/studio/project.c index 4c6fa71fc..d8bfc4a82 100644 --- a/src/studio/project.c +++ b/src/studio/project.c @@ -131,17 +131,6 @@ static const char* projectComment(const char* name) return Languages[0]->projectComment; } -bool tic_project_ext(const char* name) -{ - FOR_EACH_LANG(ln) - { - if(tic_tool_has_ext(name, ln->fileExtension)) - return true; - } - FOR_EACH_LANG_END - return false; -} - s32 tic_project_save(const char* name, void* data, const tic_cartridge* cart) { const char* comment = projectComment(name); diff --git a/src/studio/project.h b/src/studio/project.h index 78474dbfe..70f319d3f 100644 --- a/src/studio/project.h +++ b/src/studio/project.h @@ -26,4 +26,3 @@ bool tic_project_load(const char* name, const char* data, s32 size, tic_cartridge* dst); s32 tic_project_save(const char* name, void* data, const tic_cartridge* cart); -bool tic_project_ext(const char* name); diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index b5ca4cd29..020e39da8 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -934,11 +934,11 @@ static void onLoadCommandConfirmed(Console* console) #else if(tic_project_ext(name)) { printError(console, "\nproject loading error"); - printFront(console, "\nThis version only supports binary cartridges (GIF, PNG, or TIC)."); + printFront(console, "\nThis version only supports binary .png or .tic cartridges."); printLine(console); printFront(console, "\nTIC-80 "); consolePrint(console,"PRO",tic_color_light_blue); - printFront(console, " is needed for projects."); + printFront(console, " is needed for text files."); printLine(console); printFront(console, "\nLearn more:\n"); printLink(console, "https://tic80.com/pro"); diff --git a/src/tools.c b/src/tools.c index 57d72ba90..5bb94493f 100644 --- a/src/tools.c +++ b/src/tools.c @@ -149,6 +149,17 @@ u32* tic_tool_palette_blit(const tic_palette* srcpal, tic80_pixel_color_format f return pal; } +bool tic_project_ext(const char* name) +{ + FOR_EACH_LANG(ln) + { + if(tic_tool_has_ext(name, ln->fileExtension)) + return true; + } + FOR_EACH_LANG_END + return false; +} + bool tic_tool_has_ext(const char* name, const char* ext) { return strcmp(name + strlen(name) - strlen(ext), ext) == 0; diff --git a/src/tools.h b/src/tools.h index 6a75861dc..17cbc605b 100644 --- a/src/tools.h +++ b/src/tools.h @@ -22,6 +22,7 @@ #pragma once +#include "api.h" #include "tic.h" #include @@ -82,6 +83,7 @@ bool tic_tool_parse_note(const char* noteStr, s32* note, s32* octave); s32 tic_tool_get_pattern_id(const tic_track* track, s32 frame, s32 channel); void tic_tool_set_pattern_id(tic_track* track, s32 frame, s32 channel, s32 id); u32* tic_tool_palette_blit(const tic_palette* src, tic80_pixel_color_format fmt); +bool tic_project_ext(const char* name); bool tic_tool_has_ext(const char* name, const char* ext); s32 tic_tool_get_track_row_sfx(const tic_track_row* row); void tic_tool_set_track_row_sfx(tic_track_row* row, s32 sfx); From f9aef2ad7dfa18bcb008344a2e58259f35cac9d0 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 10 Nov 2021 09:21:02 -0500 Subject: [PATCH 091/379] add tools --- src/studio/screens/console.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 020e39da8..6859a2c02 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -22,6 +22,7 @@ #include "console.h" #include "start.h" +#include "tools.h" #include "studio/fs.h" #include "studio/net.h" #include "studio/config.h" From 9c7267ee7528a75a3ceca67674618f0fe6384728 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 17 Nov 2021 10:39:31 +0300 Subject: [PATCH 092/379] fixed spr() rotation #1696 --- src/core/draw.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/draw.c b/src/core/draw.c index 23749f9e4..d3c42afa9 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -199,6 +199,9 @@ static void drawSprite(tic_core* core, s32 index, s32 x, s32 y, s32 w, s32 h, u8 if (index < 0) return; + rotate &= 0b11; + flip &= 0b11; + tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.vars.blit); if (w == 1 && h == 1) { tic_tileptr tile = tic_tilesheet_gettile(&sheet, index, false); From 8a5c55fa7581e2f9f29f9d4794ea90878fa7d747 Mon Sep 17 00:00:00 2001 From: blinry Date: Wed, 17 Nov 2021 22:36:31 +0100 Subject: [PATCH 093/379] Replace a right single apostrophe in the API help with an apostrophe The former doesn't render correctly when "help map" is issued in the console. --- src/api.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api.h b/src/api.h index 40e5f203f..c30736091 100644 --- a/src/api.h +++ b/src/api.h @@ -316,7 +316,7 @@ enum "This function will draw the desired area of the map to a specified screen position.\n" \ "For example, map(5,5,12,10,0,0) will draw a 12x10 section of the map, " \ "starting from map co-ordinates (5,5) to screen position (0,0).\n" \ - "The map function’s last parameter is a powerful callback function " \ + "The map function's last parameter is a powerful callback function " \ "for changing how map cells (sprites) are drawn when map is called.\n" \ "It can be used to rotate, flip and replace sprites while the game is running.\n" \ "Unlike mset, which saves changes to the map, this special function can be used to create " \ From e667259201c670094a17fd8895f0333634ad5945 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 19 Nov 2021 14:54:25 +0300 Subject: [PATCH 094/379] fixed sound on weak devices with Android --- src/core/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/core.h b/src/core/core.h index b2ac249dd..c2981773a 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -28,7 +28,7 @@ #define CLOCKRATE (255<<13) #define TIC_DEFAULT_COLOR 15 -#define TIC_SOUND_RINGBUF_LEN 6 // in worst case, this induces ~ 6 tick delay i.e. 100 ms +#define TIC_SOUND_RINGBUF_LEN 12 // in worst case, this induces ~ 12 tick delay i.e. 200 ms typedef struct { From f214320169ac1c8a717e95b40591904837a2f771 Mon Sep 17 00:00:00 2001 From: Tyler887 <78053003+Tyler887@users.noreply.github.com> Date: Sun, 21 Nov 2021 11:36:24 +0000 Subject: [PATCH 095/379] Update README.md --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 434db8e93..b0de80a9a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **TIC-80 TINY COMPUTER** - [https://tic80.com](https://tic80.com) # About -TIC-80 is a **FREE** and **OPEN SOURCE** fantasy computer for making, playing and sharing tiny games. +TIC-80 is a free and open source fantasy computer for making, playing and sharing tiny games. With TIC-80 you get built-in tools for development: code, sprites, maps, sound editors and the command line, which is enough to create a mini retro game. @@ -24,19 +24,21 @@ To make a retro styled game, the whole process of creation and execution takes p - Games can have up to 4 controllers as input (with up to 8 buttons, each) - Built-in editors: for code, sprites, world maps, sound effects and music - An aditional memory bank: load different assets from your cartridge while your game is executing +- Moderated community # Binary Downloads You can download compiled versions for the major operating systems directly from our [releases page](https://github.com/nesbox/TIC-80/releases). -### Nightly builds +## Nightly builds Can be downloaded from [nightly builds](https://nightly.link/nesbox/TIC-80/workflows/build/master) page or from the [Github Actions](https://github.com/nesbox/TIC-80/actions?query=branch%3Amaster) page. # Pro Version To help support TIC-80 development, we have a [PRO Version](https://nesbox.itch.io/tic80). -This version has a few additional features and binaries can only be downloaded on [our Itch.io page](https://nesbox.itch.io/tic80). -For users who can't spend the money, we made it easy to build the pro version from the source code. (`cmake .. -DBUILD_PRO=On`) +This version has a few additional features and binaries can only be downloaded on our Itch.io page. -### Pro features +For users who can't spend the money, we made it easy to build the pro version from the source code: (`cmake .. -DBUILD_PRO=On`) + +## Pro features - Save/load cartridges in text format, and create your game in any editor you want, also useful for version control systems. - Even more memory banks: instead of having only 1 memory bank you have 8. @@ -48,11 +50,11 @@ You can play and share games, tools and music at [https://tic80.com/play](https: The community also hangs out and discusses on [Telegram](https://t.me/tic80) or [Discord](https://discord.gg/DkD73dP). # Contributing -You can contribute by issuing a bug or requesting a new feature on our [issues page](https://github.com/nesbox/TIC-80/issues). +You can contribute by reporting a bug or requesting a new feature on our [issues page](https://github.com/nesbox/TIC-80/issues). Keep in mind when engaging on a discussion to follow our [Code of Conduct](https://github.com/nesbox/TIC-80/blob/master/CODE_OF_CONDUCT.md). You can also contribute by reviewing or improving our [wiki](https://github.com/nesbox/TIC-80/wiki). -The [wiki](https://github.com/nesbox/TIC-80/wiki) holds TIC-80 documentation, code snippets and game development tutorials. +The wiki holds TIC-80 documentation, code snippets and game development tutorials. # Build instructions From db617181ca91d133a3af233ccd76dae170354641 Mon Sep 17 00:00:00 2001 From: Tyler887 <78053003+Tyler887@users.noreply.github.com> Date: Sun, 21 Nov 2021 13:47:06 +0000 Subject: [PATCH 096/379] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0de80a9a..010f61b9d 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ To make a retro styled game, the whole process of creation and execution takes p - Games can have mouse and keyboard as input - Games can have up to 4 controllers as input (with up to 8 buttons, each) - Built-in editors: for code, sprites, world maps, sound effects and music -- An aditional memory bank: load different assets from your cartridge while your game is executing +- An additional memory bank: load different assets from your cartridge while your game is executing - Moderated community # Binary Downloads From 9adf06c109b321c28bd1795493e6c4bccc09f29e Mon Sep 17 00:00:00 2001 From: Tyler887 <78053003+Tyler887@users.noreply.github.com> Date: Sun, 21 Nov 2021 17:51:59 +0000 Subject: [PATCH 097/379] Add community guidelines Because the additional "moderated community" sentence was added, and to keep TIC-80 friendly for non-adults. --- CommunityGuidelines.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 CommunityGuidelines.md diff --git a/CommunityGuidelines.md b/CommunityGuidelines.md new file mode 100644 index 000000000..8b3e0b339 --- /dev/null +++ b/CommunityGuidelines.md @@ -0,0 +1,9 @@ +We welcome everyone on the TIC-80 community, regardless of age and programming level, unless they are not following these guidelines. Help us keep your, our, and other's properties safe by following these Community Guidelines: +### Be respectful. +We are all different. Try not to distrupt other people's rights. +### Don't place strong violence in-game. +Do not place adult content, especially strong violence or strong language, in a TIC-80 game. This would be too inappropriate content. **The violence and bad language level should be between none to minimally strong.** +### Keep personal info private. +Do not share emails, DOBs (dates of births), people's ages, and do not link to chats except on encrypted secure websites. +### Be friendly. +It is important that all of our user generated content has no content that is only suitable for adults. If anything on TIC-80 you find looks too inappropriate for under 18s, please let us know. From f0f2103c76344c2a6c8d78f2b8880807d1ddd8bb Mon Sep 17 00:00:00 2001 From: Tyler887 <78053003+Tyler887@users.noreply.github.com> Date: Mon, 22 Nov 2021 08:31:20 +0000 Subject: [PATCH 098/379] Add title --- CommunityGuidelines.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CommunityGuidelines.md b/CommunityGuidelines.md index 8b3e0b339..38f1dbeea 100644 --- a/CommunityGuidelines.md +++ b/CommunityGuidelines.md @@ -1,3 +1,5 @@ +## TIC-80 Community Guidelines + We welcome everyone on the TIC-80 community, regardless of age and programming level, unless they are not following these guidelines. Help us keep your, our, and other's properties safe by following these Community Guidelines: ### Be respectful. We are all different. Try not to distrupt other people's rights. From fcd48dcf8682bdbdeffac80053cec28cb30be616 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Fri, 26 Nov 2021 10:59:46 -0800 Subject: [PATCH 099/379] Update Fennel to version 1.0.0. --- vendor/fennel/fennel.h | 28382 +++++++++++++++++++------------------ vendor/fennel/fennel.lua | 5271 ++++--- 2 files changed, 17798 insertions(+), 15855 deletions(-) diff --git a/vendor/fennel/fennel.h b/vendor/fennel/fennel.h index 6c4c1cd11..e66e8baf0 100644 --- a/vendor/fennel/fennel.h +++ b/vendor/fennel/fennel.h @@ -20,185 +20,192 @@ unsigned char loadfennel_lua[] = { 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x30, 0x20, 0x3c, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5b, 0x22, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x5d, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x2e, 0x2e, 0x22, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x35, 0x31, 0x39, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x30, 0x20, 0x3c, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5b, 0x22, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x5d, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x2e, 0x2e, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x22, 0x3e, 0x3e, 0x20, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x28, 0x5f, 0x35, 0x31, 0x39, 0x5f, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x69, + 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x28, 0x78, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x78, + 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x39, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x2e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x74, 0x79, 0x70, 0x65, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x35, 0x32, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x32, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x74, 0x79, 0x70, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x35, 0x32, 0x30, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x4c, 0x75, 0x61, + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x42, 0x61, 0x64, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, + 0x20, 0x61, 0x20, 0x62, 0x75, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x3a, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2d, 0x2d, 0x2d, + 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x4c, + 0x75, 0x61, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2d, 0x2d, 0x2d, + 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2d, 0x2d, + 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x4c, 0x75, 0x61, 0x20, 0x45, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x2d, 0x5c, + 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x32, 0x30, 0x5f, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x65, 0x72, 0x72, 0x29, 0x2c, 0x20, 0x34, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, + 0x3d, 0x20, 0x5f, 0x35, 0x32, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x22, 0x25, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x25, + 0x73, 0x5c, 0x6e, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x65, 0x72, 0x72, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x72, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x22, 0x3e, 0x3e, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x28, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x6f, 0x2e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x28, 0x78, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6f, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x78, 0x73, 0x2c, 0x20, - 0x22, 0x5c, 0x39, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x28, 0x65, 0x72, 0x72, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x65, 0x72, - 0x72, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, - 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, - 0x72, 0x72, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x4c, 0x75, 0x61, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x42, 0x61, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x6c, - 0x69, 0x6b, 0x65, 0x6c, 0x79, 0x20, 0x61, 0x20, 0x62, 0x75, 0x67, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x3a, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x2d, 0x2d, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x20, 0x2d, 0x2d, 0x2d, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x2d, 0x2d, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x45, 0x6e, 0x64, - 0x20, 0x2d, 0x2d, 0x2d, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x72, 0x72, 0x29, 0x2c, - 0x20, 0x34, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x22, 0x25, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x3a, 0x20, 0x25, 0x73, 0x5c, 0x6e, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x65, 0x72, 0x72, 0x74, 0x79, 0x70, 0x65, 0x2c, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x72, - 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x2e, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x22, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, - 0x31, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x2e, 0x67, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x31, 0x2c, - 0x20, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, 0x5f, 0x29, 0x22, 0x2c, 0x20, - 0x22, 0x20, 0x69, 0x66, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x5c, 0x22, - 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, 0x5f, 0x5c, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x5f, 0x5f, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, - 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, - 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, 0x5f, - 0x20, 0x2b, 0x20, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x20, - 0x65, 0x6e, 0x64, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, - 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x65, 0x6e, - 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x3d, - 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x5f, 0x35, 0x32, + 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x76, 0x65, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, + 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, + 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x22, + 0x2c, 0x20, 0x22, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x28, 0x31, 0x2c, 0x20, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, + 0x5f, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x69, 0x66, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x7e, 0x3d, 0x20, 0x5c, 0x22, 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, 0x5f, + 0x5c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x5b, 0x27, 0x25, 0x73, 0x27, 0x5d, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x28, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x5c, 0x6e, 0x3f, 0x22, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x20, + 0x5f, 0x5f, 0x5f, 0x69, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x5f, + 0x5f, 0x69, 0x5f, 0x5f, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x22, 0x2c, 0x20, + 0x22, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x20, 0x65, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x7d, 0x2c, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6c, + 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x6c, + 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x22, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x5f, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, + 0x5f, 0x5f, 0x5b, 0x27, 0x25, 0x73, 0x27, 0x5d, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x28, 0x5b, 0x5e, + 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x5c, 0x6e, 0x3f, 0x22, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x70, 0x6c, + 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x70, 0x6c, + 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, + 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x3a, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x31, 0x20, + 0x3c, 0x20, 0x23, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x3a, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x31, 0x20, 0x3c, 0x20, 0x23, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, - 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5b, 0x23, 0x73, 0x70, 0x6c, 0x69, 0x63, - 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5d, 0x29, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x20, 0x2a, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, 0x2a, 0x24, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x63, 0x65, 0x5b, 0x23, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5d, 0x29, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x5e, 0x20, 0x2a, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x2e, 0x2a, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x70, 0x6c, + 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, + 0x20, 0x23, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2c, 0x20, 0x23, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x61, 0x76, - 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, - 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x22, 0x5c, - 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, - 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x2e, 0x2a, 0x5b, 0x25, - 0x73, 0x29, 0x28, 0x5d, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x33, - 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, - 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, - 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x61, 0x6c, - 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x63, 0x65, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x2e, 0x2a, 0x5b, 0x25, 0x73, 0x29, 0x28, 0x5d, 0x2b, 0x22, + 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, + 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, @@ -224,349 +231,359 @@ unsigned char loadfennel_lua[] = { 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x30, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6b, 0x30, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, - 0x2e, 0x20, 0x6b, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x32, 0x35, 0x5f, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, + 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6b, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x2e, 0x2e, 0x20, 0x6b, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, - 0x63, 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, - 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, - 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, - 0x5e, 0x28, 0x5b, 0x5e, 0x3a, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x2e, 0x2a, - 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x70, - 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x5e, 0x28, - 0x5b, 0x5e, 0x2e, 0x5d, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x2e, 0x2a, 0x29, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x68, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, - 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, - 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x5b, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x35, + 0x32, 0x35, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, - 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x62, 0x6c, - 0x5b, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, - 0x67, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x74, 0x61, 0x69, 0x6c, - 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, - 0x61, 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x20, 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, 0x2c, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x74, - 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, - 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x30, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, - 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, - 0x22, 0x3a, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x30, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x5e, + 0x28, 0x5b, 0x5e, 0x3a, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x2e, 0x2a, 0x29, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x70, 0x6c, + 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x5e, 0x28, 0x5b, + 0x5e, 0x2e, 0x5d, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x2e, 0x2a, 0x29, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, + 0x65, 0x61, 0x64, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, + 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x5b, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x68, + 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x5b, + 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5d, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x2c, + 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, + 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, 0x2c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, - 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, - 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x2c, - 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, - 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x7b, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x2c, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, - 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, - 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x47, 0x7d, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6f, - 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, - 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x33, 0x66, 0x28, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x2c, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x6f, - 0x63, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, - 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, - 0x3d, 0x20, 0x28, 0x22, 0x20, 0x20, 0x2c, 0x25, 0x73, 0x20, 0x2d, 0x20, - 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x66, 0x2c, 0x20, 0x22, 0x66, - 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, - 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x2e, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x2c, 0x20, 0x5f, - 0x30, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, - 0x28, 0x22, 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x5c, 0x6e, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x45, - 0x50, 0x4c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x63, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x63, - 0x6f, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x65, 0x76, - 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x5c, 0x6e, 0x59, 0x6f, - 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x72, - 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x72, 0x65, 0x70, - 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x5c, - 0x6e, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x28, 0x29, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x2c, 0x65, 0x78, 0x69, 0x74, - 0x20, 0x2d, 0x20, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x55, 0x73, - 0x65, 0x20, 0x28, 0x64, 0x6f, 0x63, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, - 0x68, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, - 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, - 0x64, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x46, 0x6f, - 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, - 0x3a, 0x2f, 0x2f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6c, 0x61, - 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x22, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x68, 0x65, 0x6c, - 0x70, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x53, 0x68, 0x6f, - 0x77, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, - 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, - 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2c, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, - 0x6c, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, - 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, - 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x22, 0x2c, 0x20, 0x65, - 0x6e, 0x76, 0x29, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x6e, 0x65, - 0x77, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, 0x20, 0x74, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x74, 0x61, + 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x72, 0x61, 0x77, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x5d, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, + 0x20, 0x3d, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x20, 0x3d, 0x20, + 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, + 0x3a, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x30, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x6e, - 0x65, 0x77, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6e, 0x65, 0x77, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x30, 0x20, - 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x6c, 0x64, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, - 0x65, 0x77, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, - 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x6e, 0x65, 0x77, 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6c, 0x64, 0x5b, - 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6f, 0x6c, 0x64, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6e, - 0x65, 0x77, 0x30, 0x5b, 0x6b, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x6c, 0x64, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, + 0x6e, 0x64, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x62, + 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x30, 0x2c, 0x20, + 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x2c, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x7b, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2c, + 0x20, 0x28, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x6f, + 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, + 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x47, 0x7d, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x6f, + 0x70, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, + 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x2c, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x35, 0x33, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x20, 0x20, 0x2c, 0x25, 0x73, 0x20, 0x2d, + 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x66, 0x2c, 0x20, 0x22, + 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, + 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, + 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, + 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, + 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x33, 0x32, 0x5f, 0x20, 0x3d, 0x20, + 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x6f, 0x6b, 0x22, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, - 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x2e, 0x2a, 0x22, 0x2c, 0x20, 0x22, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, 0x35, 0x33, 0x32, + 0x5f, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2e, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x2c, 0x20, 0x5f, 0x30, 0x2c, + 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x28, 0x22, + 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x46, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x45, 0x50, 0x4c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, + 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x5c, 0x6e, 0x59, 0x6f, 0x75, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x72, 0x75, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x5c, 0x6e, 0x5c, + 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x28, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x2c, 0x65, 0x78, 0x69, 0x74, 0x20, 0x2d, + 0x20, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x70, 0x6c, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x55, 0x73, 0x65, 0x20, + 0x2c, 0x64, 0x6f, 0x63, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, + 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x73, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x46, 0x6f, 0x72, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x73, 0x65, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x68, 0x65, 0x6c, 0x70, 0x2c, 0x20, + 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x53, 0x68, 0x6f, 0x77, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x33, 0x34, 0x5f, 0x2c, 0x20, 0x5f, + 0x35, 0x33, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, + 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, 0x22, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x22, 0x2c, 0x20, 0x65, 0x6e, + 0x76, 0x29, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x5f, 0x35, 0x33, 0x34, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x35, 0x5f, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, + 0x5f, 0x35, 0x33, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, + 0x7b, 0x6e, 0x65, 0x77, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x6c, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x77, + 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x6c, + 0x64, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6e, 0x65, 0x77, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x6e, 0x65, 0x77, 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6c, + 0x64, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, - 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, - 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, - 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6f, 0x6c, 0x64, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, + 0x20, 0x28, 0x6e, 0x65, 0x77, 0x30, 0x29, 0x5b, 0x6b, 0x5d, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6c, 0x64, 0x5b, 0x6b, 0x5d, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, + 0x20, 0x6f, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x28, 0x7b, 0x22, 0x6f, 0x6b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x35, + 0x33, 0x34, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, - 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x3d, 0x20, 0x5f, 0x35, 0x33, 0x35, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x33, + 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x35, 0x34, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, + 0x33, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x2e, 0x2a, 0x22, 0x2c, 0x20, 0x22, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x35, 0x33, 0x39, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x30, 0x5f, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x34, 0x32, 0x5f, 0x2c, + 0x20, 0x5f, 0x35, 0x34, 0x33, 0x5f, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x34, + 0x5f, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, + 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x5f, 0x35, 0x34, 0x32, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x34, + 0x33, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x5f, 0x35, 0x34, 0x34, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x33, 0x66, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, - 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x66, 0x65, - 0x72, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, - 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, 0x72, - 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x6e, - 0x27, 0x74, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, - 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, - 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x34, 0x34, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x34, + 0x32, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, 0x72, 0x73, 0x65, 0x22, 0x2c, + 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, @@ -576,419 +593,676 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x52, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, - 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x2e, - 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x36, 0x5f, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, + 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, + 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x6f, + 0x6b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2c, 0x20, + 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x45, 0x72, 0x61, 0x73, 0x65, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x35, 0x34, 0x37, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x6f, 0x6b, 0x22, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x2c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x3a, 0x73, 0x75, 0x62, 0x28, + 0x31, 0x2c, 0x20, 0x2d, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x34, 0x37, + 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x22, 0x66, - 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x2c, 0x20, 0x22, 0x45, 0x72, 0x61, 0x73, 0x65, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, - 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, - 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, - 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, - 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, - 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, - 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, + 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2c, + 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, + 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, - 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x29, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, - 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x74, 0x62, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x7e, + 0x3d, 0x20, 0x73, 0x75, 0x62, 0x74, 0x62, 0x6c, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x34, 0x38, 0x5f, 0x20, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x75, 0x62, 0x74, 0x62, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x5f, 0x35, 0x34, 0x38, 0x5f, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x34, 0x38, + 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, - 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, - 0x65, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x30, 0x2c, - 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, - 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x5f, 0x32, 0x61, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, - 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, - 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, - 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, - 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x5f, 0x47, 0x25, - 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x20, 0x3d, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, - 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, - 0x34, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, - 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, - 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x61, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, - 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, - 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, - 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, - 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x25, - 0x2e, 0x5d, 0x2b, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, - 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, - 0x61, 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x30, 0x20, 0x69, 0x6e, - 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x61, 0x74, 0x68, - 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x30, 0x3a, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x22, 0x25, 0x2f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, - 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x67, 0x74, 0x5b, 0x5f, - 0x31, 0x5f, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x67, 0x74, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x73, 0x75, 0x62, 0x74, 0x62, 0x6c, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x35, 0x35, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x5f, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x30, + 0x5f, 0x5b, 0x73, 0x75, 0x62, 0x74, 0x62, 0x6c, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x35, 0x31, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x28, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x20, 0x5f, 0x35, + 0x35, 0x31, 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x28, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x32, 0x61, + 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x2c, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x5f, 0x47, 0x25, 0x2e, 0x22, 0x2c, + 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, + 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, + 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, + 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, + 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x5f, 0x64, 0x6f, 0x63, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, - 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x28, 0x22, 0x2e, 0x2a, - 0x22, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, - 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, - 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, - 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, - 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, - 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x64, - 0x6f, 0x63, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, - 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x6e, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, + 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x61, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x64, 0x6f, 0x63, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, - 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, - 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x6e, 0x20, 0x5f, 0x35, 0x35, 0x36, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x28, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, + 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, + 0x20, 0x5f, 0x35, 0x35, 0x36, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x22, 0x61, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x22, 0x5d, 0x2c, 0x20, - 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x64, 0x6f, - 0x63, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x61, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, + 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, + 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x25, 0x2e, 0x5d, + 0x2b, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, + 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x70, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, + 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, + 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, + 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, + 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x3d, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x30, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x67, + 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x35, 0x39, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x35, 0x35, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x30, + 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x2f, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x35, 0x35, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x35, + 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, + 0x20, 0x74, 0x67, 0x74, 0x5b, 0x5f, 0x35, 0x35, 0x39, 0x5f, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, - 0x6f, 0x63, 0x73, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x28, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x64, 0x6f, 0x63, 0x28, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x28, 0x22, 0x2e, 0x2a, 0x22, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, - 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, - 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x74, 0x67, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x35, 0x36, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, + 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x36, 0x30, 0x5f, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x36, 0x30, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x73, 0x68, - 0x6f, 0x77, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, - 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6f, - 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, - 0x6f, 0x63, 0x73, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x64, 0x6f, + 0x63, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x5f, 0x28, 0x5f, 0x32, 0x34, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x64, 0x6f, + 0x63, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, + 0x32, 0x34, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x36, 0x34, 0x5f, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, + 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x64, 0x6f, + 0x63, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, + 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x72, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x73, + 0x68, 0x6f, 0x77, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x28, 0x6f, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x61, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x67, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, + 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, + 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x64, + 0x6f, 0x63, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, + 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x73, 0x68, 0x6f, + 0x77, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x35, 0x36, 0x36, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x5f, 0x73, 0x68, 0x6f, + 0x77, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x28, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x36, + 0x36, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x5b, 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x2d, 0x73, 0x68, 0x6f, 0x77, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x5d, + 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, + 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, + 0x5f, 0x35, 0x36, 0x37, 0x5f, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x35, 0x36, 0x38, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x35, 0x36, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x35, 0x36, 0x38, 0x5f, 0x5b, 0x22, 0x5f, 0x5f, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, + 0x5f, 0x5f, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, + 0x67, 0x5f, 0x35, 0x36, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x35, 0x36, 0x39, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x5f, 0x5f, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, + 0x5f, 0x5f, 0x5b, 0x5f, 0x32, 0x34, 0x32, 0x5d, 0x20, 0x6f, 0x72, 0x20, + 0x65, 0x6e, 0x76, 0x5b, 0x5f, 0x32, 0x34, 0x32, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x36, 0x39, 0x5f, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x2c, 0x20, 0x7b, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, + 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, 0x63, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x65, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x5f, 0x28, 0x5f, + 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, + 0x37, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x5f, 0x32, 0x34, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x37, + 0x32, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x35, 0x37, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x5f, 0x35, 0x37, 0x32, 0x5f, 0x2c, 0x20, + 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x37, + 0x33, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, + 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, + 0x65, 0x74, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x5f, 0x35, 0x37, 0x33, 0x5f, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x35, 0x37, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x37, 0x32, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, + 0x35, 0x37, 0x31, 0x5f, 0x29, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x73, 0x72, 0x63, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x29, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x29, 0x2e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, + 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x29, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x4c, 0x75, 0x61, 0x22, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, + 0x28, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x29, 0x2e, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x37, 0x31, 0x5f, 0x29, 0x2e, 0x6c, + 0x69, 0x6e, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x5f, + 0x35, 0x37, 0x31, 0x5f, 0x29, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x6c, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x5f, 0x35, 0x37, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x6d, 0x61, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x74, 0x5f, 0x35, 0x37, 0x36, 0x5f, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x5f, 0x35, 0x37, 0x36, 0x5f, 0x20, 0x3d, 0x20, + 0x28, 0x74, 0x5f, 0x35, 0x37, 0x36, 0x5f, 0x29, 0x5b, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x5f, 0x35, 0x37, 0x36, + 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x5f, 0x35, 0x37, + 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x5f, 0x35, 0x37, 0x36, 0x5f, + 0x29, 0x5b, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x5f, + 0x35, 0x37, 0x36, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x5f, 0x35, 0x37, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x5f, 0x35, + 0x37, 0x36, 0x5f, 0x29, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6e, 0x6c, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x74, 0x5f, 0x35, 0x37, + 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x28, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x3a, 0x25, + 0x73, 0x22, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x28, 0x66, 0x6e, + 0x6c, 0x73, 0x72, 0x63, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x29, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x37, 0x31, 0x5f, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x55, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x37, 0x31, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x52, 0x65, 0x70, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x4e, + 0x6f, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, - 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, - 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, - 0x22, 0x61, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x2d, 0x73, 0x68, 0x6f, - 0x77, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x5d, 0x2c, 0x20, 0x22, 0x66, - 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, - 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x35, 0x37, 0x30, 0x5f, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, + 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x64, + 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, + 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, + 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x35, 0x38, 0x31, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6e, 0x61, 0x6d, + 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x28, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x65, 0x61, + 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, + 0x20, 0x5f, 0x35, 0x38, 0x31, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x2c, + 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x72, - 0x65, 0x70, 0x6c, 0x25, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x25, 0x2d, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, - 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, - 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, - 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6d, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x30, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x72, 0x65, - 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x2c, 0x28, 0x5b, 0x5e, 0x25, 0x73, 0x2f, 0x5d, 0x2b, 0x29, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, + 0x28, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, + 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x66, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x35, 0x38, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x72, 0x65, 0x70, + 0x6c, 0x25, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x25, 0x2d, + 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x32, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x32, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6d, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6c, + 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2c, + 0x28, 0x5b, 0x5e, 0x25, 0x73, 0x2f, 0x5d, 0x2b, 0x29, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x38, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, - 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, - 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x34, 0x5f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x34, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x34, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0x20, 0x7e, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x28, 0x7b, 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x28, 0x7b, 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2c, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, - 0x20, 0x7e, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, @@ -997,297 +1271,333 @@ unsigned char loadfennel_lua[] = { 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, - 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, - 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, - 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, - 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, - 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, - 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x73, 0x61, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x20, - 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, + 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, + 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x72, 0x61, + 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x5f, 0x45, + 0x4e, 0x56, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x61, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, + 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x73, 0x61, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x73, 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, - 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6b, - 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, - 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, - 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, 0x20, - 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x70, 0x20, 0x6f, - 0x72, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, - 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, - 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x5f, 0x31, 0x5f, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, + 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x70, 0x20, + 0x6f, 0x72, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, + 0x61, 0x74, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x38, 0x38, 0x5f, 0x28, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, - 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x65, 0x6e, 0x76, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x72, 0x28, 0x5f, 0x33, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x76, 0x2e, 0x5f, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x20, - 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x76, - 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x70, 0x70, 0x28, 0x76, 0x61, - 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x5f, 0x35, 0x38, 0x38, 0x5f, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x7e, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x65, + 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x39, 0x32, 0x5f, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x39, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x65, + 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x39, 0x31, 0x5f, 0x20, 0x3d, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x35, 0x39, 0x33, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, + 0x28, 0x5f, 0x35, 0x39, 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x35, 0x39, 0x31, + 0x5f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x35, 0x39, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x28, 0x5f, 0x35, 0x39, 0x32, + 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x28, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x61, 0x76, 0x65, + 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, 0x74, 0x2c, + 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, + 0x28, 0x74, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x5f, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, - 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, - 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x29, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, - 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, 0x61, 0x72, - 0x73, 0x65, 0x22, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, - 0x6b, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x2c, 0x20, 0x65, 0x6e, + 0x76, 0x2e, 0x5f, 0x5f, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5b, + 0x31, 0x5d, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, + 0x70, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x30, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, - 0x6f, 0x70, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, 0x5f, 0x33, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x34, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, - 0x78, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x2c, - 0x20, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, - 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x72, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, 0x62, 0x20, - 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, 0x69, - 0x74, 0x4c, 0x69, 0x62, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x34, 0x5f, 0x30, + 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6f, 0x75, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x5b, 0x6b, 0x5d, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x78, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, + 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x6f, 0x6b, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, + 0x6c, 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x6b, 0x5f, 0x33, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x35, 0x39, 0x37, 0x5f, 0x2c, 0x20, 0x5f, 0x35, 0x39, 0x38, + 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x30, 0x30, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x39, 0x39, + 0x5f, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x35, 0x39, 0x39, 0x5f, 0x5b, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x5f, 0x35, 0x39, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x35, 0x39, 0x37, 0x5f, 0x2c, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x5f, 0x20, + 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x5f, 0x36, 0x30, 0x30, 0x5f, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x35, 0x39, 0x37, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, - 0x35, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x35, 0x39, 0x38, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, - 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x73, 0x67, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, - 0x34, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, - 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, + 0x3d, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, + 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x5f, 0x35, 0x39, 0x37, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, + 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x5f, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x39, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, - 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x61, 0x76, 0x65, - 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x30, - 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x61, - 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x30, 0x20, - 0x3d, 0x20, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x61, 0x76, + 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x28, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x36, 0x30, 0x32, 0x5f, + 0x2c, 0x20, 0x5f, 0x36, 0x30, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x70, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, + 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, + 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x2c, 0x20, 0x65, 0x6e, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x36, 0x30, + 0x32, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x36, 0x30, 0x33, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x30, 0x33, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4c, 0x75, 0x61, + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, + 0x73, 0x67, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x36, 0x30, 0x33, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x30, 0x32, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x30, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x37, 0x5f, 0x30, - 0x2c, 0x20, 0x5f, 0x38, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, - 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, - 0x2c, 0x20, 0x73, 0x72, 0x63, 0x30, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x30, 0x34, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x37, 0x5f, 0x30, - 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, - 0x38, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, - 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4c, 0x75, 0x61, 0x20, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, - 0x73, 0x72, 0x63, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x38, 0x5f, - 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x5f, 0x37, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x5f, - 0x38, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x39, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x30, 0x36, + 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x36, + 0x30, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x30, 0x5f, 0x28, - 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x22, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, - 0x6c, 0x28, 0x5f, 0x39, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x5f, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x5f, + 0x36, 0x30, 0x34, 0x5f, 0x2c, 0x20, 0x5f, 0x36, 0x30, 0x35, 0x5f, 0x28, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, + 0x64, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, @@ -1296,1804 +1606,804 @@ unsigned char loadfennel_lua[] = { 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x35, - 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x3d, 0x20, - 0x32, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x31, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, - 0x33, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x34, - 0x2c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x37, - 0x2c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, - 0x20, 0x36, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x72, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x2c, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x31, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, - 0x5f, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x62, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x61, 0x20, 0x3d, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5b, - 0x74, 0x61, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5b, 0x74, 0x62, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, - 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x74, 0x62, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x74, 0x61, - 0x20, 0x3c, 0x20, 0x64, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x74, 0x61, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x64, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x5d, + 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, + 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, + 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x5f, 0x28, + 0x5f, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, + 0x65, 0x79, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x6b, + 0x65, 0x79, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x6b, + 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x34, 0x37, 0x5f, 0x28, 0x5f, + 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x76, 0x5b, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, + 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x6b, 0x65, + 0x79, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x74, 0x61, 0x20, 0x3c, 0x20, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x34, 0x39, 0x5f, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, 0x74, 0x65, + 0x6e, 0x76, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x33, 0x35, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, 0x30, 0x5f, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x33, + 0x35, 0x30, 0x5f, 0x2c, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, + 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x70, 0x75, 0x74, 0x65, 0x6e, 0x76, 0x29, + 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x35, 0x5f, 0x2c, 0x20, + 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x34, 0x37, 0x5f, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x34, 0x39, 0x5f, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x5f, 0x33, + 0x66, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x33, 0x35, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, + 0x33, 0x66, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x5f, 0x33, 0x35, 0x32, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, 0x33, + 0x35, 0x32, 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x35, + 0x32, 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x31, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x6d, 0x74, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, + 0x33, 0x66, 0x65, 0x6e, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x33, 0x35, 0x33, 0x5f, 0x2c, 0x20, 0x5f, 0x33, 0x35, + 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x33, + 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x34, 0x5f, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x5f, + 0x31, 0x32, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x5f, 0x33, + 0x35, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x5f, + 0x31, 0x33, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x5f, 0x33, + 0x35, 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x31, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x5b, 0x6b, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x31, 0x33, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, + 0x5f, 0x31, 0x31, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x33, 0x35, 0x32, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x65, + 0x6e, 0x76, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x74, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, + 0x61, 0x70, 0x28, 0x6d, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, + 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, - 0x67, 0x61, 0x70, 0x28, 0x6b, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6b, - 0x76, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x6b, 0x76, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, - 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, - 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x29, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x32, - 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x20, 0x69, 0x6e, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x65, 0x73, 0x74, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x5f, - 0x35, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x69, - 0x29, 0x20, 0x3e, 0x20, 0x67, 0x61, 0x70, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x69, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x61, 0x70, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x69, 0x6c, 0x6c, 0x5f, 0x67, 0x61, 0x70, 0x73, 0x28, 0x6b, 0x76, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, + 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x65, + 0x6e, 0x76, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, + 0x47, 0x2c, 0x20, 0x22, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x5f, 0x47, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, - 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x20, 0x3d, - 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x35, 0x31, 0x32, 0x20, 0x3c, 0x20, - 0x6a, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x20, 0x3c, - 0x20, 0x6a, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x7b, - 0x6b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, 0x5f, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, - 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x7b, 0x6b, 0x2c, 0x20, 0x76, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, - 0x6b, 0x76, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x61, - 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x67, 0x61, 0x70, 0x28, - 0x6b, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, - 0x67, 0x61, 0x70, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x3e, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x73, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x67, 0x61, 0x70, 0x22, 0x5d, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x5f, 0x67, 0x61, 0x70, - 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, - 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x23, 0x6b, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, + 0x35, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, 0x5f, 0x33, + 0x35, 0x37, 0x5f, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x33, 0x35, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, + 0x61, 0x64, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x74, + 0x22, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x28, 0x74, + 0x67, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x67, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x22, - 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, - 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, + 0x3a, 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, + 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x23, 0x3c, 0x75, 0x6e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x3e, 0x22, 0x29, + 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x24, 0x22, + 0x2c, 0x20, 0x22, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, + 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x74, + 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x22, + 0x23, 0x3c, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3e, 0x22, 0x7d, 0x29, 0x2c, + 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x35, 0x39, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x23, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3e, + 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x5f, + 0x20, 0x3d, 0x20, 0x22, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x35, 0x39, 0x5f, 0x20, + 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, + 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x29, 0x5c, 0x6e, 0x20, 0x20, 0x25, + 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x33, + 0x35, 0x39, 0x5f, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, + 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x76, 0x2c, 0x20, - 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x28, 0x74, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, - 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x3d, 0x20, - 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x70, 0x70, 0x65, - 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x28, 0x6b, 0x2c, 0x20, 0x61, - 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x70, - 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x28, 0x76, 0x2c, - 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, - 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, - 0x3d, 0x20, 0x28, 0x28, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x61, - 0x76, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, - 0x73, 0x65, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x20, 0x3d, 0x20, - 0x28, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x6c, 0x65, - 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x28, - 0x73, 0x65, 0x65, 0x6e, 0x30, 0x2e, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x5b, 0x74, 0x5d, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, - 0x65, 0x6e, 0x30, 0x5b, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x2e, - 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x74, 0x2c, - 0x20, 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6b, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x20, - 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, - 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, - 0x28, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, - 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, - 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6b, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, - 0x6b, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x76, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, - 0x76, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, - 0x28, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x6b, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, - 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, - 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x7b, 0x7d, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x31, 0x20, 0x3c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x6e, 0x74, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x69, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x64, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, - 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, - 0x20, 0x28, 0x23, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x69, 0x64, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6f, - 0x70, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x28, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, - 0x20, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, 0x22, - 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, - 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x73, 0x65, 0x71, 0x22, - 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x22, 0x5b, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x22, 0x0a, 0x20, 0x20, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, + 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x6e, - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, - 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x5f, 0x32, - 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, - 0x73, 0x65, 0x71, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x7d, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x20, - 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6f, 0x6e, - 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, - 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x23, 0x6f, 0x6e, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x29, 0x20, 0x3e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x22, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, - 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x76, 0x65, 0x28, - 0x74, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, - 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, 0x3d, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x2e, 0x2e, - 0x2e, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, + 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, 0x6f, + 0x72, 0x6d, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x5b, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, + 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, + 0x66, 0x6e, 0x6c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, + 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x33, 0x66, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x5f, + 0x33, 0x66, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x65, + 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, + 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x70, 0x72, 0x65, 0x5f, + 0x73, 0x79, 0x6d, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x28, 0x5f, 0x33, 0x66, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x40, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x7b, - 0x2e, 0x2e, 0x2e, 0x7d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, - 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x3d, 0x20, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, - 0x65, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x28, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, - 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, - 0x74, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6e, 0x69, 0x6c, + 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, + 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, + 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, - 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x75, 0x74, 0x66, 0x38, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2e, 0x6c, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, + 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, + 0x76, 0x61, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, + 0x74, 0x61, 0x69, 0x6c, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, + 0x6c, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, + 0x67, 0x61, 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, + 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, + 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, + 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x5f, 0x28, - 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x23, 0x5f, 0x32, - 0x34, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, 0x3f, 0x22, 0x5d, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x5f, 0x34, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x40, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, - 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x36, 0x5f, 0x30, 0x20, 0x69, 0x6e, - 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x37, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x36, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x20, 0x3d, - 0x20, 0x5f, 0x37, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, + 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x3d, + 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x74, 0x61, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, + 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, + 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x37, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x6b, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x73, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x28, 0x6b, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, - 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, - 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6b, 0x30, - 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x76, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, - 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x5f, 0x20, 0x3d, 0x20, - 0x28, 0x6b, 0x30, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, - 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x5f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, - 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x30, 0x2c, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x6b, 0x76, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, - 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, - 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, 0x3d, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x69, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5b, 0x2e, 0x2e, - 0x2e, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x66, 0x70, 0x72, 0x65, + 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, + 0x33, 0x66, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x29, 0x5b, + 0x69, 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x73, 0x29, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, + 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x79, 0x6d, + 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, + 0x22, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, + 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, + 0x61, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, - 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, - 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x69, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, - 0x33, 0x66, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x28, - 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, - 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, - 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x22, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, - 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, - 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, - 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, - 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, - 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, - 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, - 0x20, 0x76, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, - 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x76, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, - 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, - 0x20, 0x5f, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, - 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x2c, - 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, - 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, - 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, - 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, - 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x7d, 0x22, 0x0a, 0x20, 0x20, + 0x6c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, + 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, 0x72, + 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x22, 0x2e, + 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, - 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, 0x6c, - 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, - 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, - 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, - 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, - 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, 0x32, - 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, 0x6c, - 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6f, - 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, - 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x23, 0x6f, 0x6e, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x3e, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x2c, 0x20, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, - 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, + 0x22, 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x61, + 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x74, - 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, - 0x3e, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, - 0x65, 0x70, 0x74, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, - 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, - 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, - 0x2e, 0x2e, 0x2e, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x2e, 0x2e, - 0x2e, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x5f, 0x32, - 0x34, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x5b, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x79, - 0x63, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x70, 0x70, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, - 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3f, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x5f, 0x5f, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x6d, 0x65, 0x74, - 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, - 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, - 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3f, 0x22, - 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x34, - 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, + 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x73, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, + 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x73, + 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x5b, 0x6a, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, + 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, + 0x4d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x61, 0x69, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x65, + 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, + 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, + 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x36, 0x38, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, + 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x31, + 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, - 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x32, - 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x65, 0x74, - 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, + 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, + 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, + 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x33, 0x36, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x5f, 0x33, 0x36, 0x38, 0x5f, 0x2c, 0x20, 0x22, 0x20, + 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, + 0x5d, 0x28, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, + 0x37, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x35, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, 0x5f, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x5b, - 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, - 0x7b, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, - 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, - 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, - 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x76, 0x65, 0x28, - 0x78, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, + 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, + 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, + 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, + 0x20, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, + 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x31, + 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, + 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, + 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, + 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x34, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, - 0x35, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x33, 0x37, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x5f, 0x33, 0x37, 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x20, + 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x7d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6b, + 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x78, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x5b, 0x2d, 0x25, + 0x77, 0x3f, 0x5c, 0x5c, 0x5e, 0x5f, 0x21, 0x24, 0x25, 0x26, 0x2a, 0x2b, + 0x2e, 0x2f, 0x40, 0x3a, 0x7c, 0x3c, 0x3d, 0x3e, 0x5d, 0x2b, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, - 0x20, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x28, 0x78, 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, - 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x2c, - 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x3a, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x78, 0x29, 0x3a, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x22, + 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, + 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6c, - 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, - 0x28, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x73, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, - 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5e, 0x5f, 0x21, 0x24, 0x25, 0x26, 0x2a, - 0x2b, 0x2e, 0x2f, 0x40, 0x7c, 0x3c, 0x3d, 0x3e, 0x5d, 0x2b, 0x24, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, - 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, - 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x73, 0x63, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, - 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, 0x6e, 0x65, 0x77, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x23, 0x73, 0x74, 0x72, 0x20, 0x3c, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x2d, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, - 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, - 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x5f, 0x66, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x34, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, 0x32, - 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x5c, 0x25, 0x30, 0x33, - 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5f, - 0x32, 0x34, 0x32, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x5f, 0x33, 0x37, 0x33, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x22, + 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x64, 0x65, 0x65, + 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, + 0x32, 0x34, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x5f, 0x33, 0x37, 0x33, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x5c, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, + 0x74, 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x7d, 0x22, 0x29, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x6f, 0x63, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x22, 0x5c, + 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x5c, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x73, 0x2b, 0x24, 0x22, 0x2c, + 0x20, 0x22, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, + 0x5c, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x29, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, + 0x5c, 0x5c, 0x6e, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, + 0x5c, 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x73, 0x63, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x5b, 0x22, 0x5c, - 0x22, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, - 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x31, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x32, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, - 0x5b, 0x22, 0x5c, 0x31, 0x33, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, - 0x5c, 0x72, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x37, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, - 0x38, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, - 0x20, 0x5b, 0x22, 0x5c, 0x39, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, - 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x5c, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x5b, 0x22, - 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x7d, 0x2c, - 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, - 0x5f, 0x34, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, - 0x5b, 0x25, 0x63, 0x5c, 0x5c, 0x5c, 0x22, 0x5d, 0x22, 0x2c, 0x20, 0x65, - 0x73, 0x63, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, - 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, - 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, - 0x73, 0x2d, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, - 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, 0x6e, 0x65, 0x77, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x38, - 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x73, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x2d, 0x67, 0x61, 0x70, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x31, 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, 0x6c, 0x69, - 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x2d, - 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, - 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x28, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x65, 0x65, - 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, - 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, - 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, - 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, - 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, - 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x78, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x33, 0x66, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, - 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x78, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, - 0x2e, 0x70, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x30, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, - 0x2e, 0x70, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x28, - 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x29, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x3a, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x28, 0x22, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x25, 0x73, + 0x3a, 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x25, 0x73, 0x2c, 0x20, + 0x25, 0x73, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x22, 0x29, 0x3a, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x66, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x33, 0x37, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x33, 0x37, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x37, 0x36, + 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, + 0x2d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x5d, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x33, 0x37, + 0x36, 0x5f, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x2c, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, + 0x5f, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, + 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, + 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, + 0x3d, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, + 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x33, 0x37, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x35, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x2e, 0x5f, - 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x5f, 0x34, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x35, 0x5f, 0x28, 0x29, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x78, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x30, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6c, - 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, - 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x28, - 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x30, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x36, 0x5f, 0x28, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x76, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x30, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x2c, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, - 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x23, 0x3c, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x78, 0x30, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, 0x78, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, - 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x76, 0x69, 0x65, 0x77, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, - 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, - 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, - 0x76, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x2c, 0x20, 0x6b, 0x65, 0x79, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x31, 0x5f, 0x28, 0x5f, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, - 0x5d, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x6b, 0x65, - 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x75, - 0x74, 0x65, 0x6e, 0x76, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, - 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x33, 0x5f, 0x2c, 0x20, 0x76, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x70, - 0x75, 0x74, 0x65, 0x6e, 0x76, 0x29, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, - 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x5f, 0x5f, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x6e, - 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, - 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x5f, - 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6b, 0x2c, 0x20, 0x76, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, - 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, - 0x6b, 0x5f, 0x30, 0x5f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x30, 0x5f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, - 0x74, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x65, 0x6e, 0x76, - 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x6d, - 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, - 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, - 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x30, 0x20, - 0x3d, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, - 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, - 0x47, 0x2c, 0x20, 0x22, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x22, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, - 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x5f, 0x47, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x47, 0x2e, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, - 0x66, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x74, - 0x22, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x28, 0x74, 0x67, 0x74, 0x2c, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x67, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, - 0x28, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, - 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, - 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x22, 0x23, 0x3c, 0x75, 0x6e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x3e, 0x22, 0x29, 0x29, 0x3a, 0x67, - 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x24, 0x22, 0x2c, 0x20, 0x22, - 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, - 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, - 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x74, 0x67, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x74, 0x67, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, - 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x6c, - 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x28, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x29, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x74, 0x67, 0x74, 0x2c, - 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, - 0x74, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x22, 0x23, 0x3c, 0x75, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x3e, 0x22, 0x7d, 0x29, 0x2c, 0x20, 0x22, 0x20, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x61, 0x72, - 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x28, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x29, 0x5c, 0x6e, - 0x20, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, - 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x5c, 0x6e, 0x20, - 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, - 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, - 0x6f, 0x72, 0x6d, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, - 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x5d, 0x20, 0x3d, 0x20, - 0x7b, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, - 0x73, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, - 0x73, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x62, 0x6f, - 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, - 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, - 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x30, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x64, 0x6f, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x73, - 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, - 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x20, - 0x3d, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x6f, 0x72, 0x20, - 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x65, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, - 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x74, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3c, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x30, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, - 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, 0x6c, 0x65, 0x6e, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6f, - 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, - 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, - 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x29, 0x2c, - 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, - 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, - 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, - 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x30, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, - 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, - 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x28, 0x73, 0x75, - 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x30, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, - 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, - 0x6f, 0x72, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, - 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, - 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x72, - 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, - 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x79, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, - 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x79, 0x6d, 0x73, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, - 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, - 0x64, 0x79, 0x28, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, - 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, 0x72, 0x67, - 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, - 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x3d, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, - 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, - 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, - 0x65, 0x2c, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x64, 0x6f, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x6e, 0x69, - 0x6c, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x66, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, - 0x22, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, - 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x64, - 0x6f, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x73, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x2c, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, - 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, - 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x31, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x75, - 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, - 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x6a, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x73, 0x75, 0x62, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x2c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, - 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, - 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x4d, 0x75, - 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x69, - 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x2c, 0x20, - 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x78, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x20, 0x69, - 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, - 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, - 0x20, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, - 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, - 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x78, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x78, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5f, 0x5b, 0x28, 0x23, 0x74, 0x62, - 0x6c, 0x5f, 0x30, 0x5f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, - 0x20, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, - 0x65, 0x65, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x30, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, 0x30, - 0x5f, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x7d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, - 0x22, 0x5e, 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5c, 0x5c, 0x5e, 0x5f, 0x21, - 0x24, 0x25, 0x26, 0x2a, 0x2b, 0x2e, 0x2f, 0x40, 0x3a, 0x7c, 0x3c, 0x3d, - 0x3e, 0x5d, 0x2b, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x78, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, - 0x78, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x5c, 0x5c, - 0x22, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x22, - 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x2c, - 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x22, 0x29, 0x3a, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, - 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x30, - 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x5c, 0x22, 0x66, 0x6e, 0x6c, - 0x2f, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5c, 0x22, 0x22, 0x2c, - 0x20, 0x28, 0x22, 0x7b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, - 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x7d, 0x22, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x22, 0x66, 0x6e, 0x6c, 0x2f, - 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x22, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, - 0x65, 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, - 0x28, 0x22, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x22, 0x25, 0x73, 0x2b, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x3a, - 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x22, - 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x29, - 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x2c, 0x20, - 0x22, 0x5c, 0x5c, 0x5c, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, - 0x5c, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, - 0x20, 0x3d, 0x20, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x28, 0x5c, 0x22, 0x25, 0x73, 0x5c, 0x22, 0x29, 0x2e, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, - 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, - 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, - 0x22, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x25, 0x73, 0x3a, 0x73, 0x65, 0x74, - 0x61, 0x6c, 0x6c, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x29, 0x20, - 0x65, 0x6e, 0x64, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x2c, 0x20, - 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x65, - 0x74, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2c, 0x20, 0x22, - 0x2c, 0x20, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, - 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, - 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, - 0x5d, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, - 0x7d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, - 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2c, 0x20, 0x33, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x32, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x66, 0x6e, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x61, 0x72, 0x67, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, - 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x23, 0x61, - 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, - 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, - 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, - 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, - 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, - 0x61, 0x73, 0x74, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, - 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, - 0x25, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5f, 0x30, 0x5f, 0x2c, 0x20, - 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, - 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, - 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x66, 0x6e, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, - 0x70, 0x72, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x33, 0x37, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5f, 0x33, 0x37, 0x39, 0x5f, 0x2c, 0x20, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x66, 0x6e, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, + 0x70, 0x72, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, @@ -3123,79 +2433,79 @@ unsigned char loadfennel_lua[] = { 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, - 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x28, - 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6e, 0x5f, 0x73, 0x79, - 0x6d, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, - 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x73, - 0x79, 0x6d, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, - 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, - 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x6f, 0x72, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5b, 0x22, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x29, - 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x29, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x38, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x5f, 0x33, 0x38, 0x31, 0x5f, 0x29, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x61, + 0x72, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x31, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, + 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, - 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x61, 0x72, 0x67, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, - 0x5d, 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x23, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x61, - 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x2e, 0x2e, - 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x7e, 0x3d, - 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x2c, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, + 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, + 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x66, + 0x6e, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x72, 0x67, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x61, 0x72, 0x67, 0x20, 0x3d, + 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x23, + 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5d, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, + 0x72, 0x61, 0x72, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, + 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x72, 0x67, 0x29, + 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, + 0x22, 0x5d, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x72, 0x67, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, @@ -3238,402 +2548,236 @@ unsigned char loadfennel_lua[] = { 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x72, 0x67, 0x29, 0x29, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, - 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, - 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, - 0x65, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x73, 0x74, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x64, + 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x20, + 0x23, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, + 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x28, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x64, 0x6f, - 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x5b, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x30, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, + 0x5f, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, + 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x6f, 0x6e, + 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x66, 0x6e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x3f, + 0x22, 0x2c, 0x20, 0x22, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2c, 0x20, 0x22, + 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x22, 0x2c, + 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x2e, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5c, + 0x6e, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, + 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x5c, 0x6e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, + 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x5c, 0x6e, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x75, 0x73, + 0x65, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x75, 0x61, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x33, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x35, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, + 0x38, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x5f, 0x33, 0x38, 0x35, 0x5f, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x38, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x36, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x66, 0x6e, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x30, 0x2c, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x61, 0x72, - 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, - 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, - 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, - 0x73, 0x5f, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x61, - 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x66, 0x6e, 0x22, 0x2c, - 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x22, 0x2c, 0x20, 0x22, - 0x61, 0x72, 0x67, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, - 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x20, 0x4d, - 0x61, 0x79, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x63, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, - 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x5c, 0x6e, 0x57, 0x68, - 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x72, 0x6f, 0x6e, 0x67, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5c, 0x6e, - 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6c, 0x61, - 0x6d, 0x62, 0x64, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x69, - 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x28, 0x23, 0x61, - 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x29, - 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x31, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, - 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, - 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, - 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, - 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x31, 0x5f, 0x30, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x61, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x38, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x33, 0x38, 0x39, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, + 0x39, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x5f, 0x33, 0x38, 0x39, 0x5f, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x38, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x39, 0x30, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x5f, 0x31, 0x5f, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, - 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x6e, - 0x69, 0x6c, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x74, + 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x31, 0x20, 0x3c, 0x20, 0x23, 0x61, + 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, + 0x5f, 0x33, 0x39, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x68, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x33, 0x39, + 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, - 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x27, 0x74, - 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x75, 0x70, 0x20, 0x64, 0x6f, 0x63, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, - 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, - 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, - 0x3d, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x70, - 0x72, 0x69, 0x6e, 0x74, 0x28, 0x25, 0x71, 0x29, 0x22, 0x29, 0x3a, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, - 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x5f, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x25, 0x73, 0x27, - 0x29, 0x2e, 0x64, 0x6f, 0x63, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x27, 0x25, - 0x73, 0x27, 0x29, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x64, 0x6f, 0x63, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, - 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x64, 0x6f, 0x74, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x31, 0x20, 0x3c, - 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, - 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x6c, + 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x22, 0x2e, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x33, + 0x39, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x20, - 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x69, - 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, - 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, - 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, - 0x22, 0x5d, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, - 0x28, 0x22, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x28, - 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x29, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, - 0x22, 0x5b, 0x7b, 0x5c, 0x22, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, - 0x73, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x29, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, - 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, - 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x22, 0x2e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, - 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x6f, 0x6f, - 0x6b, 0x20, 0x75, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x31, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x62, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, - 0x49, 0x66, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x64, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, - 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, - 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, - 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, - 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, - 0x20, 0x22, 0x73, 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x73, 0x65, 0x74, - 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, - 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, - 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6e, - 0x65, 0x77, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x4f, 0x6e, - 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x6f, 0x6e, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, - 0x20, 0x76, 0x61, 0x72, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, - 0x79, 0x5f, 0x32, 0x31, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x73, 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x66, - 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x21, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, - 0x79, 0x5f, 0x32, 0x31, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, - 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, - 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, - 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, - 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, - 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x6f, 0x70, 0x2d, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x69, 0x6d, 0x6d, 0x75, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, - 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x5f, + 0x6c, 0x65, 0x74, 0x5f, 0x33, 0x39, 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x28, 0x22, 0x5b, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x30, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5d, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, + 0x68, 0x73, 0x29, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5b, 0x7b, + 0x5c, 0x22, 0x30, 0x2d, 0x39, 0x5d, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, + 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x29, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, + 0x2e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, + 0x20, 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x6f, 0x6f, 0x6b, 0x20, 0x75, + 0x70, 0x20, 0x6b, 0x65, 0x79, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x62, + 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, + 0x64, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, @@ -3646,369 +2790,533 @@ unsigned char loadfennel_lua[] = { 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x2c, 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, - 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x76, 0x61, 0x72, 0x22, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x76, 0x61, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, - 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x2c, 0x20, + 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, + 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x73, - 0x74, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, - 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x28, 0x28, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, - 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, - 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x70, - 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, - 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, - 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, - 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, - 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, - 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x65, 0x74, 0x22, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x28, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x6f, 0x75, 0x6e, + 0x64, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, + 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x73, 0x65, 0x74, 0x22, 0x2c, 0x20, + 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, 0x61, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, + 0x72, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, + 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x5f, 0x32, + 0x31, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, + 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, + 0x73, 0x65, 0x74, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, + 0x4c, 0x53, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x66, 0x6f, 0x72, 0x63, + 0x69, 0x62, 0x6c, 0x79, 0x21, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x5f, 0x32, + 0x31, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, + 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x69, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x76, 0x61, 0x72, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, - 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x31, - 0x20, 0x76, 0x61, 0x6c, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x4e, 0x20, 0x76, 0x61, 0x6c, 0x4e, 0x5d, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x74, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, - 0x77, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, - 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, - 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, - 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, - 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x28, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x65, 0x61, - 0x66, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, - 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, - 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x72, - 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, - 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x29, 0x24, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, - 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x7b, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x41, 0x4c, 0x53, 0x2e, 0x74, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, - 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, - 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, 0x2c, - 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x65, - 0x79, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x23, 0x61, 0x73, 0x74, 0x5d, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, - 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, - 0x65, 0x5f, 0x33, 0x66, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, - 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x20, 0x65, 0x6e, - 0x64, 0x20, 0x28, 0x25, 0x73, 0x29, 0x5b, 0x25, 0x73, 0x5d, 0x20, 0x3d, - 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, 0x73, - 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, - 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, + 0x73, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x76, 0x61, 0x72, 0x22, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x76, + 0x61, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, + 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, + 0x76, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x39, 0x38, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, + 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x22, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6b, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, + 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x31, 0x35, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x33, 0x39, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x22, 0x5d, 0x5b, 0x22, 0x29, 0x2c, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x74, 0x73, 0x65, - 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, 0x20, - 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x2c, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x4e, 0x22, 0x2c, 0x20, 0x22, - 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, - 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x5c, - 0x6e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, - 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, - 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, - 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x22, 0x69, 0x69, 0x66, 0x65, 0x22, 0x2c, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x6e, 0x20, 0x28, 0x5f, 0x33, 0x39, 0x38, 0x5f, 0x29, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6b, 0x76, + 0x5f, 0x33, 0x66, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x2c, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x28, 0x28, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, + 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, + 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, + 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x73, 0x2c, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, - 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5b, 0x69, - 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x73, - 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x22, 0x2c, 0x20, - 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x5f, 0x32, 0x61, 0x28, 0x61, + 0x31, 0x2c, 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x65, 0x74, + 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x64, 0x6f, 0x22, + 0x5d, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x6c, 0x65, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, 0x6e, 0x61, 0x6d, + 0x65, 0x31, 0x20, 0x76, 0x61, 0x6c, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x4e, 0x20, 0x76, 0x61, 0x6c, 0x4e, 0x5d, 0x22, + 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x49, + 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, + 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x22, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6c, + 0x65, 0x61, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, + 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x33, 0x66, + 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x34, 0x30, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x30, + 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x30, 0x32, + 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x65, 0x76, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, + 0x30, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x76, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, + 0x25, 0x29, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, + 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x7b, 0x22, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x34, 0x30, 0x33, 0x5f, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x74, 0x73, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, - 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, - 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2c, 0x20, 0x69, - 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x69, - 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, - 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, - 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, - 0x62, 0x6f, 0x64, 0x79, 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, + 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, + 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, + 0x2d, 0x20, 0x31, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, + 0x5f, 0x34, 0x30, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, + 0x34, 0x30, 0x35, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x23, 0x61, 0x73, 0x74, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x6f, 0x6f, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, + 0x74, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, + 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, + 0x74, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x28, 0x25, 0x73, 0x29, 0x5b, 0x25, 0x73, 0x5d, 0x20, + 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, + 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, + 0x5d, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x66, 0x6d, 0x74, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x22, 0x5d, 0x5b, 0x22, 0x29, + 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x74, 0x73, + 0x65, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, + 0x20, 0x22, 0x6b, 0x65, 0x79, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x4e, 0x22, 0x2c, 0x20, + 0x22, 0x76, 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6b, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, + 0x5c, 0x6e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, + 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, + 0x61, 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x69, 0x69, 0x66, 0x65, 0x22, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x29, 0x5b, 0x69, 0x5d, 0x20, + 0x3d, 0x20, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, + 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, + 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x20, + 0x23, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x22, 0x5d, 0x28, 0x64, 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, - 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, - 0x5d, 0x2c, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x7b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x28, 0x23, - 0x61, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x32, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, - 0x2c, 0x20, 0x64, 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, - 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x5b, 0x31, 0x5d, + 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, + 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x61, + 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x69, + 0x6c, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, + 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x69, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x28, - 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, + 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x64, 0x6f, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6b, + 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x63, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x31, 0x20, 0x3d, + 0x3d, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x25, 0x20, 0x32, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x28, 0x23, 0x61, + 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x32, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, + 0x20, 0x64, 0x6f, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, 0x28, 0x69, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, - 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, - 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, - 0x20, 0x32, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x65, 0x78, - 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, - 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, - 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x25, - 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x29, 0x0a, 0x20, + 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, + 0x32, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x65, 0x78, 0x74, + 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x28, - 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, - 0x62, 0x6f, 0x64, 0x79, 0x28, 0x23, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, - 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x73, 0x74, 0x72, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x28, + 0x23, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x23, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x3d, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x5b, 0x69, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x73, @@ -4023,403 +3331,377 @@ unsigned char loadfennel_lua[] = { 0x6e, 0x67, 0x28, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x20, - 0x3d, 0x3d, 0x20, 0x23, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, - 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, - 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x66, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x6e, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x76, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, 0x64, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6e, + 0x64, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x76, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, + 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x33, 0x66, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x2c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, + 0x3d, 0x20, 0x23, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x65, 0x6c, 0x73, - 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x5d, 0x29, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, - 0x20, 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x22, - 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x6e, - 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x5d, 0x2e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x65, 0x6c, - 0x73, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x69, 0x69, 0x66, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x69, 0x66, 0x65, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, + 0x72, 0x61, 0x72, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, + 0x73, 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x2c, + 0x20, 0x69, 0x69, 0x66, 0x65, 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x69, 0x69, 0x66, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x69, 0x69, 0x66, 0x65, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, - 0x20, 0x28, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, - 0x61, 0x72, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, 0x25, 0x73, - 0x29, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x2c, 0x20, - 0x69, 0x69, 0x66, 0x65, 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, - 0x28, 0x28, 0x22, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x29, 0x3a, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x2c, 0x20, 0x69, 0x69, 0x66, 0x65, - 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x77, 0x72, 0x61, 0x70, - 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x6f, 0x6e, 0x65, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, - 0x20, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, - 0x20, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, - 0x69, 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x66, 0x5f, 0x32, 0x61, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x63, - 0x6f, 0x6e, 0x64, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, - 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x22, - 0x63, 0x6f, 0x6e, 0x64, 0x4e, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6f, 0x64, - 0x79, 0x4e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, - 0x5c, 0x6e, 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, - 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x77, 0x68, 0x65, 0x72, 0x65, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, - 0x75, 0x74, 0x68, 0x79, 0x2e, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, - 0x72, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x69, 0x6e, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x70, 0x73, - 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x28, 0x23, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x2c, 0x20, 0x28, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, - 0x74, 0x69, 0x6c, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x28, 0x22, 0x69, 0x66, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x22, - 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x75, 0x61, 0x29, 0x29, 0x2c, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, - 0x2e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, - 0x73, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, - 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x2c, 0x20, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x74, - 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, - 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, - 0x72, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, + 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, + 0x72, 0x28, 0x28, 0x22, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x29, + 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x2c, 0x20, 0x69, 0x69, 0x66, + 0x65, 0x61, 0x72, 0x67, 0x73, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x6f, 0x6e, + 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, + 0x22, 0x69, 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x66, 0x5f, 0x32, + 0x61, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x20, 0x7b, 0x22, + 0x63, 0x6f, 0x6e, 0x64, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6f, 0x64, + 0x79, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x4e, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x6f, + 0x64, 0x79, 0x4e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x5c, 0x6e, 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x79, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x72, 0x75, 0x74, 0x68, 0x79, 0x2e, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, + 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x70, + 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x28, + 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2d, 0x20, + 0x31, 0x29, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x2c, 0x20, 0x28, 0x23, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, + 0x31, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, + 0x75, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x31, + 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x28, 0x22, 0x69, 0x66, 0x20, 0x25, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, + 0x6e, 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x75, 0x61, 0x29, 0x29, + 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, + 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x33, + 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, + 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, - 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, - 0x29, 0x29, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, - 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x3d, 0x20, 0x23, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x23, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, + 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, + 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, + 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x29, 0x2c, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x76, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, + 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, + 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x29, 0x5b, 0x72, + 0x61, 0x77, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, - 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, - 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5b, 0x72, 0x61, 0x77, - 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, - 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, 0x72, - 0x61, 0x77, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x72, + 0x28, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x76, + 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x74, 0x65, + 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, - 0x70, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x64, - 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x69, 0x74, 0x65, 0x72, 0x2c, - 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x6d, 0x61, 0x70, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x66, 0x6f, 0x72, - 0x20, 0x25, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x64, 0x6f, - 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x62, - 0x69, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x22, 0x2c, - 0x20, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, - 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x29, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x72, - 0x61, 0x77, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x61, 0x70, 0x70, - 0x6c, 0x79, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x5d, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, - 0x74, 0x69, 0x6c, 0x28, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x70, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x20, 0x25, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x64, 0x6f, 0x22, 0x29, + 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x62, 0x69, 0x6e, + 0x64, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, + 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x72, 0x61, 0x77, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x72, 0x61, 0x77, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x7b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x6e, 0x6f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5d, + 0x28, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, + 0x6c, 0x28, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, - 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, - 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x5b, 0x6b, 0x65, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x28, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x5d, 0x22, - 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, - 0x75, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, - 0x65, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, - 0x5c, 0x6e, 0x4d, 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x20, 0x75, 0x6e, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x61, 0x6e, 0x79, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x31, 0x20, 0x3d, - 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, + 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x65, 0x61, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, + 0x6b, 0x65, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x28, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x5d, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x75, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, + 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x5c, 0x6e, + 0x4d, 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, + 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2c, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, + 0x79, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x31, 0x20, 0x3d, 0x20, 0x23, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x32, 0x20, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, @@ -4433,631 +3715,661 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x20, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x73, 0x75, 0x62, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x28, 0x22, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x29, - 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, - 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, - 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, - 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, - 0x4c, 0x53, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x54, 0x68, 0x65, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x20, 0x77, 0x68, 0x69, - 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x2e, 0x20, 0x45, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x6e, - 0x2d, 0x74, 0x72, 0x75, 0x74, 0x68, 0x79, 0x2e, 0x22, 0x2c, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, - 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, - 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, 0x20, 0x28, 0x22, - 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, - 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, - 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x28, 0x22, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x25, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x28, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, + 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, + 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x69, 0x63, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x6c, 0x6f, 0x6f, 0x70, 0x2e, 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x74, 0x72, + 0x75, 0x74, 0x68, 0x79, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x5f, 0x32, + 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, + 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, + 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, + 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x28, 0x23, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x3c, - 0x3d, 0x20, 0x33, 0x29, 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x5b, 0x34, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, - 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x23, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x2c, 0x20, 0x33, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, - 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, - 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x20, 0x25, - 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x3a, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, - 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x7b, 0x7d, - 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, - 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, 0x74, - 0x69, 0x6c, 0x28, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x33, + 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x23, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x33, + 0x29, 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x2c, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x5b, 0x34, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, + 0x6e, 0x28, 0x23, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x33, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x28, 0x22, 0x66, 0x6f, 0x72, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, + 0x73, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x22, 0x5d, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x73, 0x75, 0x62, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x61, 0x72, 0x67, + 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x28, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x5f, 0x64, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x75, - 0x62, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, - 0x66, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x5f, - 0x32, 0x61, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x65, 0x70, - 0x3f, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6c, 0x6f, - 0x6f, 0x70, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x2e, 0x5c, 0x6e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, - 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x70, - 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x29, - 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, - 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x32, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x76, 0x61, 0x72, - 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x22, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x25, 0x73, 0x28, - 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x25, - 0x73, 0x3a, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, - 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x5b, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x73, 0x74, + 0x6f, 0x70, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3f, 0x5d, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x5c, 0x6e, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x65, 0x74, + 0x77, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x28, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x29, 0x2e, 0x22, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x31, 0x38, 0x5f, + 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x34, 0x31, 0x38, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x31, 0x38, 0x5f, 0x5b, 0x32, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x31, 0x38, + 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x76, 0x61, + 0x72, 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x22, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x25, 0x73, + 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x22, + 0x25, 0x73, 0x3a, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, + 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, + 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x6e, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x29, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, + 0x67, 0x73, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, + 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, + 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, - 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x6e, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x33, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, - 0x73, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, - 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x28, 0x25, 0x73, - 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x30, 0x2c, 0x20, 0x22, 0x2c, 0x20, - 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, - 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, - 0x3d, 0x20, 0x22, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, - 0x5b, 0x6d, 0x5d, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x25, - 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, - 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x63, 0x61, 0x6c, - 0x6c, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, - 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, - 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, - 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x32, - 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x34, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, - 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x31, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, - 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x30, 0x2c, 0x20, + 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, - 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x3a, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x3a, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, - 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, - 0x2c, 0x20, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x64, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x5c, 0x6e, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x65, - 0x73, 0x6e, 0x27, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x62, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x74, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x69, 0x6d, - 0x65, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x2c, - 0x20, 0x75, 0x73, 0x65, 0x5c, 0x6e, 0x28, 0x74, 0x62, 0x6c, 0x3a, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, - 0x2e, 0x2e, 0x29, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, - 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, - 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, + 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x22, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6d, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x67, 0x74, 0x5b, 0x6d, 0x5d, 0x28, 0x74, 0x67, 0x74, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, + 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, - 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x6f, - 0x6e, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x28, 0x22, 0x2d, 0x2d, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x28, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x29, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, - 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x66, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x28, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x2c, - 0x20, 0x6d, 0x61, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, - 0x61, 0x5b, 0x28, 0x22, 0x24, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x29, - 0x5d, 0x2e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x30, 0x20, 0x3d, - 0x20, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x30, 0x20, 0x3d, - 0x20, 0x6d, 0x61, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, - 0x20, 0x39, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, - 0x73, 0x68, 0x66, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, - 0x64, 0x28, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x28, - 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6d, 0x61, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, - 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, - 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, - 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, - 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x22, - 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, - 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x31, 0x2c, 0x20, 0x39, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, - 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x22, 0x5d, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, - 0x28, 0x28, 0x22, 0x24, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x29, 0x29, - 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, - 0x61, 0x6c, 0x6b, 0x65, 0x72, 0x28, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x6e, - 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x24, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5b, - 0x69, 0x64, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x76, 0x61, 0x72, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, - 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, + 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, 0x20, + 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x32, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x34, 0x32, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x34, 0x32, 0x30, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x20, 0x23, 0x61, 0x73, + 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x5f, 0x20, + 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x34, 0x32, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x61, 0x6c, 0x6b, 0x2d, 0x74, 0x72, 0x65, - 0x65, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, - 0x77, 0x61, 0x6c, 0x6b, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, - 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, - 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x73, 0x68, - 0x66, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, - 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x31, 0x2c, 0x20, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, - 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x2c, 0x20, 0x22, 0x24, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x24, 0x2e, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x20, - 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, - 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x76, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x73, - 0x74, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x73, 0x74, - 0x72, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, - 0x72, 0x65, 0x66, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, - 0x72, 0x67, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, - 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, - 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x29, + 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x31, 0x5f, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x61, + 0x73, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, + 0x79, 0x6d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x6f, 0x6e, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, + 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x22, 0x3a, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x3a, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x2c, 0x20, + 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x62, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x2e, 0x5c, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x2c, 0x20, 0x75, 0x73, + 0x65, 0x5c, 0x6e, 0x28, 0x74, 0x62, 0x6c, 0x3a, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, + 0x6c, 0x73, 0x2c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, + 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, + 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, + 0x22, 0x2d, 0x2d, 0x5b, 0x5b, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x20, 0x5d, 0x5d, 0x2d, 0x2d, 0x22, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, + 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x7b, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, + 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, 0x66, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6d, + 0x61, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, + 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x28, 0x22, 0x24, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x69, 0x29, 0x5d, 0x2e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x78, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x69, 0x20, 0x3c, 0x20, 0x39, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x5f, 0x6d, 0x61, 0x78, + 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, + 0x6d, 0x61, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x68, 0x61, + 0x73, 0x68, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x32, 0x36, 0x5f, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, + 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x34, 0x32, 0x36, + 0x5f, 0x29, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x34, 0x32, 0x36, 0x5f, 0x5b, 0x22, 0x68, 0x61, + 0x73, 0x68, 0x66, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x32, 0x36, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x73, 0x79, 0x6d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x28, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x7b, 0x7d, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x39, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, + 0x5d, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, + 0x28, 0x22, 0x24, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x29, 0x29, 0x2c, + 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, + 0x6c, 0x6b, 0x65, 0x72, 0x28, 0x69, 0x64, 0x78, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x24, + 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, 0x64, 0x78, 0x5d, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, + 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, + 0x72, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x77, 0x61, 0x6c, 0x6b, 0x2d, 0x74, 0x72, 0x65, 0x65, 0x22, 0x5d, 0x28, + 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x77, 0x61, 0x6c, 0x6b, + 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x5f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, 0x66, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x28, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x3d, + 0x20, 0x30, 0x29, 0x2c, 0x20, 0x22, 0x24, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x24, 0x2e, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, + 0x66, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x72, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x66, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x76, + 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x73, 0x74, 0x72, + 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x73, 0x74, 0x72, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x22, 0x2c, + 0x20, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x75, + 0x73, 0x65, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x28, + 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x68, 0x61, 0x73, - 0x68, 0x66, 0x6e, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, - 0x7d, 0x2c, 0x20, 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x68, 0x61, 0x6e, 0x64, 0x3b, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, - 0x24, 0x2e, 0x2e, 0x2e, 0x20, 0x4f, 0x52, 0x20, 0x24, 0x31, 0x2c, 0x20, - 0x24, 0x32, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, - 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, - 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x31, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, - 0x69, 0x74, 0x79, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, - 0x20, 0x30, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x7a, 0x65, 0x72, 0x6f, - 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, - 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x65, 0x6e, + 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x22, + 0x2c, 0x20, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x68, 0x61, + 0x6e, 0x64, 0x3b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x24, 0x2e, 0x2e, 0x2e, + 0x20, 0x4f, 0x52, 0x20, 0x24, 0x31, 0x2c, 0x20, 0x24, 0x32, 0x2c, 0x20, + 0x65, 0x74, 0x63, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, + 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, + 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, + 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, + 0x5f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x20, - 0x3d, 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, - 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, - 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x23, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, - 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, + 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x6e, 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x75, 0x62, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x33, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x23, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, 0x33, 0x31, 0x5f, 0x20, 0x3d, + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, + 0x33, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x33, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x7a, + 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x5f, 0x34, + 0x33, 0x32, 0x5f, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, + 0x20, 0x30, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x33, 0x33, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x34, 0x33, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, + 0x78, 0x70, 0x72, 0x28, 0x5f, 0x34, 0x33, 0x33, 0x5f, 0x2c, 0x20, 0x22, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x34, + 0x33, 0x31, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x70, - 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x20, 0x2e, 0x2e, 0x20, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x20, - 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x70, - 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, - 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, - 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6c, 0x75, 0x61, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x28, 0x6c, 0x75, 0x61, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, - 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, - 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x31, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, + 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, + 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x5f, + 0x33, 0x66, 0x6c, 0x75, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, + 0x33, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x34, 0x33, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x6c, + 0x75, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x33, 0x37, 0x5f, 0x20, 0x3d, + 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x34, 0x33, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x61, 0x72, + 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x34, 0x30, 0x5f, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x5f, 0x34, 0x33, 0x36, 0x5f, 0x2c, 0x20, 0x5f, 0x34, + 0x33, 0x37, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x33, 0x38, 0x5f, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x33, + 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x34, 0x30, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x33, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, @@ -5102,31 +4414,21 @@ unsigned char loadfennel_lua[] = { 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, - 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x61, 0x6e, 0x64, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x69, + 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, + 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, - 0x5b, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x61, 0x6e, - 0x64, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, - 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x61, - 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, - 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, - 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, + 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, @@ -5134,187 +4436,198 @@ unsigned char loadfennel_lua[] = { 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, - 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, - 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, - 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, - 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, - 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x30, 0x20, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6e, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x28, 0x22, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, - 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x3d, 0x20, - 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, 0x62, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, - 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, + 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6f, 0x72, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, - 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, - 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, - 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x6c, 0x69, - 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, - 0x64, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, + 0x30, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, + 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x34, 0x34, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, + 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, - 0x64, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, - 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, - 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x6e, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x30, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x69, - 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, - 0x2c, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, - 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, - 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x3c, - 0x3c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, - 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, 0x22, - 0x3e, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, - 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x26, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x34, 0x31, 0x5f, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x5f, 0x34, 0x34, 0x31, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, + 0x61, 0x70, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, + 0x64, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x42, + 0x69, 0x74, 0x4c, 0x69, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, + 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x2e, 0x2e, 0x20, 0x70, + 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x6e, 0x64, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x73, + 0x65, 0x42, 0x69, 0x74, 0x4c, 0x69, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x22, 0x2c, + 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, + 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2c, + 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x2c, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x35, + 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, + 0x34, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x34, 0x34, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x34, 0x34, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x7a, 0x65, + 0x72, 0x6f, 0x5f, 0x61, 0x72, 0x69, 0x74, 0x79, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x35, + 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x5f, 0x34, 0x34, 0x37, 0x5f, + 0x2c, 0x20, 0x5f, 0x34, 0x34, 0x38, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x34, + 0x39, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x35, 0x30, 0x5f, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x35, 0x31, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x32, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, 0x2c, + 0x20, 0x22, 0x3c, 0x3c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x22, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x31, 0x22, + 0x2c, 0x20, 0x22, 0x3e, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x61, 0x6e, 0x64, + 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, + 0x20, 0x22, 0x26, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6f, 0x72, 0x22, 0x2c, 0x20, + 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x62, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, - 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7c, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x69, 0x74, - 0x6f, 0x70, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, - 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, - 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, - 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, - 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, - 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x73, 0x68, 0x69, 0x66, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x20, - 0x62, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, - 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, - 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, - 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x22, - 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x69, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, 0x68, - 0x69, 0x66, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, 0x62, 0x79, 0x20, - 0x6e, 0x20, 0x62, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, - 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, - 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, - 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, - 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, + 0x6c, 0x28, 0x22, 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x30, + 0x22, 0x2c, 0x20, 0x22, 0x30, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x62, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x7b, - 0x22, 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, - 0x77, 0x69, 0x73, 0x65, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x6f, 0x66, 0x20, - 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, - 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, - 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, - 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6f, 0x72, - 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, - 0x32, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x4f, 0x52, 0x20, + 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, 0x2c, + 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f, + 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, 0x62, 0x79, + 0x20, 0x6e, 0x20, 0x62, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, + 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, + 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, + 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, + 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x22, 0x7d, + 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6c, + 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x78, 0x20, + 0x62, 0x79, 0x20, 0x6e, 0x20, 0x62, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, + 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, + 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, + 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, + 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x61, 0x6e, 0x64, 0x22, + 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, 0x32, + 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, @@ -5324,633 +4637,646 @@ unsigned char loadfennel_lua[] = { 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, - 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x31, 0x22, - 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, - 0x20, 0x58, 0x4f, 0x52, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, - 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, - 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, - 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, - 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2e, 0x2e, 0x22, 0x2c, 0x20, 0x7b, 0x22, - 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, - 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, - 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, - 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, - 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x68, 0x73, - 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x32, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x72, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, - 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x6c, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x62, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x31, 0x22, 0x2c, + 0x20, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, + 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, + 0x4f, 0x52, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, + 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, + 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, + 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, + 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x62, 0x78, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x7b, 0x22, + 0x78, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x78, 0x32, 0x22, 0x2c, 0x20, 0x22, + 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x42, 0x69, 0x74, 0x77, + 0x69, 0x73, 0x65, 0x20, 0x58, 0x4f, 0x52, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x5c, + 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, + 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, + 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, + 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x2e, 0x2e, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, + 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x5f, + 0x34, 0x35, 0x33, 0x5f, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, + 0x34, 0x35, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x35, 0x33, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x34, 0x35, 0x34, 0x5f, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x34, 0x35, 0x34, 0x5f, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, + 0x67, 0x5f, 0x34, 0x35, 0x34, 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, + 0x5f, 0x34, 0x35, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x28, 0x6c, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, + 0x35, 0x35, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x35, + 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x72, + 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, + 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x68, 0x73, + 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x35, 0x36, 0x5f, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, + 0x20, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x68, 0x73, 0x29, 0x2c, 0x20, 0x6f, 0x70, + 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, + 0x68, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, + 0x76, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, + 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, 0x25, 0x73, 0x20, 0x22, 0x2c, + 0x20, 0x28, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, + 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, + 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x5b, 0x31, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, - 0x72, 0x68, 0x73, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x68, - 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x23, 0x61, 0x72, + 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x29, 0x22, - 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, - 0x68, 0x73, 0x29, 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x68, 0x73, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, - 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x20, 0x25, 0x73, 0x20, 0x22, 0x2c, 0x20, 0x28, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x61, 0x6e, - 0x64, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, - 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, 0x31, 0x5d, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, - 0x20, 0x28, 0x23, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x2d, - 0x20, 0x31, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, - 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, - 0x20, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, - 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, 0x61, - 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x22, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x25, 0x73, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x25, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x29, - 0x22, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, - 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, - 0x20, 0x22, 0x2c, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, - 0x22, 0x2c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, + 0x74, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x25, 0x73, 0x29, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, + 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, + 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x29, 0x2c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6c, + 0x75, 0x61, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, + 0x6c, 0x75, 0x61, 0x5f, 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x28, 0x32, 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, + 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, 0x6f, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x23, + 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, + 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, + 0x6f, 0x70, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, + 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, + 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x62, + 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3c, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3e, 0x3d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x3c, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x28, 0x22, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x3d, 0x3d, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x3d, 0x22, 0x2c, 0x20, + 0x22, 0x7e, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x75, 0x61, 0x5f, - 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x66, - 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x32, - 0x20, 0x3c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x6c, - 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x33, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, - 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x6f, 0x70, 0x2c, 0x20, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x72, 0x65, 0x61, + 0x6c, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x70, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, + 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, + 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x66, + 0x72, 0x65, 0x61, 0x6c, 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6f, 0x70, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x22, 0x61, - 0x22, 0x2c, 0x20, 0x22, 0x62, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, 0x75, 0x61, 0x20, - 0x62, 0x75, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, - 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x28, 0x22, 0x3c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, - 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3e, - 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3c, 0x3d, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x3d, 0x22, 0x2c, 0x20, 0x22, - 0x3d, 0x3d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, + 0x6e, 0x6f, 0x74, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, - 0x74, 0x3d, 0x22, 0x2c, 0x20, 0x22, 0x7e, 0x3d, 0x22, 0x2c, 0x20, 0x22, - 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, - 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x6f, 0x70, 0x2c, 0x20, 0x72, - 0x65, 0x61, 0x6c, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, + 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, + 0x4c, 0x75, 0x61, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, 0x6f, 0x74, 0x22, + 0x2c, 0x20, 0x22, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, + 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, + 0x22, 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6e, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, + 0x20, 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, + 0x4a, 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, + 0x69, 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, + 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x23, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x29, 0x5b, + 0x22, 0x7e, 0x3d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6e, 0x6f, 0x74, 0x3d, 0x22, 0x5d, + 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, + 0x22, 0x23, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x20, + 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, + 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x6f, 0x2d, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, + 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, + 0x7d, 0x2c, 0x20, 0x22, 0x51, 0x75, 0x61, 0x73, 0x69, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x20, 0x4f, + 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x61, 0x66, 0x65, + 0x5f, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, + 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x28, 0x6d, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x22, + 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, + 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x21, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x74, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x6e, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x63, 0x6f, 0x70, 0x79, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x2c, + 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x29, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x2c, 0x20, 0x62, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, + 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x62, 0x69, 0x74, 0x22, + 0x29, 0x2c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, + 0x5f, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, + 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, + 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x72, 0x61, + 0x77, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, + 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x65, + 0x71, 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x2c, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, + 0x4e, 0x20, 0x3d, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x74, + 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, + 0x65, 0x74, 0x5f, 0x34, 0x35, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x65, + 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x34, 0x35, 0x39, 0x5f, 0x5b, 0x22, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, + 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x65, 0x64, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, + 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, + 0x6e, 0x65, 0x64, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x2c, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, - 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x69, 0x6c, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, - 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x72, - 0x65, 0x61, 0x6c, 0x6f, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x29, - 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x74, 0x61, 0x69, 0x6c, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x6f, 0x70, 0x5d, 0x20, - 0x3d, 0x20, 0x6f, 0x70, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6e, - 0x6f, 0x74, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6e, 0x6f, 0x74, - 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, - 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x3b, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x4c, - 0x75, 0x61, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x69, - 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, 0x6f, 0x74, 0x22, 0x2c, - 0x20, 0x22, 0x7e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x62, 0x6e, 0x6f, - 0x74, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, - 0x42, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6e, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x75, 0x61, 0x20, - 0x35, 0x2e, 0x33, 0x2b, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x75, 0x61, 0x4a, - 0x49, 0x54, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x62, 0x69, 0x74, 0x2d, 0x6c, 0x69, - 0x62, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x6e, 0x61, 0x72, 0x79, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x23, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x28, 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x20, - 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x22, 0x7e, 0x3d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x6e, 0x6f, 0x74, 0x3d, - 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x5b, 0x22, 0x23, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, - 0x71, 0x75, 0x6f, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, - 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, - 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x64, 0x6f, 0x2d, 0x71, 0x75, 0x6f, - 0x74, 0x65, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x71, 0x75, - 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x78, 0x22, 0x7d, 0x2c, - 0x20, 0x22, 0x51, 0x75, 0x61, 0x73, 0x69, 0x71, 0x75, 0x6f, 0x74, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, - 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, - 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, - 0x33, 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x47, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x76, - 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x7b, 0x22, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, 0x20, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, - 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x22, 0x2c, 0x20, 0x22, 0x49, 0x6e, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, - 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x22, 0x2c, 0x20, - 0x22, 0x2d, 0x2d, 0x6e, 0x6f, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x20, 0x66, - 0x6c, 0x61, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, - 0x6e, 0x67, 0x20, 0x61, 0x20, 0x3a, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x45, 0x6e, 0x76, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x5c, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, 0x72, 0x6e, - 0x28, 0x5f, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, - 0x47, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x76, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, - 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, - 0x5f, 0x33, 0x66, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, - 0x33, 0x66, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, - 0x65, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, - 0x72, 0x72, 0x29, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x75, 0x73, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x22, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x67, 0x65, - 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, - 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x6d, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x22, 0x22, 0x29, 0x29, - 0x2c, 0x20, 0x22, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x21, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x74, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, - 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, - 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, 0x33, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, - 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, - 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, - 0x20, 0x62, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, - 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x62, 0x69, 0x74, 0x22, 0x29, - 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, - 0x5f, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2c, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, - 0x79, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x29, 0x2c, 0x20, 0x6e, 0x65, 0x78, - 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, - 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x65, 0x71, - 0x75, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x65, 0x71, 0x75, - 0x61, 0x6c, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x72, 0x61, 0x77, - 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, - 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, - 0x22, 0x29, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, - 0x70, 0x79, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x78, 0x70, - 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, - 0x6c, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, - 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, - 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x5b, - 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, - 0x76, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x65, - 0x6e, 0x76, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, - 0x64, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x63, 0x6f, - 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, 0x33, 0x66, 0x29, 0x0a, + 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, - 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x30, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x45, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x45, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x34, 0x36, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x5f, + 0x33, 0x66, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x5f, 0x34, 0x36, 0x31, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, - 0x6e, 0x76, 0x22, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, - 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x28, 0x5f, 0x34, 0x36, 0x31, 0x5f, 0x29, 0x5b, 0x22, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x34, + 0x36, 0x31, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, 0x34, 0x36, 0x31, 0x5f, 0x29, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x20, 0x3d, 0x20, + 0x28, 0x5f, 0x34, 0x36, 0x31, 0x5f, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, + 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x5f, 0x34, 0x36, 0x31, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, 0x34, + 0x36, 0x31, 0x5f, 0x29, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x34, + 0x36, 0x31, 0x5f, 0x29, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, + 0x36, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x22, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x5f, - 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x28, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6f, 0x72, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x5f, 0x28, 0x66, 0x6f, - 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, - 0x20, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, - 0x61, 0x6e, 0x64, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x63, 0x6f, + 0x20, 0x5f, 0x34, 0x36, 0x33, 0x5f, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x28, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x34, 0x36, 0x34, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, + 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, + 0x36, 0x35, 0x5f, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, - 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x65, 0x74, 0x2d, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x32, - 0x5f, 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x2c, 0x20, - 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, - 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2c, - 0x20, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, - 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x22, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x36, 0x36, + 0x5f, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x41, 0x53, 0x54, + 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x43, 0x48, 0x55, + 0x4e, 0x4b, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x5f, 0x49, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, + 0x52, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5f, 0x53, + 0x43, 0x4f, 0x50, 0x45, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x5f, + 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x28, 0x29, 0x2c, 0x20, 0x5b, + 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2c, + 0x20, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x2c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, + 0x65, 0x77, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, - 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, - 0x5d, 0x2c, 0x20, 0x5f, 0x41, 0x53, 0x54, 0x20, 0x3d, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x20, 0x3d, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x49, 0x53, 0x5f, - 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x20, - 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, - 0x47, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, - 0x72, 0x67, 0x28, 0x29, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, - 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, - 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x2c, 0x20, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, - 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x76, - 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x5f, 0x47, 0x20, 0x3d, - 0x20, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x7b, 0x5f, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, - 0x5f, 0x6d, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x66, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, + 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, + 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, + 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, + 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, + 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, + 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, + 0x6d, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x33, 0x5f, 0x2c, 0x20, 0x5b, + 0x22, 0x67, 0x65, 0x74, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x34, 0x5f, 0x2c, 0x20, 0x5b, 0x22, + 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x35, 0x5f, 0x2c, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, + 0x34, 0x36, 0x36, 0x5f, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x76, 0x2e, 0x5f, 0x47, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x76, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, + 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, + 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x74, 0x5f, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x36, 0x38, 0x5f, 0x28, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x63, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2c, 0x20, 0x22, 0x28, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, - 0x72, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, - 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, - 0x3d, 0x20, 0x28, 0x63, 0x66, 0x67, 0x28, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x22, 0x2f, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x63, 0x66, 0x67, 0x28, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x63, - 0x66, 0x67, 0x28, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6b, 0x67, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x64, - 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, - 0x65, 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2c, - 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x70, - 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x73, - 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, - 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, - 0x77, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x25, 0x31, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x28, 0x5b, + 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x29, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, + 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x34, 0x36, + 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x36, 0x38, 0x5f, 0x28, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x34, 0x36, 0x37, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x34, 0x36, 0x37, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x34, + 0x36, 0x37, 0x5f, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, + 0x3d, 0x20, 0x28, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x2f, 0x22, 0x29, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x28, + 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x3f, 0x22, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x73, + 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x73, 0x74, 0x72, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5d, 0x22, + 0x2c, 0x20, 0x22, 0x25, 0x25, 0x25, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, + 0x33, 0x66, 0x70, 0x61, 0x74, 0x68, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x65, 0x73, 0x63, 0x20, 0x3d, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, @@ -5968,283 +5294,457 @@ unsigned char loadfennel_lua[] = { 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x70, 0x61, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x61, 0x74, 0x68, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x70, 0x61, 0x74, 0x68, - 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x73, 0x65, 0x70, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x79, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x66, 0x70, 0x61, + 0x74, 0x68, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x70, + 0x61, 0x74, 0x68, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x6b, 0x67, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x72, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x65, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, 0x6b, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x5f, 0x64, 0x6f, + 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, 0x61, 0x74, 0x28, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x5f, 0x64, 0x6f, 0x74, 0x5f, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, - 0x67, 0x73, 0x75, 0x62, 0x28, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x70, - 0x61, 0x74, 0x28, 0x70, 0x6b, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x29, 0x2c, - 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6f, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, - 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6b, 0x29, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x37, 0x30, 0x5f, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x34, 0x37, 0x30, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x30, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6c, - 0x6c, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, - 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, - 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x70, - 0x61, 0x74, 0x68, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6e, 0x64, - 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x28, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x20, 0x2b, 0x20, 0x23, 0x70, 0x61, 0x74, 0x68, 0x20, - 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x28, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x72, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x6c, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, + 0x37, 0x32, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x32, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x66, + 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, + 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2b, 0x20, 0x23, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, + 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x72, 0x28, 0x5f, 0x33, 0x66, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x37, + 0x34, 0x5f, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x5f, 0x33, 0x66, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x37, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x5f, 0x33, 0x5f, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x35, 0x5f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x35, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x34, 0x37, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, + 0x37, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x34, 0x37, 0x39, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x28, + 0x5f, 0x34, 0x37, 0x36, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x37, 0x37, 0x5f, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x37, 0x38, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x37, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x34, 0x37, 0x38, 0x5f, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x34, 0x37, 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x65, 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x5f, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x34, + 0x38, 0x31, 0x5f, 0x29, 0x5b, 0x22, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x31, + 0x5f, 0x5b, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x41, 0x73, + 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x34, 0x38, 0x31, 0x5f, 0x5b, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x28, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, - 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2c, 0x20, 0x6b, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x38, 0x32, 0x5f, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x5d, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x34, 0x38, 0x32, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, + 0x38, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x38, + 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x38, 0x34, 0x5f, 0x20, 0x3d, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x38, 0x36, 0x5f, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x28, 0x5f, 0x34, 0x38, 0x33, 0x5f, 0x2c, 0x20, 0x5f, 0x34, 0x38, + 0x34, 0x5f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x34, 0x38, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x34, 0x38, 0x35, 0x5f, 0x2c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x5b, 0x22, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x22, 0x5d, 0x2e, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x65, 0x6e, 0x76, - 0x20, 0x3d, 0x20, 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, - 0x52, 0x22, 0x7d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x5f, - 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x20, 0x5f, 0x34, 0x38, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x5f, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x38, 0x38, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, + 0x73, 0x5f, 0x38, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x28, 0x6f, 0x6b, 0x5f, + 0x39, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, + 0x5f, 0x39, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x2c, 0x20, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, - 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, 0x2e, - 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x2c, 0x20, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x34, 0x39, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x78, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x28, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, - 0x62, 0x75, 0x67, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, - 0x63, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, - 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x29, 0x2c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6c, 0x75, 0x61, 0x5f, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, - 0x5b, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x31, - 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x33, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x38, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x28, + 0x5f, 0x47, 0x2e, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x5f, 0x34, + 0x39, 0x30, 0x5f, 0x2c, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x29, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, + 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x28, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, - 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, 0x6d, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x34, 0x39, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, + 0x5b, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x32, 0x5f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, + 0x34, 0x39, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x39, 0x33, 0x5f, 0x2c, 0x20, + 0x5f, 0x34, 0x39, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x6d, 0x6f, + 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x34, 0x39, 0x33, 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x34, + 0x39, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x34, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, + 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x33, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x6e, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x39, 0x38, 0x5f, + 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x34, 0x39, 0x39, 0x5f, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x29, + 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, - 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2e, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, - 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, + 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x34, 0x39, 0x39, 0x5f, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x39, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x29, 0x5b, 0x6b, 0x5d, + 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x5f, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x5f, + 0x35, 0x30, 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x35, 0x30, 0x31, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x30, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x35, + 0x30, 0x31, 0x5f, 0x5b, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x35, 0x30, 0x31, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x6d, + 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x27, 0x5d, + 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, + 0x33, 0x66, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x45, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x28, 0x5f, + 0x33, 0x66, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x2c, + 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x72, 0x65, 0x61, 0x6c, 0x5f, + 0x61, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6d, @@ -6254,163 +5754,29 @@ unsigned char loadfennel_lua[] = { 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x29, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, - 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, - 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, - 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, - 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, - 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, - 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x29, 0x2c, - 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, - 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x32, 0x61, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, - 0x62, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x28, 0x61, 0x73, 0x74, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x32, - 0x5d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, - 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, - 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, - 0x2c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, - 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, - 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, - 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, - 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, - 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, - 0x20, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x6f, - 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, - 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x5f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, - 0x70, 0x72, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x22, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, - 0x20, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x6f, - 0x72, 0x20, 0x61, 0x73, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, - 0x31, 0x5d, 0x29, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, - 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, - 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, - 0x2c, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x22, 0x29, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, - 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6d, 0x6f, 0x64, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, - 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, - 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x5b, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, @@ -6455,390 +5821,427 @@ unsigned char loadfennel_lua[] = { 0x61, 0x6c, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x76, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x28, 0x73, 0x72, - 0x63, 0x29, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x6f, 0x72, 0x6d, - 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x66, 0x6f, 0x72, 0x6d, - 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x66, - 0x6f, 0x72, 0x6d, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, - 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x70, 0x72, - 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, - 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x66, 0x6f, 0x72, - 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x70, - 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x66, - 0x6e, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, - 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, - 0x74, 0x68, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x75, 0x64, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x28, 0x73, 0x72, 0x63, 0x29, 0x2c, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, + 0x20, 0x23, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, + 0x62, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x74, 0x61, 0x69, + 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, 0x5f, 0x28, 0x6f, 0x6b, 0x5f, 0x30, - 0x5f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6f, 0x6b, 0x5f, 0x30, 0x5f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, - 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3a, 0x72, - 0x65, 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x3a, - 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5c, 0x31, 0x33, 0x5c, 0x6e, - 0x5d, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x30, - 0x5f, 0x28, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x5f, 0x32, 0x5f, - 0x2c, 0x20, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, 0x2e, 0x74, - 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x22, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x5c, 0x22, 0x22, 0x20, - 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, - 0x22, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x28, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x25, 0x71, 0x5d, 0x22, - 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x6f, 0x64, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x20, - 0x3d, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6f, 0x72, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, - 0x2e, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x73, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, - 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, - 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x22, 0x65, 0x6e, - 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, - 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x65, 0x6d, 0x70, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, - 0x69, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, - 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, - 0x72, 0x63, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, - 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, - 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, - 0x70, 0x72, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x3d, + 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, + 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x33, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x22, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, - 0x61, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, - 0x20, 0x32, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, - 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x6d, 0x6f, - 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x3a, 0x62, 0x79, - 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, - 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, - 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x28, 0x29, 0x0a, + 0x67, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x72, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x6c, 0x64, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, - 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, + 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, + 0x73, 0x5f, 0x38, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x28, 0x6f, 0x6b, 0x5f, + 0x39, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x5f, 0x39, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, - 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, 0x22, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, - 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x29, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x2e, 0x2e, 0x2e, 0x2c, 0x20, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x30, + 0x37, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x3a, 0x72, 0x65, + 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5c, 0x31, 0x33, 0x5c, 0x6e, 0x5d, + 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, - 0x5d, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, - 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x20, 0x2d, 0x2d, 0x5b, 0x5b, 0x53, - 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, - 0x44, 0x45, 0x5d, 0x5d, 0x2d, 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, - 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, - 0x70, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, - 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x6f, 0x72, - 0x20, 0x5f, 0x33, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x22, 0x7d, 0x2c, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, - 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, - 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6d, - 0x62, 0x65, 0x64, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x5c, 0x6e, 0x4c, 0x75, 0x61, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x63, 0x6f, 0x70, 0x79, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, - 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x28, 0x65, - 0x6e, 0x76, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, - 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, - 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, - 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x2c, 0x20, - 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, - 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x28, 0x65, 0x76, - 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x7b, 0x3a, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x31, 0x20, 0x28, 0x66, - 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x20, 0x2e, 0x2e, 0x2e, 0x29, - 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x4e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x4e, 0x7d, 0x22, 0x7d, 0x2c, 0x20, - 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, 0x65, 0x76, 0x61, - 0x6c, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, - 0x22, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x65, 0x76, - 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5f, 0x38, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x28, 0x5f, 0x47, 0x2e, 0x78, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x28, 0x5f, 0x35, 0x30, 0x37, 0x5f, 0x2c, 0x20, 0x28, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x6f, 0x72, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x62, 0x61, 0x63, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, + 0x6f, 0x64, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x29, 0x22, 0x29, + 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x22, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x25, 0x71, 0x5d, 0x22, 0x29, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x6f, 0x64, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x3d, + 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, + 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, + 0x65, 0x6d, 0x69, 0x74, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, + 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x28, 0x73, + 0x72, 0x63, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x72, + 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, + 0x64, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x2c, 0x20, + 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, + 0x5b, 0x6d, 0x6f, 0x64, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x6e, + 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2c, + 0x20, 0x22, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, + 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, + 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, + 0x70, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, + 0x31, 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x35, 0x31, 0x31, 0x5f, 0x20, 0x3d, + 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x35, 0x31, 0x30, 0x5f, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x31, 0x31, + 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x31, + 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, + 0x71, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x31, 0x30, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, + 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x3a, + 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x34, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x28, 0x22, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, + 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x35, 0x31, 0x35, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, + 0x31, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x31, 0x34, + 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x5f, 0x35, 0x31, 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, + 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, + 0x35, 0x31, 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, + 0x64, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, + 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, + 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, + 0x64, 0x65, 0x78, 0x70, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x2c, 0x20, 0x28, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6d, 0x6f, 0x64, 0x2c, + 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x6b, 0x69, + 0x70, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, + 0x20, 0x2d, 0x2d, 0x5b, 0x5b, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, + 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5d, 0x5d, 0x2d, 0x2d, + 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x66, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x6f, 0x64, 0x2c, + 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x78, 0x70, 0x72, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x5b, 0x6d, + 0x6f, 0x64, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x35, 0x31, 0x35, 0x5f, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x6c, + 0x64, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x2c, + 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, + 0x6d, 0x65, 0x2d, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x7d, + 0x2c, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x4c, + 0x75, 0x61, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, + 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, + 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, + 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, + 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x2c, 0x20, 0x77, 0x72, 0x61, + 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x41, 0x4c, 0x53, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x28, 0x23, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x32, + 0x29, 0x2c, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x28, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x63, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x22, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x22, 0x7b, 0x3a, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x31, + 0x20, 0x28, 0x66, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x3a, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2d, 0x4e, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x4e, 0x7d, 0x22, + 0x7d, 0x2c, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x5b, 0x22, + 0x65, 0x76, 0x61, 0x6c, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, + 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5b, + 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x61, 0x73, 0x74, 0x29, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x63, @@ -6852,32 +6255,32 @@ unsigned char loadfennel_lua[] = { 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x69, 0x66, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, - 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, - 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2c, 0x20, - 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x73, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x5b, 0x22, - 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x5b, 0x22, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x77, 0x72, - 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, - 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x64, 0x6f, 0x63, - 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x7d, 0x0a, 0x65, + 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x64, + 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x5f, 0x32, 0x61, 0x2c, + 0x20, 0x5b, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x73, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, + 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x5b, + 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x5b, 0x22, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, @@ -6903,706 +6306,709 @@ unsigned char loadfennel_lua[] = { 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, - 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, - 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, - 0x20, 0x28, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x64, - 0x65, 0x70, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, - 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x61, - 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, - 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x30, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, - 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, - 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, - 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, - 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, - 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, - 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x5f, 0x33, 0x66, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x32, 0x30, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, + 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, 0x2e, 0x72, 0x65, 0x66, 0x65, - 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, 0x2c, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, - 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x29, 0x7d, 0x29, + 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x7d, + 0x29, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x30, - 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x7d, 0x29, 0x2c, - 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x75, + 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, + 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, + 0x7d, 0x29, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x29, 0x7d, 0x29, 0x2c, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x30, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x61, - 0x72, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x30, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x7d, 0x0a, 0x20, + 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x73, 0x29, 0x7d, 0x29, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, + 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x61, + 0x72, 0x61, 0x72, 0x67, 0x29, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x33, 0x5f, 0x2c, 0x20, 0x68, 0x61, + 0x73, 0x68, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x29, 0x2c, 0x20, 0x72, + 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, - 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, + 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, + 0x62, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, + 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x5b, 0x31, 0x5d, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x28, 0x29, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x22, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x3a, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x20, 0x27, 0x25, 0x73, 0x27, 0x3a, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, + 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, 0x61, 0x73, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, - 0x6c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, - 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x62, 0x6c, - 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x74, 0x5f, - 0x74, 0x62, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x28, - 0x29, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x3a, 0x25, 0x73, - 0x3a, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x3a, - 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, - 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, + 0x30, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, + 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, + 0x30, 0x36, 0x5f, 0x5b, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, + 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, 0x30, 0x36, 0x5f, 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, - 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, - 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, - 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, - 0x2e, 0x69, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, - 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x73, - 0x67, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x2c, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, + 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, 0x2e, + 0x69, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, + 0x2e, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6d, + 0x73, 0x67, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x5b, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x5c, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x38, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, 0x5b, + 0x22, 0x5c, 0x39, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x74, + 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x22, 0x6e, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x31, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x22, + 0x5c, 0x31, 0x32, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, + 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x32, 0x31, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x22, 0x5c, 0x5c, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x5f, + 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, + 0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, + 0x2c, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, + 0x73, 0x75, 0x62, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x5c, 0x31, + 0x32, 0x38, 0x2d, 0x5c, 0x32, 0x35, 0x35, 0x5d, 0x22, 0x2c, 0x20, 0x5f, + 0x32, 0x31, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, + 0x61, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x5f, 0x32, 0x31, 0x31, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x5f, 0x25, 0x30, 0x32, 0x78, + 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5f, 0x5f, 0x66, 0x6e, 0x6c, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5e, + 0x25, 0x77, 0x5d, 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x31, 0x31, 0x5f, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x32, 0x31, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x5e, + 0x5f, 0x5f, 0x66, 0x6e, 0x6c, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x5f, 0x28, 0x2e, 0x2a, 0x29, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x32, 0x31, 0x33, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x33, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x31, 0x35, 0x5f, 0x28, 0x5f, + 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, 0x6f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x73, 0x75, + 0x62, 0x28, 0x32, 0x29, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x32, 0x31, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x72, + 0x65, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x5f, 0x5b, 0x25, 0x64, 0x61, 0x2d, + 0x66, 0x5d, 0x5b, 0x25, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x22, 0x2c, 0x20, + 0x5f, 0x32, 0x31, 0x35, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x31, 0x34, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x31, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x7b, 0x5b, 0x22, 0x5c, 0x31, 0x31, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x32, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, - 0x5b, 0x22, 0x5c, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, - 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x38, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x39, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x2c, 0x20, - 0x5b, 0x22, 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x22, - 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, - 0x22, 0x5c, 0x5c, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x5f, 0x32, 0x34, 0x31, - 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, - 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, - 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, - 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x75, 0x62, - 0x73, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x5c, 0x31, 0x32, 0x38, 0x2d, - 0x5c, 0x32, 0x35, 0x35, 0x5d, 0x22, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x73, - 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, - 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, - 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, - 0x5f, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x31, - 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5f, 0x5f, - 0x66, 0x6e, 0x6c, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x5f, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, - 0x62, 0x28, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5d, 0x22, 0x2c, 0x20, 0x5f, - 0x30, 0x5f, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x28, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x20, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x29, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x28, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x74, 0x65, 0x6d, 0x70, 0x5f, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, + 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x29, 0x2c, + 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x6c, 0x75, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x22, 0x5d, 0x29, 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, + 0x25, 0x64, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x28, + 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x32, 0x31, 0x39, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x5f, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x20, 0x5f, + 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x72, + 0x61, 0x77, 0x2c, 0x20, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x22, + 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5f, 0x5d, 0x22, 0x2c, + 0x20, 0x5f, 0x32, 0x31, 0x39, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5b, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x74, 0x65, 0x6d, + 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5b, 0x73, 0x74, 0x72, + 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, - 0x22, 0x5e, 0x5f, 0x5f, 0x66, 0x6e, 0x6c, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x5f, 0x5f, 0x28, 0x2e, 0x2a, 0x29, 0x24, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x73, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, + 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x5d, 0x2c, + 0x20, 0x28, 0x22, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, + 0x77, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, + 0x64, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5b, 0x72, 0x61, 0x77, 0x5d, + 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x28, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, + 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x20, + 0x3d, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, + 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x5b, 0x22, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2d, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x5b, 0x22, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2d, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, + 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5f, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x22, 0x67, 0x65, 0x6e, + 0x73, 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x5d, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x33, + 0x66, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x75, + 0x66, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x28, 0x28, 0x5f, 0x33, 0x66, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x75, 0x66, 0x66, + 0x69, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x5f, + 0x33, 0x66, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x5f, + 0x33, 0x66, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, + 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, + 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x3d, 0x20, 0x28, + 0x5f, 0x33, 0x66, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x29, 0x5b, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x5f, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x61, + 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x5f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x20, + 0x3d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x2c, 0x20, 0x28, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x32, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, - 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, - 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x5f, 0x32, 0x34, 0x31, - 0x3a, 0x73, 0x75, 0x62, 0x28, 0x32, 0x29, 0x2c, 0x20, 0x31, 0x36, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x72, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x5f, 0x5b, 0x25, 0x64, - 0x61, 0x2d, 0x66, 0x5d, 0x5b, 0x25, 0x64, 0x61, 0x2d, 0x66, 0x5d, 0x22, - 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x33, - 0x66, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2c, - 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x28, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x20, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x29, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x28, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, - 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x73, - 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x75, - 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x5d, - 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, - 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x64, 0x22, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5f, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x22, 0x5f, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x20, - 0x5f, 0x32, 0x34, 0x31, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x72, 0x61, 0x77, 0x2c, 0x20, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x22, 0x5f, - 0x22, 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x5e, 0x25, 0x77, 0x5f, 0x5d, 0x22, - 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, - 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x75, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, - 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x73, - 0x74, 0x72, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x77, 0x2c, 0x20, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, - 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x72, 0x61, 0x77, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x69, 0x73, 0x20, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, - 0x20, 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, - 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x74, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x72, - 0x65, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x69, 0x5d, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, - 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x22, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x22, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, - 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x5b, 0x22, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2d, 0x61, 0x70, 0x70, - 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5f, 0x22, + 0x32, 0x33, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, + 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, 0x20, 0x2d, + 0x20, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x29, + 0x5b, 0x62, 0x61, 0x73, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, + 0x62, 0x61, 0x73, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x32, 0x32, + 0x33, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x26, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x69, 0x6c, 0x6c, + 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x72, 0x20, 0x26, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, 0x61, + 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x25, 0x73, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x29, + 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, + 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x64, 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x29, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x20, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, + 0x74, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x2c, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, - 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x62, 0x61, 0x73, 0x65, 0x20, - 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x20, - 0x2e, 0x2e, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x75, 0x66, 0x66, 0x69, - 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5d, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x62, 0x61, - 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x28, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x75, - 0x66, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x61, 0x73, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x73, 0x5b, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, - 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, - 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x28, 0x28, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, - 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, - 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x3a, 0x22, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x62, - 0x61, 0x73, 0x65, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, - 0x20, 0x2d, 0x20, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x61, 0x75, 0x74, - 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x62, 0x61, 0x73, 0x65, 0x5d, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x73, 0x5b, 0x62, 0x61, 0x73, 0x65, 0x5d, 0x20, 0x6f, - 0x72, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6f, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, - 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x66, - 0x69, 0x6e, 0x64, 0x28, 0x22, 0x26, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, - 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, - 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x3a, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x28, 0x28, 0x22, 0x2d, 0x2d, 0x20, 0x57, 0x61, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x26, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x66, 0x75, - 0x74, 0x75, 0x72, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, - 0x6f, 0x74, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, - 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x29, 0x2c, - 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, - 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x68, 0x61, 0x64, - 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, - 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x29, 0x3a, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, - 0x3f, 0x22, 0x5d, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x2c, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x72, - 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, - 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x67, - 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, - 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, - 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, - 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, - 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6d, + 0x65, 0x74, 0x61, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x74, 0x65, 0x6d, 0x70, + 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, + 0x64, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, + 0x6d, 0x65, 0x74, 0x61, 0x29, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, - 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, - 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, - 0x68, 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x24, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x24, 0x31, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6d, + 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, + 0x68, 0x66, 0x6e, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x24, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, + 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x24, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x24, 0x31, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, - 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, 0x2d, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, - 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, - 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x68, 0x61, 0x73, 0x68, 0x66, - 0x6e, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x30, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x23, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, - 0x67, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x5b, 0x22, 0x75, - 0x73, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x69, - 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, - 0x61, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, - 0x20, 0x28, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x20, 0x3d, 0x3d, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, - 0x64, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x24, + 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x2d, 0x74, 0x6f, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x30, 0x20, 0x3d, 0x20, 0x28, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f, + 0x72, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x30, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x23, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x5b, 0x22, 0x75, 0x73, 0x65, + 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, + 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, + 0x5d, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x33, 0x66, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, + 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x5f, 0x33, 0x66, 0x28, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, + 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x33, 0x66, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x64, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, @@ -7611,129 +7017,121 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, - 0x75, 0x74, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x75, - 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6f, - 0x75, 0x74, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, - 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x32, 0x29, 0x5d, - 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x6f, - 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x23, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x65, - 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x31, 0x2c, 0x20, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, - 0x20, 0x33, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, - 0x2c, 0x20, 0x23, 0x6b, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6b, 0x69, 0x64, 0x5b, 0x69, 0x5d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2c, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x22, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6c, - 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, - 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x28, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x75, 0x74, 0x5b, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x5d, 0x20, - 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, - 0x65, 0x61, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, - 0x65, 0x61, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x23, 0x73, 0x75, 0x62, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, - 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x28, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x30, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6f, 0x75, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x5f, 0x33, 0x66, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, + 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, + 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, + 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x3e, 0x3d, 0x20, 0x33, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x2d, 0x20, 0x32, 0x29, 0x5d, 0x29, 0x2e, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x5b, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, + 0x31, 0x29, 0x5d, 0x29, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x23, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6b, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x65, 0x65, 0x70, + 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5b, 0x28, + 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x3d, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x28, 0x23, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x2d, 0x20, 0x33, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, - 0x74, 0x65, 0x6e, 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, + 0x23, 0x6b, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x6b, 0x69, 0x64, 0x5b, 0x69, 0x5d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x65, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, 0x3d, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x5d, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x2c, 0x20, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x75, 0x62, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x6f, + 0x72, 0x20, 0x28, 0x23, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x20, 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x61, 0x73, + 0x74, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x28, 0x73, + 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x30, 0x2c, 0x20, 0x28, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x28, 0x73, 0x75, 0x62, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x30, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, @@ -7753,509 +7151,589 @@ unsigned char loadfennel_lua[] = { 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x74, 0x61, 0x62, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6d, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x7b, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x66, - 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6c, - 0x69, 0x6e, 0x65, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x74, 0x61, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, - 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, - 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x30, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, - 0x72, 0x74, 0x65, 0x72, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x2e, 0x6c, 0x65, - 0x61, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x23, 0x63, 0x20, 0x3e, 0x20, - 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, - 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x73, 0x6d, 0x2c, - 0x20, 0x63, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x30, 0x2c, 0x20, 0x28, 0x64, - 0x65, 0x70, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x74, 0x61, 0x62, 0x30, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x75, 0x62, - 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, - 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, - 0x30, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x65, 0x72, 0x29, 0x2c, 0x20, 0x22, - 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x28, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x30, 0x20, 0x3d, - 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x30, 0x20, 0x3c, 0x3d, 0x20, 0x34, 0x39, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x30, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, - 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x30, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x34, - 0x36, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, - 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, - 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x65, 0x65, 0x70, 0x68, 0x6f, - 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x65, 0x64, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x30, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x2c, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, + 0x74, 0x61, 0x62, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, + 0x6c, 0x65, 0x61, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x73, 0x6d, 0x2c, 0x20, 0x7b, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, + 0x33, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, + 0x33, 0x36, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x22, + 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x36, + 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, 0x33, 0x36, 0x5f, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x61, 0x62, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x5f, 0x32, 0x33, 0x36, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, 0x20, 0x3d, + 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, + 0x74, 0x65, 0x72, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x2e, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x23, 0x63, 0x20, 0x3e, 0x20, 0x30, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, - 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6d, 0x20, 0x74, + 0x73, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x73, 0x6d, 0x2c, 0x20, + 0x63, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x30, 0x2c, 0x20, 0x28, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x6d, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, - 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, - 0x72, 0x63, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x40, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, - 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, - 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x6d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, - 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, - 0x74, 0x67, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, 0x6b, - 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x73, 0x65, 0x6c, - 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, - 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, - 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x30, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x75, 0x62, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x28, + 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x30, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x6d, 0x61, 0x70, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x65, 0x72, 0x29, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, + 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x28, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x30, + 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x30, 0x20, 0x3c, 0x3d, 0x20, 0x34, 0x39, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x66, + 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x30, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5c, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x5b, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x30, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, + 0x20, 0x34, 0x36, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x2e, + 0x5c, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x65, 0x65, 0x70, + 0x68, 0x6f, 0x6c, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x28, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, + 0x2c, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x73, 0x6d, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x6d, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, + 0x72, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x5f, 0x73, 0x72, 0x63, 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x72, 0x65, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x28, + 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x6d, 0x2e, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x73, 0x6d, 0x2e, 0x6b, 0x65, + 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x73, + 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, + 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x35, + 0x5f, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, + 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x37, 0x5f, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x67, 0x74, 0x2c, 0x20, - 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, 0x65, 0x6e, 0x20, - 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, - 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x73, 0x20, 0x3d, - 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x76, 0x5f, 0x6c, 0x65, 0x6e, - 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x28, - 0x29, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, - 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x6b, 0x2f, 0x76, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, 0x65, 0x6e, 0x2c, - 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x5b, - 0x6b, 0x76, 0x73, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x6b, 0x76, - 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, - 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, - 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, - 0x20, 0x7b, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x2c, - 0x20, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, - 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, - 0x7d, 0x2c, 0x20, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, - 0x22, 0x6b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, - 0x31, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x65, - 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x20, 0x3d, 0x20, - 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, 0x23, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x20, 0x3d, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x73, 0x65, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, - 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x64, - 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, - 0x25, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, 0x29, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, - 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, - 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x34, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x29, + 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, + 0x34, 0x38, 0x5f, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x67, + 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, + 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, + 0x22, 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x76, 0x5f, + 0x6c, 0x65, 0x6e, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, - 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x22, - 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, - 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, - 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x64, 0x69, - 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, - 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, - 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x6e, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, - 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, - 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, - 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, - 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, - 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, - 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, - 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, - 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x73, 0x65, 0x74, 0x61, + 0x6c, 0x6c, 0x28, 0x29, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x2f, 0x76, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x5b, 0x74, 0x67, 0x74, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6b, 0x76, 0x5f, 0x6c, 0x65, + 0x6e, 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x74, 0x67, 0x74, + 0x5d, 0x5b, 0x6b, 0x76, 0x73, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, + 0x6b, 0x76, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x67, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x7b, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x32, + 0x34, 0x35, 0x5f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, + 0x32, 0x34, 0x37, 0x5f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x38, 0x5f, 0x7d, 0x2c, 0x20, 0x5f, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x22, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, + 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6a, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x30, 0x2c, 0x20, + 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, + 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x6a, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x73, + 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x25, 0x73, 0x22, - 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, - 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x28, 0x22, 0x64, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x25, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, + 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x62, 0x79, + 0x74, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x30, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x64, 0x6f, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, - 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, - 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x5f, - 0x32, 0x5f, 0x28, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, + 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x6e, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x23, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x20, 0x7e, 0x3d, 0x20, + 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, + 0x6e, 0x20, 0x3e, 0x20, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x6e, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, + 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, + 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x23, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x6e, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, - 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, + 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, + 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, + 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, - 0x5f, 0x30, 0x5b, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, - 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, - 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, - 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x74, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x6d, 0x75, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x2c, 0x20, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x28, 0x29, 0x29, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, + 0x61, 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x5f, 0x20, 0x3d, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x32, 0x35, 0x38, 0x5f, 0x5b, 0x22, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x35, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, + 0x3d, 0x20, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x74, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, + 0x69, 0x5d, 0x5d, 0x29, 0x2c, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x5b, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, + 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x74, 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x5d, 0x29, 0x2c, - 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x5b, 0x31, 0x5d, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, - 0x32, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, - 0x31, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x61, 0x73, 0x74, - 0x5b, 0x31, 0x5d, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x5f, 0x32, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x5f, + 0x32, 0x36, 0x32, 0x5f, 0x2c, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x32, + 0x36, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x32, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, + 0x67, 0x5f, 0x32, 0x36, 0x33, 0x5f, 0x5b, 0x22, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x32, 0x36, 0x33, 0x5f, 0x5b, 0x22, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x32, 0x36, 0x33, + 0x5f, 0x5b, 0x22, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x32, 0x36, 0x33, 0x5f, 0x5b, 0x22, 0x62, 0x79, + 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, - 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2c, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x28, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, - 0x5d, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x5f, 0x32, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, - 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, - 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x61, 0x73, 0x74, 0x2d, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x72, + 0x63, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x2e, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x72, 0x63, + 0x2e, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x5f, 0x33, 0x66, 0x6f, 0x6e, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x61, + 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x66, + 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5f, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, + 0x36, 0x35, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, - 0x32, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, - 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x32, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x36, 0x37, + 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x5f, 0x32, 0x61, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, + 0x73, 0x74, 0x2c, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, - 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x5f, 0x32, 0x61, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x5f, 0x32, 0x5f, 0x2c, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x5f, 0x32, 0x36, 0x37, 0x5f, 0x2c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x6f, 0x6c, - 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, - 0x32, 0x61, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x65, 0x64, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, - 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x6f, - 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, - 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, - 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, + 0x36, 0x39, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x36, 0x38, + 0x5f, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x37, 0x30, 0x5f, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x5f, 0x32, 0x36, 0x38, + 0x5f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x32, 0x37, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x61, 0x6c, 0x6b, 0x2d, 0x74, 0x72, 0x65, + 0x65, 0x22, 0x5d, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x5f, 0x32, 0x36, 0x39, 0x5f, 0x28, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x3d, 0x20, 0x6f, + 0x6c, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x61, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x5f, 0x33, 0x66, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, + 0x3d, 0x20, 0x5f, 0x32, 0x36, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, + 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, + 0x7e, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, @@ -8264,77 +7742,77 @@ unsigned char loadfennel_lua[] = { 0x78, 0x70, 0x72, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x65, - 0x78, 0x70, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x7b, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x32, 0x2e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, - 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, - 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, - 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x63, 0x61, 0x6c, 0x6c, - 0x65, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, - 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, - 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, - 0x29, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, - 0x65, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, - 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x2c, 0x20, - 0x28, 0x22, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, - 0x6c, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, - 0x29, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, - 0x6c, 0x65, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, - 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x2c, + 0x73, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x72, 0x3f, 0x22, 0x5d, + 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x20, + 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x2e, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x32, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, + 0x72, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, + 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, + 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x29, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x28, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x22, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x63, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x32, 0x37, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x65, 0x6e, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x37, 0x36, + 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, + 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x36, 0x5f, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x28, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, @@ -8356,211 +7834,210 @@ unsigned char loadfennel_lua[] = { 0x2c, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, - 0x20, 0x3d, 0x20, 0x22, 0x28, 0x25, 0x73, 0x29, 0x28, 0x25, 0x73, 0x29, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x22, - 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x70, - 0x61, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x2c, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x66, 0x61, 0x72, 0x67, 0x73, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x63, 0x61, 0x6c, - 0x6c, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x6c, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, + 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x28, 0x25, + 0x73, 0x29, 0x28, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x28, 0x25, 0x73, 0x29, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x70, 0x61, 0x74, 0x2c, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x65, 0x29, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, + 0x66, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, + 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, + 0x70, 0x72, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x22, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x7d, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x63, + 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, + 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, + 0x31, 0x2c, 0x20, 0x28, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, + 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x29, 0x7d, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x23, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3a, 0x22, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x32, 0x2c, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6e, 0x65, + 0x77, 0x5f, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, + 0x6c, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, - 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x20, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, - 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x2c, 0x20, + 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x2e, 0x2e, + 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x76, 0x61, 0x72, 0x67, 0x22, 0x29, 0x7d, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x61, 0x73, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, - 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, - 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6c, - 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x20, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, - 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, - 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, - 0x6c, 0x6c, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, - 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, - 0x28, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x7d, - 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x5b, 0x23, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, - 0x77, 0x5f, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3a, 0x22, 0x2c, 0x20, 0x6e, 0x69, - 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, - 0x74, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x28, 0x32, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, + 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, + 0x74, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, + 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, + 0x6c, 0x22, 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x79, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, + 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, + 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x6e, 0x69, 0x6c, + 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, + 0x74, 0x73, 0x28, 0x7b, 0x65, 0x7d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x38, 0x32, + 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x2c, 0x20, 0x22, 0x2e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x32, 0x38, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, 0x61, 0x73, + 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x6e, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x22, 0x75, 0x6e, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, - 0x61, 0x72, 0x67, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, - 0x20, 0x22, 0x76, 0x61, 0x72, 0x67, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, - 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, - 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, - 0x29, 0x2c, 0x20, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, - 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, - 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, - 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x22, - 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x65, 0x7d, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, - 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x22, 0x2c, 0x20, - 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, 0x61, - 0x73, 0x74, 0x2c, 0x20, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, - 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, - 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x38, 0x33, 0x5f, 0x20, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, 0x38, 0x33, + 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x5f, 0x32, 0x38, 0x33, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x32, 0x38, 0x33, + 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x32, 0x38, 0x33, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, @@ -8578,102 +8055,124 @@ unsigned char loadfennel_lua[] = { 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x61, 0x73, - 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x28, 0x28, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x76, - 0x61, 0x6c, 0x7d, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, - 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, - 0x20, 0x6b, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, 0x3c, 0x20, - 0x31, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, 0x3e, 0x20, 0x23, - 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x6b, - 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, - 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x28, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, - 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x30, - 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x73, 0x74, - 0x72, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x64, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x6b, 0x73, 0x74, - 0x72, 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, - 0x61, 0x73, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, - 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5f, 0x31, 0x5f, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3c, 0x20, 0x62, - 0x5b, 0x31, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, - 0x5f, 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6d, + 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x6b, 0x29, + 0x20, 0x7e, 0x3d, 0x20, 0x6b, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, + 0x20, 0x3c, 0x20, 0x31, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, + 0x3e, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x7b, 0x6b, 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, 0x38, 0x35, 0x5f, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x6b, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, + 0x32, 0x38, 0x35, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6b, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5b, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x6b, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6b, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x5f, + 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6b, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x33, - 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, - 0x74, 0x5b, 0x6b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, - 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x61, 0x73, 0x74, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, + 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, + 0x28, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, + 0x5b, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x62, + 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x32, 0x39, 0x31, 0x5f, 0x28, 0x5f, + 0x32, 0x38, 0x39, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, + 0x5f, 0x32, 0x39, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x39, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x31, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, + 0x67, 0x5f, 0x32, 0x39, 0x30, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, - 0x22, 0x2c, 0x20, 0x6b, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6b, 0x65, - 0x79, 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x62, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x6b, 0x32, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x32, 0x39, + 0x30, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, + 0x5f, 0x32, 0x39, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x5b, 0x6b, 0x32, 0x5d, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x31, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, + 0x6c, 0x65, 0x74, 0x5f, 0x32, 0x39, 0x32, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, + 0x73, 0x22, 0x2c, 0x20, 0x6b, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6b, + 0x65, 0x79, 0x73, 0x2c, 0x20, 0x5f, 0x32, 0x39, 0x31, 0x5f, 0x2c, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x61, 0x73, 0x74, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x28, + 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x23, 0x61, 0x73, 0x74, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x31, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x76, 0x61, 0x6c, + 0x7d, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x7b, 0x75, 0x74, 0x69, @@ -8688,61 +8187,61 @@ unsigned char loadfennel_lua[] = { 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x74, 0x30, 0x20, 0x3d, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, - 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, - 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, - 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, + 0x66, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, + 0x73, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x28, 0x61, 0x73, 0x74, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, + 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, 0x30, + 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d, - 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, - 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x61, + 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x67, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x30, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, - 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, - 0x61, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, 0x61, - 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, + 0x73, 0x79, 0x6d, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, + 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, + 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x30, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x28, + 0x61, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, @@ -8760,727 +8259,737 @@ unsigned char loadfennel_lua[] = { 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, - 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, - 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x69, - 0x73, 0x76, 0x61, 0x72, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x74, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x32, 0x39, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x32, 0x39, 0x34, 0x5f, 0x5b, 0x22, 0x69, 0x73, 0x76, 0x61, + 0x72, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, 0x39, 0x34, + 0x5f, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, 0x39, + 0x34, 0x5f, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, + 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x32, 0x39, 0x34, 0x5f, + 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x32, 0x39, 0x34, 0x5f, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5f, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x64, 0x73, 0x74, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, - 0x20, 0x22, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x75, - 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x73, 0x30, 0x2e, 0x6e, 0x6f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, - 0x72, 0x61, 0x77, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, - 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, - 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, - 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, - 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x72, 0x61, 0x77, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x72, 0x61, 0x77, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, + 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x74, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x73, 0x20, 0x3d, + 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, + 0x77, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, - 0x6f, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x61, - 0x29, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x25, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, - 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, - 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x76, 0x61, 0x72, 0x29, 0x2c, 0x20, - 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, - 0x61, 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, - 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, - 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x6e, 0x6f, 0x75, 0x6e, 0x64, 0x65, - 0x66, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x2c, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x6f, 0x74, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x6e, 0x6f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x72, 0x61, 0x77, 0x29, 0x29, 0x2c, + 0x20, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, + 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6e, 0x69, + 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, + 0x22, 0x5d, 0x28, 0x72, 0x61, 0x77, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x72, 0x61, 0x77, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, + 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, + 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, - 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, - 0x61, 0x77, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x66, - 0x6c, 0x69, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, - 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, - 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x77, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x5b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, 0x77, 0x29, 0x5d, 0x20, - 0x3d, 0x20, 0x72, 0x61, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x72, 0x61, - 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x32, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x5b, 0x5f, 0x32, 0x34, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, - 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x73, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x65, - 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x23, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x31, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x7b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x69, 0x20, - 0x3d, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x5b, 0x70, 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x70, - 0x6c, 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, - 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x28, - 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x5b, 0x22, 0x6c, 0x65, 0x61, - 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, - 0x65, 0x61, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x69, - 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, - 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x61, 0x77, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x2c, 0x20, 0x22, 0x63, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x22, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x65, 0x74, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x25, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x29, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, + 0x74, 0x61, 0x2e, 0x76, 0x61, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, 0x2c, 0x20, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x30, 0x2e, 0x6e, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x29, 0x2c, + 0x20, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x2c, 0x20, 0x7b, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, - 0x2c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x3d, 0x20, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x7d, 0x29, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, + 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, + 0x72, 0x61, 0x77, 0x5d, 0x5d, 0x2c, 0x20, 0x28, 0x22, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x29, + 0x5b, 0x72, 0x61, 0x77, 0x5d, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, + 0x72, 0x61, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x61, + 0x77, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x2c, 0x20, 0x72, 0x61, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, - 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, - 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6c, 0x65, - 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, - 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x7b, 0x6c, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, - 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, - 0x65, 0x74, 0x74, 0x65, 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x31, 0x28, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x29, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x3d, - 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x65, - 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, - 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x74, + 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x69, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x30, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x6e, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5b, 0x5f, 0x32, 0x34, 0x31, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, + 0x34, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x33, + 0x30, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, - 0x79, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, + 0x6c, 0x20, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x3d, 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x66, 0x72, 0x6f, + 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x70, 0x69, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x65, 0x6e, + 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x70, 0x69, + 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, + 0x70, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x28, 0x70, 0x6c, 0x65, + 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x73, 0x31, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, - 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x32, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, - 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x6e, - 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, - 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5d, 0x5b, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x23, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x61, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x30, - 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x3d, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, 0x70, 0x6c, + 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x7b, 0x61, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x28, + 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x7b, + 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6c, + 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, + 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, + 0x75, 0x70, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x28, 0x7b, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, - 0x69, 0x74, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, - 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, - 0x76, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, - 0x28, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x5b, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, - 0x29, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x26, 0x22, 0x29, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x65, + 0x72, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6c, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, 0x28, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, 0x29, 0x2c, + 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, + 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x65, 0x66, + 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, + 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, + 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, + 0x30, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x33, 0x30, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x73, 0x31, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, + 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, + 0x30, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x31, + 0x28, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x5f, 0x33, 0x30, 0x37, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x76, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x26, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x7b, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, - 0x72, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x28, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x29, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, - 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x73, - 0x74, 0x72, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, - 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, - 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, - 0x28, 0x6b, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x5d, 0x29, 0x29, 0x2c, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, - 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, + 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, + 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x37, 0x5f, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x30, 0x37, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x28, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x25, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x73, 0x22, 0x2c, + 0x20, 0x73, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, - 0x28, 0x6b, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x2c, 0x20, 0x7b, 0x73, - 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x6b, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, - 0x20, 0x22, 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x28, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6b, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x28, + 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x5e, 0x26, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, 0x7d, 0x2c, 0x20, - 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x69, - 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x28, 0x6b, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, - 0x6c, 0x65, 0x66, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, - 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, - 0x6e, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x26, 0x61, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x22, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, - 0x6d, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, - 0x7b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, - 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, + 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x76, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x26, 0x22, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, + 0x2c, 0x20, 0x6b, 0x29, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x5c, 0x6e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x5c, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5c, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, + 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x72, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x72, 0x65, 0x73, 0x74, 0x28, 0x74, 0x2c, 0x20, + 0x6b, 0x29, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x5c, 0x6e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x29, 0x28, 0x74, 0x2c, 0x20, 0x6b, 0x29, 0x7d, 0x5c, 0x6e, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x25, 0x73, 0x2c, + 0x20, 0x25, 0x73, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, + 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x25, 0x73, 0x2a, 0x22, 0x2c, 0x20, 0x22, + 0x20, 0x22, 0x29, 0x2c, 0x20, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, + 0x72, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, + 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, + 0x5b, 0x28, 0x6b, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x5d, 0x29, 0x29, 0x2c, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x72, + 0x65, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, + 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, + 0x5b, 0x28, 0x6b, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x2c, 0x20, 0x7b, + 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x7d, 0x2c, 0x20, 0x6c, 0x65, + 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, + 0x6b, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, + 0x73, 0x79, 0x6d, 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, 0x7d, 0x2c, 0x20, 0x6c, 0x65, + 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x26, 0x61, 0x73, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x79, + 0x6d, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x6b, 0x2c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x29, 0x2c, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x26, 0x61, + 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, 0x6c, + 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x7b, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x29, 0x7d, 0x2c, 0x20, 0x6c, 0x65, + 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, - 0x20, 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x22, 0x2c, 0x20, - 0x73, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, - 0x76, 0x2c, 0x20, 0x7b, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x7d, - 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x79, 0x20, 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, + 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x5b, 0x25, 0x73, 0x5d, 0x22, 0x2c, + 0x20, 0x73, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x2c, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, + 0x28, 0x76, 0x2c, 0x20, 0x7b, 0x73, 0x75, 0x62, 0x65, 0x78, 0x70, 0x72, + 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, + 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, + 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, + 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, + 0x73, 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, + 0x64, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x69, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x79, + 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x22, + 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x74, 0x6f, + 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x27, 0x74, + 0x20, 0x6e, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x6c, 0x65, + 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, + 0x73, 0x79, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, 0x5b, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, + 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, + 0x69, 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x70, 0x61, 0x69, 0x72, + 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x7b, 0x70, 0x61, 0x69, 0x72, 0x5b, 0x32, + 0x5d, 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6c, - 0x65, 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, - 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, - 0x67, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, - 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x73, 0x79, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x30, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x65, - 0x66, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x79, - 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, - 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, - 0x79, 0x6d, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, - 0x22, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x74, - 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x27, - 0x74, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x6c, - 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, - 0x79, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x28, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6d, 0x6d, 0x65, 0x74, 0x61, - 0x5b, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, - 0x28, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x76, 0x61, - 0x72, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x76, 0x61, 0x72, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, - 0x70, 0x61, 0x69, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x70, 0x61, - 0x69, 0x72, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x7b, 0x70, 0x61, 0x69, 0x72, - 0x5b, 0x32, 0x5d, 0x7d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, - 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, - 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, - 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, - 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, - 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, - 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x72, 0x65, 0x31, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, + 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, + 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78, + 0x70, 0x72, 0x73, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, + 0x70, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, - 0x66, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, - 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, - 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, - 0x73, 0x22, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, 0x65, 0x66, - 0x74, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x75, 0x70, 0x31, 0x5b, 0x32, 0x5d, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x70, 0x31, 0x5b, 0x32, 0x5d, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, 0x66, + 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6c, 0x65, 0x66, 0x74, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6c, 0x65, + 0x66, 0x74, 0x2c, 0x20, 0x75, 0x70, 0x31, 0x2c, 0x20, 0x74, 0x6f, 0x70, + 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, + 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x29, + 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, + 0x65, 0x66, 0x74, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x28, 0x75, 0x70, 0x31, 0x29, 0x5b, 0x32, 0x5d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x70, 0x31, 0x29, 0x5b, 0x32, + 0x5d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x31, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x5f, 0x33, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, - 0x28, 0x74, 0x6f, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, - 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, - 0x22, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x22, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x74, 0x6f, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x73, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, - 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, - 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, - 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, - 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, - 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x25, 0x73, - 0x29, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x65, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, - 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x28, 0x61, 0x73, 0x74, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x31, 0x28, 0x74, 0x6f, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x2c, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x6c, + 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x28, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x6d, + 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x28, 0x73, 0x74, 0x72, 0x6d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, - 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, - 0x5d, 0x28, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x64, - 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, - 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x6d, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x76, - 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x31, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x64, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, - 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, - 0x28, 0x28, 0x28, 0x69, 0x20, 0x3c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, - 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, - 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, - 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x76, - 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, - 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, - 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, - 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x28, - 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x20, - 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x28, + 0x28, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x3a, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x25, 0x73, 0x29, 0x22, 0x2c, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x29, 0x29, + 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x73, 0x74, 0x72, + 0x6d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, + 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, - 0x73, 0x30, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, - 0x5f, 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x22, 0x5d, 0x28, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, - 0x70, 0x74, 0x73, 0x30, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, - 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, - 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x20, - 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x41, 0x73, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, - 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, - 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, - 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x29, + 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x67, 0x74, 0x2c, 0x20, + 0x6d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, 0x5b, 0x6d, 0x5d, 0x28, 0x74, 0x67, + 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2c, + 0x20, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x6d, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, + 0x5d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x7b, 0x6e, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x28, 0x28, 0x28, 0x69, 0x20, 0x3c, 0x20, 0x23, 0x76, 0x61, 0x6c, + 0x73, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x2c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, + 0x3d, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x76, 0x61, 0x6c, + 0x73, 0x29, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x20, + 0x23, 0x76, 0x61, 0x6c, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5b, 0x69, 0x5d, 0x2c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, @@ -9488,41 +8997,118 @@ unsigned char loadfennel_lua[] = { 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, - 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, - 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x28, 0x69, 0x6e, - 0x66, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x43, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, - 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, 0x20, 0x5b, 0x43, 0x5d, - 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x66, - 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, - 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x43, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x20, 0x5b, - 0x43, 0x5d, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x3f, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, - 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, - 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x70, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, - 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, - 0x69, 0x6e, 0x65, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, - 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x31, 0x5d, + 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, + 0x29, 0x2c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, + 0x7b, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, + 0x61, 0x73, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x30, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, + 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6b, + 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x67, 0x74, + 0x2c, 0x20, 0x6d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x67, 0x74, 0x5b, 0x6d, 0x5d, 0x28, + 0x74, 0x67, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, + 0x74, 0x2c, 0x20, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, + 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x30, + 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x2e, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x30, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x41, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x2e, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x61, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x7b, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x65, + 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x73, 0x28, 0x65, 0x78, 0x70, 0x72, 0x73, 0x2c, 0x20, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x61, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x22, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, + 0x20, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x28, + 0x69, 0x6e, 0x66, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, 0x68, 0x61, 0x74, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x43, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, 0x20, 0x5b, + 0x43, 0x5d, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 0x22, 0x2c, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, + 0x66, 0x6f, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x43, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, + 0x20, 0x5b, 0x43, 0x5d, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x3f, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6d, + 0x61, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, + 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, + 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, + 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, + 0x63, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x31, 0x5d, @@ -9538,145 +9124,149 @@ unsigned char loadfennel_lua[] = { 0x28, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x5b, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x5d, 0x5b, 0x32, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, - 0x77, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x4c, 0x75, 0x61, - 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x66, 0x6f, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x77, + 0x68, 0x61, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x4c, 0x75, 0x61, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x32, 0x35, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x22, 0x3f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, - 0x20, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, 0x20, 0x69, 0x6e, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x22, - 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x5f, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, - 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, - 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x72, 0x63, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, - 0x6c, 0x6c, 0x29, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x22, 0x20, 0x20, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, - 0x61, 0x6c, 0x6c, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x20, - 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x6d, - 0x61, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x2c, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x22, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x66, + 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x3f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x22, 0x20, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, 0x20, 0x69, 0x6e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, + 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x20, 0x5f, 0x33, 0x32, 0x35, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x73, - 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, - 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, - 0x73, 0x67, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x28, 0x28, 0x6d, 0x73, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x22, - 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x28, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, - 0x5e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x73, 0x67, 0x30, - 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x50, 0x61, 0x72, 0x73, - 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2d, 0x6f, 0x6e, 0x3f, 0x22, - 0x5d, 0x28, 0x22, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x0a, 0x20, + 0x72, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x28, 0x74, 0x61, 0x69, 0x6c, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x20, 0x28, 0x74, 0x61, 0x69, + 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, - 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x20, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x64, 0x3a, 0x20, 0x69, + 0x6e, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x28, 0x6d, 0x73, 0x67, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x5e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6d, + 0x73, 0x67, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x29, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2d, 0x6f, + 0x6e, 0x3f, 0x22, 0x5d, 0x28, 0x22, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, - 0x6d, 0x73, 0x67, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x6d, 0x73, - 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x67, 0x73, 0x75, - 0x62, 0x28, 0x22, 0x5e, 0x5b, 0x5e, 0x3a, 0x5d, 0x2a, 0x3a, 0x25, 0x64, - 0x2b, 0x3a, 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6d, 0x73, - 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x22, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, - 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x28, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x69, 0x6e, - 0x66, 0x6f, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x22, 0x53, - 0x6c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x5f, 0x30, 0x20, - 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x73, 0x67, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x73, 0x67, 0x30, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x25, 0x64, 0x2b, 0x3a, + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x73, 0x67, 0x30, + 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x25, 0x64, 0x2b, 0x3a, + 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, + 0x20, 0x6d, 0x73, 0x67, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x6d, + 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x30, 0x3a, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x22, 0x5e, 0x5b, 0x5e, 0x3a, 0x5d, 0x2a, 0x3a, 0x25, + 0x64, 0x2b, 0x3a, 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, + 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6d, + 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, + 0x28, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x32, 0x39, 0x5f, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, + 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, + 0x22, 0x53, 0x6c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x32, + 0x39, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, - 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, - 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x28, 0x69, 0x6e, - 0x66, 0x6f, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, - 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x66, - 0x6b, 0x2c, 0x20, 0x66, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6b, 0x2c, 0x20, 0x66, 0x76, 0x28, 0x76, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x66, 0x6b, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x66, 0x76, 0x28, - 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x32, 0x39, + 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x32, + 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x28, 0x69, 0x6e, 0x66, 0x6f, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x66, 0x6b, 0x2c, 0x20, 0x66, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, + 0x33, 0x32, 0x5f, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6b, 0x2c, 0x20, 0x66, 0x76, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x6b, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x66, 0x76, 0x28, 0x76, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x33, 0x33, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, @@ -9706,408 +9296,562 @@ unsigned char loadfennel_lua[] = { 0x2e, 0x2e, 0x20, 0x22, 0x3d, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, + 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, - 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, - 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x71, 0x75, 0x6f, - 0x74, 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, - 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x22, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x66, 0x6f, - 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x6f, + 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x76, + 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x71, 0x75, 0x6f, 0x74, + 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, + 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x79, 0x6d, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x6f, 0x72, 0x6d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, - 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, - 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x22, 0x23, 0x24, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, - 0x22, 0x23, 0x5b, 0x3a, 0x2e, 0x5d, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x79, 0x6d, - 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x61, 0x75, 0x74, - 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x79, 0x6d, 0x73, - 0x74, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, + 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x20, 0x3d, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x23, 0x24, 0x22, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x23, 0x5b, 0x3a, 0x2e, 0x5d, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, + 0x79, 0x6d, 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x7b, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x28, 0x73, 0x79, + 0x6d, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, + 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x22, 0x73, 0x79, 0x6d, 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, + 0x20, 0x7b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x3d, 0x74, 0x72, 0x75, + 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, + 0x29, 0x22, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, - 0x22, 0x73, 0x79, 0x6d, 0x28, 0x27, 0x25, 0x73, 0x27, 0x2c, 0x20, 0x7b, - 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x2c, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, - 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, - 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, - 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, - 0x69, 0x6c, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, - 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, - 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x5b, - 0x31, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x66, 0x6f, 0x72, - 0x6d, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, 0x6e, - 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x31, 0x28, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, - 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, - 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, + 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, + 0x6d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, + 0x6d, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, 0x6e, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x28, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, + 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x33, 0x37, 0x5f, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, + 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x5f, 0x33, 0x33, + 0x37, 0x5f, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, + 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, + 0x2c, 0x20, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x7d, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x28, 0x29, 0x29, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, + 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, + 0x70, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, + 0x71, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, + 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x34, 0x30, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x5f, + 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x33, + 0x34, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x25, 0x73, 0x7d, 0x2c, 0x20, 0x7b, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, + 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x5f, 0x33, 0x34, 0x30, 0x5f, 0x2c, 0x20, 0x22, 0x28, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x29, 0x29, 0x29, + 0x5b, 0x27, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x27, 0x5d, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, - 0x6d, 0x28, 0x5f, 0x30, 0x5f, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x6d, 0x28, 0x71, 0x2c, 0x20, 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x22, - 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, - 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, - 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, - 0x6d, 0x65, 0x22, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, - 0x25, 0x73, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x7d, 0x22, 0x20, 0x2e, - 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, - 0x29, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, - 0x2c, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6e, 0x69, - 0x6c, 0x22, 0x29, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, - 0x22, 0x5d, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, - 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x71, 0x2c, 0x20, - 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x20, - 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6c, 0x69, 0x6e, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, - 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x34, 0x33, 0x5f, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x7b, 0x25, 0x73, 0x7d, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x3d, 0x25, 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x6d, 0x69, 0x78, - 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, - 0x70, 0x70, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, - 0x31, 0x5f, 0x2c, 0x20, 0x22, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, - 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x28, 0x29, 0x29, 0x29, 0x5b, 0x27, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x27, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x66, - 0x6f, 0x72, 0x6d, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x71, 0x2c, 0x20, - 0x71, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x28, 0x22, 0x25, 0x71, 0x22, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x25, + 0x73, 0x7d, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, + 0x73, 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x34, 0x33, + 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x73, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x25, 0x73, - 0x7d, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3d, 0x25, 0x73, - 0x7d, 0x29, 0x22, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x63, - 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, - 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x70, - 0x70, 0x6c, 0x79, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, - 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, - 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x5b, - 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, - 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, - 0x20, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x20, - 0x5b, 0x22, 0x64, 0x6f, 0x2d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2c, - 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6d, 0x61, - 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, - 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, - 0x22, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6b, - 0x65, 0x65, 0x70, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, - 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5b, - 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, - 0x6f, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, - 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, - 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x64, 0x65, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x64, - 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, - 0x65, 0x6d, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x2c, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x31, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x31, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x20, 0x3d, 0x20, + 0x65, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2c, 0x20, + 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x20, 0x3d, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, - 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, 0x2c, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, - 0x61, 0x6b, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x28, 0x29, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x3d, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x66, - 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6d, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x61, 0x73, 0x74, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, - 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x24, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x24, - 0x2e, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, - 0x6e, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, - 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x66, 0x6e, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, - 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, - 0x24, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x72, 0x20, 0x24, 0x2c, 0x20, 0x24, - 0x31, 0x2c, 0x20, 0x24, 0x32, 0x2c, 0x20, 0x24, 0x33, 0x2c, 0x20, 0x65, - 0x74, 0x63, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x61, 0x6e, 0x27, - 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x79, 0x6d, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x64, 0x69, 0x67, 0x69, - 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, - 0x69, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, - 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x6c, - 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, - 0x73, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, - 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, - 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x7b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x79, 0x6f, - 0x75, 0x27, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x75, 0x6c, - 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, - 0x67, 0x69, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, - 0x72, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, - 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, 0x20, 0x69, - 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x2a, 0x20, - 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x68, 0x65, 0x73, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x22, - 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, - 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x69, 0x66, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x6e, - 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x6e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x6f, 0x2d, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x5f, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, + 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5b, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x79, + 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6d, 0x61, 0x6e, + 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x32, 0x61, + 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6b, 0x65, 0x65, 0x70, + 0x2d, 0x73, 0x69, 0x64, 0x65, 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x73, + 0x69, 0x64, 0x65, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x2c, + 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2d, 0x74, 0x6f, + 0x2d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x74, + 0x6f, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x28, 0x29, 0x2c, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x7d, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x2e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x2e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x6f, 0x72, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x69, 0x6e, 0x67, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, + 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x5f, 0x47, 0x2e, + 0x25, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, 0x2e, + 0x2a, 0x29, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, + 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x28, + 0x2e, 0x2a, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, + 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, - 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, - 0x76, 0x65, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x65, 0x74, 0x2f, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, + 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, + 0x20, 0x22, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, + 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, + 0x74, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x6f, 0x20, 0x25, 0x73, 0x23, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, + 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x27, 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, + 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x5f, 0x47, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x65, 0x67, 0x2e, + 0x20, 0x5f, 0x47, 0x2e, 0x25, 0x73, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, + 0x75, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x77, 0x61, 0x6e, + 0x74, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x22, 0x2c, + 0x20, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, + 0x6d, 0x65, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x25, 0x73, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x2a, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x68, 0x65, 0x73, 0x65, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x62, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x69, 0x66, 0x20, 0x79, + 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, 0x20, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x22, 0x2c, 0x20, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, + 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x5f, 0x25, + 0x73, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6d, + 0x65, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x6e, 0x75, 0x73, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x69, 0x78, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x20, 0x73, + 0x6f, 0x20, 0x25, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x22, 0x2c, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, + 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, + 0x76, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, + 0x61, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5c, + 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, + 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, + 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, + 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, + 0x79, 0x6f, 0x75, 0x27, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, + 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x73, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x75, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x7d, 0x2c, + 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x75, + 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x6e, + 0x27, 0x74, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x61, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x62, 0x72, 0x61, 0x63, @@ -10115,173 +9859,14 @@ unsigned char loadfennel_lua[] = { 0x69, 0x6e, 0x67, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, - 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x6d, 0x65, - 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, - 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6b, 0x65, 0x79, - 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x73, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x76, 0x6f, - 0x69, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, - 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x7b, 0x22, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, - 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x70, 0x61, - 0x69, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6f, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x69, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x5f, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6b, - 0x65, 0x79, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, - 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, - 0x20, 0x74, 0x79, 0x70, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x6f, - 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, - 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, - 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x62, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, - 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, - 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, - 0x69, 0x6e, 0x67, 0x20, 0x26, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, - 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x28, - 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, - 0x66, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x20, - 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, - 0x65, 0x63, 0x6c, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, - 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6e, - 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x65, 0x74, - 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, - 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, - 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, - 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x25, 0x73, 0x22, 0x7d, 0x2c, - 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, - 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, - 0x22, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, - 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, - 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, - 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, - 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x25, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6c, 0x6c, 0x65, - 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, - 0x72, 0x3a, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, - 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, - 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x25, - 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x63, - 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6c, 0x69, - 0x6b, 0x65, 0x20, 0x5c, 0x22, 0x2c, 0x20, 0x5c, 0x5c, 0x2c, 0x20, 0x27, - 0x2c, 0x20, 0x7e, 0x2c, 0x20, 0x3b, 0x2c, 0x20, 0x40, 0x2c, 0x20, 0x60, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x22, - 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, - 0x2e, 0x2a, 0x29, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, - 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, - 0x72, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, - 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, - 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x74, 0x72, - 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, - 0x28, 0x2e, 0x2a, 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, - 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x7b, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x6f, 0x20, 0x25, 0x73, 0x23, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, - 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x20, 0x69, - 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, - 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, - 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x6f, - 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x5b, + 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x66, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x5d, 0x20, @@ -10296,1323 +9881,1422 @@ unsigned char loadfennel_lua[] = { 0x74, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x61, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, - 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, - 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, - 0x67, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, - 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, - 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, - 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, - 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x7d, 0x2c, - 0x20, 0x5b, 0x22, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, 0x2c, - 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x28, 0x2e, - 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, - 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65, 0x61, 0x72, - 0x6c, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, - 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, 0x73, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x69, 0x6e, - 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, - 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x27, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x2c, - 0x20, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x72, - 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x61, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x20, 0x73, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, - 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, - 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x25, 0x73, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, - 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, - 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x7d, 0x2c, 0x20, - 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, - 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, + 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x25, + 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x72, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x7d, + 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, + 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x29, + 0x2c, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x28, + 0x2e, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x65, 0x61, + 0x72, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x20, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0x20, 0x22, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x69, 0x6c, 0x6c, + 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x72, 0x3a, 0x20, 0x28, 0x2e, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, + 0x72, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x25, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6c, + 0x69, 0x6b, 0x65, 0x20, 0x5c, 0x22, 0x2c, 0x20, 0x5c, 0x5c, 0x2c, 0x20, + 0x27, 0x2c, 0x20, 0x7e, 0x2c, 0x20, 0x3b, 0x2c, 0x20, 0x40, 0x2c, 0x20, + 0x60, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, - 0x6f, 0x6c, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, - 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, - 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x70, 0x75, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, 0x20, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x77, 0x61, 0x73, - 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x7d, 0x2c, - 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x28, 0x2e, - 0x2a, 0x29, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x6c, 0x6f, 0x6f, - 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, - 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x27, 0x73, 0x20, 0x61, - 0x20, 0x74, 0x79, 0x70, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x47, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2c, - 0x20, 0x65, 0x67, 0x2e, 0x20, 0x5f, 0x47, 0x2e, 0x25, 0x73, 0x20, 0x69, - 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, - 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, - 0x6f, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x25, 0x73, 0x20, 0x69, 0x73, 0x20, 0x69, - 0x6e, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x25, 0x73, 0x20, 0x61, 0x73, - 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x66, 0x69, 0x78, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x20, 0x74, 0x79, 0x70, 0x6f, 0x20, 0x73, 0x6f, 0x20, 0x25, 0x73, 0x20, - 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x72, - 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x5f, 0x25, 0x73, - 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x28, 0x2e, 0x2a, 0x29, - 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, - 0x67, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x22, 0x2c, - 0x20, 0x22, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x73, - 0x69, 0x6e, 0x67, 0x20, 0x5f, 0x47, 0x2e, 0x25, 0x73, 0x20, 0x69, 0x6e, - 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6c, 0x79, 0x22, 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, - 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, - 0x61, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6d, 0x73, 0x67, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x29, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x30, 0x20, - 0x3c, 0x20, 0x23, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, + 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x22, + 0x2c, 0x20, 0x22, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, + 0x6f, 0x6e, 0x2d, 0x64, 0x69, 0x67, 0x69, 0x74, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, + 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, + 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x20, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, + 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x64, + 0x69, 0x67, 0x69, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x67, 0x69, 0x74, 0x22, 0x7d, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, + 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, + 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x7d, 0x2c, 0x20, + 0x5b, 0x22, 0x24, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x24, 0x2e, 0x2e, 0x2e, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, + 0x20, 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x24, 0x2e, 0x2e, + 0x2e, 0x20, 0x6f, 0x72, 0x20, 0x24, 0x2c, 0x20, 0x24, 0x31, 0x2c, 0x20, + 0x24, 0x32, 0x2c, 0x20, 0x24, 0x33, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x22, + 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, + 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x22, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x73, 0x6f, 0x20, 0x61, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6f, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x69, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x5f, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x79, 0x70, 0x6f, 0x73, 0x22, 0x7d, 0x2c, 0x20, 0x5b, 0x22, 0x75, + 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, + 0x6f, 0x73, 0x22, 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x2c, + 0x20, 0x73, 0x75, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6d, 0x73, 0x67, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x30, 0x20, 0x3c, 0x20, 0x23, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x75, 0x67, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, - 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x75, 0x67, - 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, - 0x2c, 0x20, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x73, 0x75, 0x67, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, - 0x75, 0x74, 0x2c, 0x20, 0x73, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, - 0x73, 0x75, 0x67, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, - 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, - 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x23, 0x66, 0x3a, 0x72, 0x65, - 0x61, 0x64, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x66, - 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, + 0x75, 0x67, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, + 0x20, 0x73, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x67, + 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, - 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, - 0x20, 0x5f, 0x33, 0x66, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, - 0x5f, 0x33, 0x66, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, - 0x30, 0x29, 0x20, 0x2b, 0x20, 0x23, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x23, 0x6e, 0x65, 0x77, 0x6c, 0x69, - 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, - 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, - 0x65, 0x2c, 0x20, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x2c, - 0x20, 0x22, 0x28, 0x2e, 0x2d, 0x29, 0x28, 0x5c, 0x31, 0x33, 0x3f, 0x5c, - 0x6e, 0x29, 0x22, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, - 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x62, - 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, - 0x5b, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, - 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, - 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x3d, 0x20, - 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, - 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, - 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x22, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, - 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, 0x22, 0x2c, 0x20, 0x28, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2d, 0x20, 0x62, - 0x6f, 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, - 0x22, 0x5e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x5e, 0x22, 0x2c, 0x20, 0x6d, - 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x28, 0x62, 0x79, 0x74, - 0x65, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x62, 0x6f, 0x6c, - 0x20, 0x2b, 0x20, 0x23, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x29, 0x20, 0x2d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, - 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, - 0x74, 0x2c, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, - 0x65, 0x70, 0x28, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2d, 0x20, 0x62, 0x6f, 0x6c, - 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5e, - 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, - 0x75, 0x74, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, - 0x72, 0x73, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x22, - 0x2a, 0x20, 0x54, 0x72, 0x79, 0x20, 0x25, 0x73, 0x2e, 0x22, 0x29, 0x3a, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, + 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x20, + 0x31, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x23, 0x66, 0x3a, + 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, 0x33, + 0x66, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6e, 0x65, + 0x77, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x28, 0x28, 0x5f, 0x33, 0x66, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x6f, + 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x23, 0x74, 0x68, 0x69, 0x73, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x23, 0x6e, 0x65, 0x77, + 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x2d, 0x20, 0x23, 0x74, 0x68, + 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, - 0x5f, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, - 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x6c, 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x28, 0x22, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, - 0x6e, 0x20, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, 0x25, - 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, - 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, - 0x29, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x61, 0x73, 0x74, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, - 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x5f, - 0x6d, 0x73, 0x67, 0x28, 0x28, 0x22, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x3a, - 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6d, 0x73, - 0x67, 0x29, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x7d, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, 0x22, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, - 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, 0x3d, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x29, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x69, 0x65, - 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x66, 0x72, 0x69, - 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x72, 0x61, 0x6e, - 0x75, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x67, 0x65, 0x74, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, - 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x22, 0x22, - 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x23, - 0x63, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x62, 0x20, 0x3d, 0x20, 0x63, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, - 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x2c, 0x20, - 0x5f, 0x33, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, - 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, 0x5f, - 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x63, - 0x68, 0x61, 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x5f, 0x34, 0x5f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x32, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x3a, 0x62, 0x79, - 0x74, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x2c, 0x20, + 0x22, 0x28, 0x2e, 0x2d, 0x29, 0x28, 0x5c, 0x31, 0x33, 0x3f, 0x5c, 0x6e, + 0x29, 0x22, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, - 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x28, 0x73, 0x74, 0x72, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x73, 0x74, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, - 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x23, 0x21, 0x22, 0x2c, 0x20, 0x22, - 0x3b, 0x3b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x30, 0x3a, 0x62, - 0x79, 0x74, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, - 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, - 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x5b, 0x31, 0x32, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x31, - 0x32, 0x35, 0x2c, 0x20, 0x5b, 0x31, 0x32, 0x35, 0x5d, 0x20, 0x3d, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x34, 0x30, 0x5d, 0x20, 0x3d, - 0x20, 0x34, 0x31, 0x2c, 0x20, 0x5b, 0x34, 0x31, 0x5d, 0x20, 0x3d, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x39, 0x31, 0x5d, 0x20, 0x3d, - 0x20, 0x39, 0x33, 0x2c, 0x20, 0x5b, 0x39, 0x33, 0x5d, 0x20, 0x3d, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, - 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x32, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x62, 0x20, 0x3e, 0x3d, 0x20, - 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3d, - 0x20, 0x31, 0x33, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, - 0x61, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x30, 0x20, 0x3d, - 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x30, 0x20, 0x3d, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x62, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x62, - 0x30, 0x20, 0x3e, 0x20, 0x33, 0x32, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, - 0x30, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, - 0x3d, 0x20, 0x31, 0x32, 0x37, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x39, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, - 0x31, 0x32, 0x36, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, - 0x20, 0x7e, 0x3d, 0x20, 0x35, 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x34, 0x34, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x36, 0x34, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, - 0x20, 0x39, 0x36, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x33, 0x35, 0x5d, - 0x20, 0x3d, 0x20, 0x22, 0x68, 0x61, 0x73, 0x68, 0x66, 0x6e, 0x22, 0x2c, - 0x20, 0x5b, 0x33, 0x39, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x6f, - 0x74, 0x65, 0x22, 0x2c, 0x20, 0x5b, 0x34, 0x34, 0x5d, 0x20, 0x3d, 0x20, - 0x22, 0x75, 0x6e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x5b, - 0x39, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, - 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x72, 0x28, 0x67, 0x65, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2c, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, + 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x5f, 0x31, + 0x34, 0x32, 0x5f, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x31, 0x34, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, + 0x31, 0x34, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x34, 0x33, 0x5f, 0x5b, + 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x34, + 0x33, 0x5f, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, - 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, + 0x67, 0x5f, 0x31, 0x34, 0x33, 0x5f, 0x5b, 0x22, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x34, 0x33, + 0x5f, 0x5b, 0x22, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x6b, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x28, 0x6d, 0x73, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x6d, 0x73, 0x67, 0x2c, 0x20, + 0x22, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x63, 0x6f, + 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x6b, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, + 0x6e, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, 0x22, + 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x20, 0x2d, 0x20, 0x62, 0x6f, 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x5e, + 0x22, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, + 0x28, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x2c, 0x20, 0x28, + 0x28, 0x62, 0x6f, 0x6c, 0x20, 0x2b, 0x20, 0x23, 0x63, 0x6f, 0x64, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x2d, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x72, 0x65, 0x70, 0x28, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x28, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x2d, 0x20, 0x62, 0x6f, + 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x5e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x75, 0x67, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x30, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x28, 0x22, 0x2a, 0x20, + 0x54, 0x72, 0x79, 0x20, 0x25, 0x73, 0x2e, 0x22, 0x29, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, 0x75, 0x74, + 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x73, 0x67, + 0x2c, 0x20, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x31, 0x34, + 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x61, 0x73, 0x74, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, + 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x31, 0x34, + 0x38, 0x5f, 0x5b, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x65, 0x74, 0x5f, 0x31, 0x34, 0x38, 0x5f, 0x5b, 0x22, 0x6c, 0x69, 0x6e, + 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, + 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x28, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, + 0x25, 0x73, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, 0x25, 0x73, 0x22, + 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, + 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x5b, 0x22, 0x61, 0x73, 0x74, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x5d, 0x28, 0x61, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x73, + 0x67, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x6c, 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x28, 0x22, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x20, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x20, 0x25, 0x73, + 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x7d, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, + 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x2e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x3d, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x2e, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x67, 0x65, + 0x74, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, + 0x3d, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, + 0x35, 0x30, 0x5f, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x63, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x3a, + 0x62, 0x79, 0x74, 0x65, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x35, 0x31, 0x5f, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x5f, 0x31, 0x35, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x5f, + 0x31, 0x35, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x63, 0x68, 0x61, 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x31, 0x35, 0x31, 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x5f, 0x31, 0x35, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x20, 0x3d, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x35, + 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x75, - 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x75, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, - 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x62, 0x20, 0x3d, 0x20, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x2c, - 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x62, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x62, 0x79, - 0x74, 0x65, 0x28, 0x7b, 0x5b, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, - 0x73, 0x69, 0x7a, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x23, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, - 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, - 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x22, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x61, 0x73, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x35, 0x36, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x22, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x5f, 0x31, 0x35, 0x30, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x35, 0x36, + 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, + 0x23, 0x21, 0x22, 0x2c, 0x20, 0x22, 0x3b, 0x3b, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x5b, - 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, - 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, - 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, - 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x29, + 0x6e, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x30, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x35, 0x37, 0x5f, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x5b, 0x34, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x34, 0x31, 0x2c, 0x20, + 0x5b, 0x34, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x5b, 0x39, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x39, 0x33, 0x2c, 0x20, + 0x5b, 0x39, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x5b, 0x31, 0x32, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x35, + 0x2c, 0x20, 0x5b, 0x31, 0x32, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x32, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x28, 0x28, 0x62, 0x20, 0x3e, 0x3d, 0x20, 0x39, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x20, 0x3c, 0x3d, 0x20, 0x31, + 0x33, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x3a, - 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x3a, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, + 0x62, 0x30, 0x20, 0x3d, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x30, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, + 0x74, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x28, 0x62, 0x30, 0x20, 0x3e, 0x20, 0x33, 0x32, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x69, + 0x6d, 0x73, 0x5b, 0x62, 0x30, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x31, 0x32, 0x37, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x34, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, + 0x20, 0x33, 0x39, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, + 0x20, 0x7e, 0x3d, 0x20, 0x31, 0x32, 0x36, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x35, 0x39, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x34, + 0x34, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x30, 0x20, 0x7e, + 0x3d, 0x20, 0x36, 0x34, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, + 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x39, 0x36, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x5b, 0x33, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x68, 0x61, 0x73, 0x68, + 0x66, 0x6e, 0x22, 0x2c, 0x20, 0x5b, 0x33, 0x39, 0x5d, 0x20, 0x3d, 0x20, + 0x22, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x5b, 0x34, 0x34, + 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x75, 0x6e, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x22, 0x2c, 0x20, 0x5b, 0x39, 0x36, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x28, 0x67, 0x65, 0x74, 0x62, 0x79, + 0x74, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x75, 0x62, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, + 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x3d, + 0x20, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x2c, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x2c, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x62, 0x79, 0x74, 0x65, 0x28, + 0x7b, 0x5b, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x20, 0x3d, + 0x3d, 0x20, 0x31, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x28, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x61, 0x73, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x31, 0x36, + 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, + 0x31, 0x36, 0x32, 0x5f, 0x5b, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, + 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x31, 0x36, 0x32, + 0x5f, 0x5b, 0x22, 0x75, 0x6e, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, + 0x79, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x6d, + 0x73, 0x67, 0x2c, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x6d, - 0x73, 0x67, 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x28, + 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x72, 0x6f, 0x6f, 0x74, + 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x6e, 0x66, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x20, 0x6f, + 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x22, 0x25, 0x73, 0x3a, 0x25, 0x73, 0x3a, 0x20, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x25, 0x73, 0x22, + 0x2c, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x6d, 0x73, 0x67, + 0x29, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x72, - 0x69, 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x28, 0x6d, 0x73, 0x67, 0x2c, - 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x29, - 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, - 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, - 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5b, 0x22, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5d, 0x28, 0x6d, 0x73, + 0x67, 0x2c, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x62, + 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, + 0x66, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x36, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5b, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, - 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x20, 0x3d, 0x20, 0x76, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, - 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, - 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x29, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, - 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x30, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x5f, 0x31, 0x36, 0x35, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x76, 0x61, + 0x6c, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x3d, 0x20, 0x76, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x31, 0x36, 0x35, 0x5f, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x28, 0x5f, 0x31, 0x36, 0x35, 0x5f, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x28, + 0x5f, 0x31, 0x36, 0x35, 0x5f, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x36, 0x36, + 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x31, 0x36, 0x36, + 0x5f, 0x29, 0x5b, 0x22, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, + 0x31, 0x36, 0x36, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x6c, 0x69, 0x73, 0x74, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, + 0x79, 0x6d, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6c, 0x69, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x5f, 0x31, 0x36, 0x35, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x5f, + 0x31, 0x36, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, - 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, - 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 0x20, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, + 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, + 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x22, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x36, 0x38, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x3d, 0x20, + 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x38, 0x5f, 0x20, + 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x36, 0x38, 0x5f, 0x20, 0x3d, 0x20, + 0x22, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x5f, 0x31, 0x36, 0x38, + 0x5f, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2c, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x23, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x30, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x3d, - 0x20, 0x22, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x62, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x20, 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x62, 0x2c, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x31, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x62, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x37, 0x32, 0x5f, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x37, + 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x5f, 0x31, 0x37, 0x31, 0x5f, 0x2c, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x31, 0x37, + 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, - 0x72, 0x25, 0x73, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x5f, 0x30, 0x5f, - 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, - 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x63, 0x63, - 0x75, 0x6d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x5f, 0x31, 0x37, 0x32, + 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x33, 0x66, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x5f, 0x33, 0x66, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x29, 0x2c, 0x20, 0x7b, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, + 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x23, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, - 0x3e, 0x20, 0x30, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x62, 0x2c, 0x20, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x31, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x62, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, - 0x2c, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, - 0x6e, 0x63, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x29, 0x2c, 0x20, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x7d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, - 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, - 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, - 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x72, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, - 0x62, 0x5d, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, - 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x6c, 0x69, 0x73, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x65, - 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x75, - 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, - 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, - 0x74, 0x62, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, - 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x6e, - 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, - 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x64, + 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x2c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x66, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x29, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x62, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x62, 0x6c, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x76, 0x61, 0x6c, 0x29, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x37, 0x35, 0x5f, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x31, 0x37, 0x35, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, - 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, + 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x62, 0x6c, + 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x62, - 0x6c, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x6b, + 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x23, 0x74, + 0x62, 0x6c, 0x5d, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x31, 0x2c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x23, - 0x74, 0x62, 0x6c, 0x5d, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x31, - 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, - 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x6f, - 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, + 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x33, 0x66, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, + 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x74, + 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6e, + 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x62, + 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, - 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x74, - 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, - 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, - 0x23, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, - 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, - 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, - 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, - 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x74, 0x62, - 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x20, 0x25, 0x20, 0x32, 0x29, - 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x62, - 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, - 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, - 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, - 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, - 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x32, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, - 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, - 0x29, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, - 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5b, - 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x62, - 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x65, - 0x79, 0x73, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x0a, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x23, + 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, + 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x74, + 0x62, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x2e, 0x6b, 0x65, 0x79, 0x73, - 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x76, 0x61, 0x6c, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, - 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, - 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, - 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x74, 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x5f, 0x63, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x28, + 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x23, 0x74, 0x62, 0x6c, 0x20, 0x25, 0x20, + 0x32, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x74, 0x62, 0x6c, + 0x2c, 0x20, 0x32, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, + 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, + 0x6d, 0x3f, 0x22, 0x5d, 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, + 0x28, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x62, 0x6c, + 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5b, 0x74, 0x62, 0x6c, 0x5b, 0x69, 0x5d, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x69, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x74, 0x62, + 0x6c, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x62, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, + 0x6c, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x6f, 0x70, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, - 0x28, 0x22, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, + 0x28, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, - 0x62, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2c, 0x20, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, - 0x6f, 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, - 0x2e, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, - 0x3d, 0x20, 0x34, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x39, 0x33, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x6f, - 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x5f, 0x63, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, - 0x72, 0x73, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x62, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x31, 0x5d, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x5b, 0x32, 0x5d, 0x20, - 0x3d, 0x3d, 0x20, 0x39, 0x32, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x62, - 0x61, 0x63, 0x6b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x22, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x30, - 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, - 0x30, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x30, 0x5f, - 0x30, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x6f, 0x70, 0x2e, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x6f, + 0x70, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x7e, 0x3d, 0x20, + 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x6d, 0x69, 0x73, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x72, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x74, 0x6f, 0x70, 0x2e, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x72, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x62, 0x79, 0x74, + 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x31, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x74, + 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, + 0x20, 0x39, 0x33, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, 0x6f, 0x70, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, + 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, + 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, + 0x62, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x20, 0x3d, + 0x20, 0x7b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x62, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, + 0x31, 0x38, 0x35, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, + 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, 0x5b, 0x32, 0x5d, + 0x20, 0x3d, 0x3d, 0x20, 0x39, 0x32, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x22, + 0x62, 0x61, 0x63, 0x6b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, 0x5b, 0x31, 0x5d, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, + 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, + 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x28, 0x5f, 0x31, 0x38, 0x35, 0x5f, 0x29, 0x5b, 0x31, 0x5d, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x5f, 0x31, 0x38, + 0x35, 0x5f, 0x29, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x30, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x2c, 0x20, 0x28, 0x23, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, + 0x2d, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, - 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, - 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x31, 0x38, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, + 0x3d, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x30, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x6e, + 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x28, 0x63, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x7b, 0x5b, 0x37, 0x5d, 0x20, 0x3d, + 0x20, 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x38, 0x5d, 0x20, + 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, 0x5b, 0x39, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x5b, 0x31, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x2c, 0x20, + 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x76, 0x22, + 0x2c, 0x20, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, + 0x66, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x22, + 0x5c, 0x5c, 0x72, 0x22, 0x7d, 0x29, 0x5b, 0x63, 0x3a, 0x62, 0x79, 0x74, + 0x65, 0x28, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x33, 0x34, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x33, 0x34, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, + 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x61, 0x64, 0x65, 0x6e, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x30, 0x20, - 0x7e, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x29, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, - 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x67, - 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x5b, 0x5c, 0x37, 0x2d, 0x5c, 0x31, 0x33, 0x5d, 0x22, 0x2c, 0x20, + 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x38, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x28, + 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x22, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x29, 0x28, 0x28, 0x22, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x38, 0x39, 0x5f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x38, + 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x6e, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x38, 0x39, + 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x49, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, - 0x5f, 0x63, 0x68, 0x61, 0x72, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x7b, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, - 0x6e, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, - 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x3d, - 0x20, 0x22, 0x5c, 0x5c, 0x66, 0x22, 0x2c, 0x20, 0x5b, 0x31, 0x33, 0x5d, - 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x72, 0x22, 0x2c, 0x20, 0x5b, 0x37, - 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, - 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, - 0x5b, 0x39, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x74, 0x22, 0x7d, - 0x29, 0x5b, 0x63, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2c, 0x20, 0x7b, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x33, 0x34, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x33, 0x34, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, - 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, - 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x64, 0x65, 0x6e, - 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, - 0x77, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, - 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, - 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5c, 0x37, 0x2d, 0x5c, - 0x31, 0x33, 0x5d, 0x22, 0x2c, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, - 0x5f, 0x63, 0x68, 0x61, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, - 0x5f, 0x47, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, - 0x64, 0x29, 0x28, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, - 0x65, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x66, 0x6e, 0x20, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x66, 0x6e, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, - 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, - 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x5b, 0x62, 0x5d, - 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x77, 0x68, 0x69, 0x74, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x6e, 0x65, - 0x78, 0x74, 0x62, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x72, 0x75, - 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, - 0x6e, 0x65, 0x78, 0x74, 0x62, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x35, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x71, 0x75, 0x6f, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, - 0x6d, 0x28, 0x22, 0x23, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, - 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, - 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, - 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, - 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, + 0x2c, 0x20, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x5b, 0x62, 0x5d, 0x2c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x20, 0x3d, 0x20, + 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x6e, 0x65, 0x78, + 0x74, 0x62, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x6e, + 0x65, 0x78, 0x74, 0x62, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x62, 0x20, 0x7e, 0x3d, 0x20, 0x33, 0x35, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, - 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x73, 0x79, 0x6d, 0x28, 0x22, 0x23, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, 0x28, 0x6e, 0x65, 0x78, + 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, - 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, - 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x6f, - 0x74, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, - 0x64, 0x28, 0x22, 0x5e, 0x5f, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, - 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, - 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, - 0x25, 0x64, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x28, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, - 0x74, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, - 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x5c, 0x22, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, - 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, - 0x22, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, - 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x28, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, - 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, + 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x62, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, + 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x67, 0x65, + 0x74, 0x62, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x70, 0x65, 0x64, + 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x61, 0x77, 0x73, + 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5e, 0x5f, 0x22, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, + 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x64, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x28, + 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x72, + 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, + 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x5c, 0x22, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, 0x22, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x39, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x74, + 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x35, 0x5f, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x31, 0x39, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x39, 0x35, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, @@ -11663,345 +11347,1810 @@ unsigned char loadfennel_lua[] = { 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, - 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x2e, 0x2b, - 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, - 0x6d, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, - 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x23, 0x72, 0x61, 0x77, 0x73, - 0x74, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, - 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x2e, 0x2b, 0x5b, 0x25, - 0x2e, 0x3a, 0x5d, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, - 0x6d, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, - 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, - 0x68, 0x61, 0x72, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, - 0x70, 0x28, 0x7b, 0x62, 0x7d, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, - 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, - 0x61, 0x72, 0x67, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, - 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x5e, 0x3a, 0x2e, 0x2b, 0x24, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, - 0x62, 0x28, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, - 0x79, 0x6d, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, - 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x72, - 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, - 0x65, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, - 0x65, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x62, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x35, 0x39, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, - 0x2c, 0x20, 0x7b, 0x22, 0x3b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, - 0x5b, 0x62, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, - 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, - 0x66, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x61, 0x77, + 0x73, 0x74, 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x24, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, - 0x3d, 0x3d, 0x20, 0x33, 0x34, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, + 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, 0x28, 0x28, + 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, + 0x23, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2b, 0x20, 0x31, + 0x20, 0x2b, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x22, 0x3a, 0x24, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x3a, 0x2e, 0x2b, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x28, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x79, 0x6d, 0x3a, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x2c, 0x20, + 0x28, 0x28, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x2d, 0x20, 0x23, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2b, + 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, 0x66, 0x69, 0x6e, 0x64, + 0x28, 0x22, 0x3a, 0x2e, 0x2b, 0x5b, 0x25, 0x2e, 0x3a, 0x5d, 0x22, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x61, 0x77, + 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x62, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x73, 0x79, 0x6d, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x7b, 0x62, 0x7d, + 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x72, 0x75, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x72, + 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2e, + 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, - 0x73, 0x5b, 0x62, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x69, 0x66, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, - 0x5f, 0x33, 0x66, 0x28, 0x62, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x62, - 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, - 0x79, 0x74, 0x65, 0x28, 0x22, 0x7e, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, - 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x69, 0x6c, - 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x22, 0x2c, - 0x20, 0x62, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x62, 0x2c, 0x20, 0x75, 0x6e, - 0x67, 0x65, 0x74, 0x62, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x22, 0x69, 0x6c, 0x6c, - 0x65, 0x67, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, - 0x65, 0x72, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, - 0x64, 0x6f, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, - 0x72, 0x65, 0x74, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x3a, 0x2e, 0x2b, 0x24, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x61, + 0x77, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x32, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x72, 0x61, 0x77, + 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x28, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x64, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x72, 0x61, 0x77, 0x73, 0x74, 0x72, + 0x29, 0x2c, 0x20, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x65, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, + 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, + 0x33, 0x66, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x35, 0x39, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x2c, 0x20, 0x7b, 0x22, + 0x3b, 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x65, + 0x6c, 0x69, 0x6d, 0x73, 0x5b, 0x62, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, 0x33, + 0x34, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x5b, 0x62, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x33, 0x66, 0x28, + 0x62, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x62, 0x20, 0x3d, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, + 0x22, 0x7e, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x73, 0x79, 0x6d, 0x28, 0x62, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, + 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x22, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, + 0x6c, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x22, 0x2c, 0x20, 0x62, 0x2c, 0x20, + 0x67, 0x65, 0x74, 0x62, 0x2c, 0x20, 0x75, 0x6e, 0x67, 0x65, 0x74, 0x62, + 0x2c, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x28, 0x22, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x3a, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x63, 0x68, 0x61, 0x72, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x6f, 0x6e, + 0x65, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x74, + 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x28, + 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x32, 0x30, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x2c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2c, 0x20, 0x5f, 0x32, 0x30, 0x32, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, + 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x72, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, + 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, + 0x68, 0x61, 0x72, 0x5f, 0x33, 0x66, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x20, 0x5b, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x35, 0x2c, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, + 0x36, 0x2c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, + 0x37, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x75, 0x61, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x3d, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x5f, 0x31, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x5f, 0x29, 0x2e, 0x5f, + 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x5f, 0x29, 0x2e, + 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x28, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x33, 0x5f, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, + 0x33, 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x28, 0x5f, 0x33, 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x69, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x33, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x32, 0x61, 0x28, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x35, 0x5f, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x5f, 0x35, 0x5f, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x28, 0x5f, 0x35, + 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x5f, + 0x29, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x28, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x23, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x72, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x5f, 0x37, 0x5f, 0x2c, 0x20, 0x5f, + 0x39, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x38, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x38, + 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x30, 0x5f, 0x20, + 0x3d, 0x20, 0x5f, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, + 0x5f, 0x31, 0x30, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x62, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x28, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x20, 0x62, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x61, 0x20, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x5b, 0x74, 0x61, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x62, 0x20, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5b, 0x74, 0x62, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x64, 0x74, 0x61, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x74, 0x62, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x64, 0x74, + 0x61, 0x20, 0x3c, 0x20, 0x64, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x64, 0x74, + 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x64, 0x74, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x28, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x28, 0x67, 0x65, 0x74, 0x62, 0x28, 0x29, 0x29, 0x29, 0x0a, + 0x28, 0x74, 0x61, 0x20, 0x3c, 0x20, 0x74, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x7b, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, - 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x5b, - 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, - 0x65, 0x20, 0x3d, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, - 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x20, - 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, - 0x65, 0x79, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, - 0x32, 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x20, 0x3c, 0x20, - 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, - 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, - 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x5f, 0x30, 0x5f, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, - 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x6b, 0x5d, 0x20, - 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x28, 0x69, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x69, - 0x64, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x69, 0x64, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, - 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, - 0x79, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x69, 0x64, 0x78, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, - 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x65, - 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x6e, 0x65, - 0x78, 0x74, 0x2c, 0x20, 0x74, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x67, 0x61, 0x70, 0x28, 0x6b, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x61, 0x70, 0x20, 0x3d, + 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x32, 0x61, 0x28, 0x6b, 0x76, 0x29, + 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x33, 0x5f, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6b, 0x76, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, + 0x31, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x31, + 0x34, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x69, + 0x29, 0x20, 0x3e, 0x20, 0x67, 0x61, 0x70, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x67, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x6b, 0x20, 0x2d, 0x20, 0x69, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x61, 0x70, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, - 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x75, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x20, 0x6f, - 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, - 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, - 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, - 0x31, 0x5b, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x78, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x20, - 0x3d, 0x20, 0x66, 0x30, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, - 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, + 0x6c, 0x6c, 0x5f, 0x67, 0x61, 0x70, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, 0x31, + 0x37, 0x5f, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x61, 0x63, + 0x68, 0x5f, 0x31, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x37, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x31, + 0x38, 0x5f, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x28, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x30, - 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, - 0x74, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2c, + 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, + 0x6b, 0x2c, 0x20, 0x7b, 0x6b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x6b, 0x76, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, + 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, + 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, + 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6b, 0x20, 0x3c, 0x20, 0x31, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, 0x33, 0x66, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x7b, 0x6b, 0x2c, + 0x20, 0x76, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, + 0x6f, 0x72, 0x74, 0x28, 0x6b, 0x76, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, + 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x67, 0x61, 0x70, 0x28, 0x6b, 0x76, 0x29, 0x20, + 0x3e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, + 0x61, 0x78, 0x2d, 0x73, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2d, 0x67, 0x61, + 0x70, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x5f, + 0x33, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x5f, 0x67, 0x61, + 0x70, 0x73, 0x28, 0x6b, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x5f, 0x32, 0x61, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x76, 0x2c, 0x20, + 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, - 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x20, 0x3d, 0x20, - 0x28, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x30, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x6e, 0x20, 0x5f, 0x32, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x73, 0x73, 0x6f, + 0x63, 0x5f, 0x33, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6b, 0x76, + 0x2c, 0x20, 0x5f, 0x32, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x28, 0x74, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, + 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, + 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x28, 0x6b, + 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x28, 0x76, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, + 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x61, 0x70, 0x70, 0x65, 0x61, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x6f, 0x72, + 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x61, + 0x76, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x20, 0x3d, 0x20, + 0x28, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x6c, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x28, + 0x73, 0x65, 0x65, 0x6e, 0x30, 0x2e, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x28, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x29, 0x5b, 0x74, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x30, 0x5b, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x69, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, + 0x30, 0x2e, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x30, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x74, 0x2c, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x74, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x32, 0x37, 0x5f, 0x2c, 0x20, + 0x5f, 0x32, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, + 0x74, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x38, + 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, + 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, + 0x3d, 0x20, 0x5f, 0x32, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, + 0x65, 0x65, 0x6e, 0x5b, 0x6b, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x6b, + 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x65, 0x6e, 0x5b, 0x76, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, 0x76, + 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x28, + 0x74, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x2c, 0x20, 0x6b, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5b, 0x22, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x28, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, + 0x65, 0x65, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x31, 0x20, + 0x3c, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5b, 0x74, + 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x64, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, + 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, + 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x28, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x32, 0x61, 0x28, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x69, 0x64, 0x29, 0x29, 0x20, + 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x65, 0x6e, + 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x65, + 0x72, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x70, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5c, + 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, 0x22, 0x2c, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, 0x32, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x73, + 0x65, 0x71, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x5b, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x5f, 0x33, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x73, 0x65, + 0x71, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x22, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x28, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, + 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, + 0x66, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x32, + 0x61, 0x28, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x29, 0x20, + 0x3e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, + 0x69, 0x6e, 0x65, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, + 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6f, + 0x70, 0x65, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x72, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6c, 0x65, + 0x6e, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x78, 0x2c, 0x20, 0x22, 0x5b, 0x25, 0x7a, 0x5c, 0x31, 0x2d, 0x5c, 0x31, + 0x32, 0x37, 0x5c, 0x31, 0x39, 0x32, 0x2d, 0x5c, 0x32, 0x34, 0x37, 0x5d, + 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x61, + 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x76, 0x65, 0x28, 0x74, + 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, + 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, + 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x3f, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, + 0x20, 0x3d, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x30, 0x20, + 0x3d, 0x20, 0x28, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, + 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, + 0x3f, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6c, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x33, + 0x35, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x23, 0x5f, 0x32, 0x34, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x5f, 0x33, 0x35, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, + 0x66, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, + 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, + 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x5f, + 0x33, 0x38, 0x5f, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x33, 0x39, 0x5f, 0x20, 0x3d, 0x20, + 0x5f, 0x33, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x20, 0x3d, + 0x20, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x33, 0x39, 0x5f, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x65, + 0x61, 0x63, 0x68, 0x5f, 0x33, 0x39, 0x5f, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x30, + 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x6b, 0x2c, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x30, 0x20, + 0x3d, 0x20, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x30, 0x20, 0x2b, 0x20, 0x73, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, + 0x6b, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, + 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6b, 0x30, 0x3a, 0x66, 0x69, 0x6e, + 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x76, + 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x6b, 0x30, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, + 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, + 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x2c, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x74, + 0x2c, 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x74, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, + 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, + 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x3f, 0x22, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, + 0x20, 0x3d, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x64, 0x30, 0x20, + 0x3d, 0x20, 0x28, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x30, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x65, 0x65, + 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x69, 0x64, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, + 0x33, 0x66, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, + 0x3d, 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, + 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x5f, 0x34, 0x33, 0x5f, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6b, 0x76, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x34, 0x34, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x34, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x34, 0x34, 0x5f, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, + 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x34, 0x34, 0x5f, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x28, 0x76, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, + 0x20, 0x76, 0x30, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, 0x5c, 0x6e, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x76, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, + 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, 0x35, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, + 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x2c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x2c, 0x20, 0x22, 0x73, + 0x65, 0x71, 0x22, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x32, 0x61, 0x28, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, 0x5d, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x7b, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x34, 0x38, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x5f, + 0x31, 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x25, 0x73, 0x2b, 0x22, 0x2c, 0x20, + 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x5f, 0x31, 0x35, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x62, 0x6c, 0x5f, 0x31, + 0x34, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x29, 0x5b, 0x69, 0x5f, 0x31, 0x35, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x5f, 0x31, 0x36, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x34, + 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5f, 0x31, 0x34, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x5f, 0x34, 0x38, 0x5f, + 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6f, 0x6e, 0x65, 0x2d, 0x6c, 0x69, + 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x6e, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x5f, 0x32, 0x61, 0x28, 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x29, 0x29, 0x20, 0x3e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x22, 0x5d, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x28, + 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, 0x22, 0x20, 0x22, 0x2c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6f, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3e, 0x3d, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x64, 0x65, 0x70, 0x74, + 0x68, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5b, 0x2e, 0x2e, 0x2e, + 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x35, 0x33, 0x5f, 0x28, + 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x5f, 0x33, + 0x66, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x5f, 0x35, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x20, 0x3d, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x28, + 0x74, 0x2c, 0x20, 0x70, 0x70, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5b, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x35, 0x34, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x34, 0x5f, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x35, 0x34, 0x5f, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x35, + 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, + 0x77, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x2b, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x35, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6d, + 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3f, 0x22, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x38, 0x5f, + 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, + 0x5f, 0x35, 0x38, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x35, 0x39, 0x5f, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, + 0x35, 0x38, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x35, 0x39, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x35, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x35, 0x39, + 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, + 0x69, 0x65, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x5f, 0x20, + 0x3d, 0x20, 0x5f, 0x35, 0x39, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x5f, + 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x38, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x35, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, + 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x35, 0x37, 0x5f, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x37, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, + 0x20, 0x70, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x35, 0x37, 0x5f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x36, 0x33, 0x5f, 0x2c, 0x20, 0x5f, 0x36, 0x34, 0x5f, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x76, 0x5f, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x74, 0x72, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x5f, 0x36, 0x34, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x36, 0x33, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, + 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x5b, 0x5d, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x22, 0x7b, 0x7d, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x5f, 0x36, 0x34, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x36, + 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, 0x5f, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x76, 0x65, 0x28, 0x78, 0x2c, 0x20, + 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x36, 0x33, + 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x36, 0x34, 0x5f, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x71, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x76, 0x20, + 0x3d, 0x20, 0x5f, 0x36, 0x33, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x70, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x28, 0x78, 0x2c, + 0x20, 0x6b, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, + 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x30, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x36, 0x38, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x22, + 0x2c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x36, 0x38, 0x5f, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x33, 0x66, 0x28, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3a, 0x66, 0x69, 0x6e, 0x64, + 0x28, 0x22, 0x5e, 0x5b, 0x2d, 0x25, 0x77, 0x3f, 0x5e, 0x5f, 0x21, 0x24, + 0x25, 0x26, 0x2a, 0x2b, 0x2e, 0x2f, 0x40, 0x7c, 0x3c, 0x3d, 0x3e, 0x5d, + 0x2b, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7b, 0x5b, 0x22, + 0x6d, 0x69, 0x6e, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x62, 0x79, + 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x37, 0x2c, 0x20, + 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, + 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x37, + 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x7d, 0x2c, 0x20, + 0x7b, 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x5b, 0x22, 0x6d, + 0x61, 0x78, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x32, 0x32, 0x33, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x63, + 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x32, 0x30, 0x34, 0x37, 0x2c, 0x20, 0x6c, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x32, 0x7d, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x6d, + 0x69, 0x6e, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x32, 0x32, 0x34, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x62, + 0x79, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x32, 0x33, 0x39, 0x2c, + 0x20, 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x32, 0x30, 0x34, 0x38, 0x2c, 0x20, 0x5b, 0x22, + 0x6d, 0x61, 0x78, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x36, 0x35, 0x35, 0x33, 0x35, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x33, 0x7d, 0x2c, 0x20, 0x7b, 0x5b, 0x22, 0x6d, 0x69, 0x6e, + 0x2d, 0x62, 0x79, 0x74, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x32, 0x34, + 0x30, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x62, 0x79, 0x74, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x32, 0x34, 0x37, 0x2c, 0x20, 0x5b, + 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x2c, 0x20, 0x5b, 0x22, 0x6d, + 0x61, 0x78, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x31, 0x31, 0x31, 0x34, 0x31, 0x31, 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x6e, + 0x20, 0x3d, 0x20, 0x34, 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, + 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x74, 0x66, + 0x38, 0x28, 0x73, 0x74, 0x72, 0x30, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x66, 0x38, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x62, 0x79, 0x74, 0x65, 0x28, 0x73, 0x74, 0x72, 0x30, 0x2c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x69, + 0x6e, 0x69, 0x74, 0x30, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x36, 0x39, + 0x5f, 0x2c, 0x5f, 0x37, 0x30, 0x5f, 0x2c, 0x5f, 0x37, 0x31, 0x5f, 0x29, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x5f, 0x36, 0x39, + 0x5f, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x37, 0x30, 0x5f, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x37, 0x30, 0x5f, 0x20, 0x3e, 0x3d, 0x20, + 0x5f, 0x37, 0x31, 0x5f, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x69, + 0x6e, 0x69, 0x74, 0x30, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x62, 0x79, + 0x74, 0x65, 0x22, 0x5d, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x2c, 0x69, 0x6e, + 0x69, 0x74, 0x30, 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x62, 0x79, 0x74, + 0x65, 0x22, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x69, + 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x37, 0x32, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x20, 0x2d, + 0x20, 0x69, 0x6e, 0x69, 0x74, 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x62, + 0x79, 0x74, 0x65, 0x22, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x30, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x28, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x69, 0x74, + 0x2e, 0x6c, 0x65, 0x6e, 0x20, 0x2b, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, + 0x65, 0x28, 0x73, 0x74, 0x72, 0x30, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x30, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x30, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x5f, 0x37, 0x34, 0x5f, 0x2c, 0x5f, 0x37, 0x35, 0x5f, 0x2c, 0x5f, 0x37, + 0x36, 0x5f, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x5f, 0x37, 0x34, 0x5f, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x37, 0x35, 0x5f, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x37, 0x35, 0x5f, 0x20, + 0x3e, 0x3d, 0x20, 0x5f, 0x37, 0x36, 0x5f, 0x29, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x28, 0x31, 0x39, 0x31, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x30, 0x2c, + 0x31, 0x32, 0x38, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x28, 0x63, + 0x6f, 0x64, 0x65, 0x30, 0x20, 0x2a, 0x20, 0x36, 0x34, 0x29, 0x20, 0x2b, + 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x30, 0x20, 0x2d, 0x20, 0x31, 0x32, + 0x38, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x5f, + 0x37, 0x32, 0x5f, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x5f, 0x37, 0x37, 0x5f, 0x2c, 0x5f, 0x37, 0x38, 0x5f, 0x2c, 0x5f, 0x37, + 0x39, 0x5f, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x5f, 0x37, 0x37, 0x5f, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x37, 0x38, 0x5f, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x37, 0x38, 0x5f, 0x20, + 0x3e, 0x3d, 0x20, 0x5f, 0x37, 0x39, 0x5f, 0x29, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, + 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x2c, + 0x69, 0x6e, 0x69, 0x74, 0x5b, 0x22, 0x6d, 0x69, 0x6e, 0x2d, 0x63, 0x6f, + 0x64, 0x65, 0x22, 0x5d, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x5f, 0x38, 0x30, 0x5f, 0x2c, 0x5f, 0x38, 0x31, 0x5f, 0x2c, 0x5f, 0x38, + 0x32, 0x5f, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x5f, 0x38, 0x30, 0x5f, 0x20, 0x3e, 0x3d, 0x20, 0x5f, 0x38, 0x31, 0x5f, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x38, 0x31, 0x5f, 0x20, + 0x3e, 0x3d, 0x20, 0x5f, 0x38, 0x32, 0x5f, 0x29, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x28, 0x35, 0x37, 0x33, 0x34, 0x33, 0x2c, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x35, 0x35, 0x32, 0x39, 0x36, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x2e, 0x6c, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x73, 0x74, 0x72, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x65, 0x78, 0x74, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x74, + 0x72, 0x2c, 0x20, 0x22, 0x5b, 0x5c, 0x31, 0x32, 0x38, 0x2d, 0x5c, 0x32, + 0x35, 0x35, 0x5d, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x23, 0x73, 0x74, 0x72, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x28, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x69, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2c, 0x20, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x69, 0x20, 0x2b, 0x20, 0x28, + 0x6c, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x2b, 0x20, + 0x2d, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x69, 0x20, 0x3c, + 0x3d, 0x20, 0x23, 0x73, 0x74, 0x72, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x5c, 0x5c, + 0x25, 0x30, 0x33, 0x64, 0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x6e, 0x65, 0x78, 0x74, 0x69, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x69, 0x20, 0x2b, + 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, + 0x78, 0x74, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x70, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x73, 0x63, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x38, 0x36, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, + 0x6e, 0x65, 0x77, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, + 0x32, 0x61, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x3c, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, + 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x2d, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x38, 0x36, + 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x38, 0x36, 0x5f, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x6e, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x38, 0x38, 0x5f, 0x28, 0x5f, 0x32, 0x34, + 0x31, 0x2c, 0x20, 0x5f, 0x32, 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, + 0x5c, 0x5c, 0x25, 0x30, 0x33, 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x5f, 0x32, 0x34, 0x32, 0x3a, 0x62, 0x79, 0x74, + 0x65, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x73, 0x63, 0x73, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x5b, 0x22, 0x5c, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, + 0x5c, 0x5c, 0x61, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x38, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x62, 0x22, 0x2c, 0x20, 0x5b, 0x22, + 0x5c, 0x31, 0x32, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x66, + 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, 0x31, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x22, 0x5c, 0x5c, 0x76, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x31, + 0x33, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x72, 0x22, 0x2c, + 0x20, 0x5b, 0x22, 0x5c, 0x39, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, + 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x5c, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x5b, 0x22, + 0x5c, 0x22, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x22, + 0x22, 0x2c, 0x20, 0x5b, 0x22, 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x5f, 0x38, 0x36, 0x5f, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x38, 0x38, 0x5f, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x74, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x5c, 0x22, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x5b, 0x25, 0x63, 0x5c, 0x5c, 0x5c, 0x22, 0x5d, 0x22, 0x2c, 0x20, + 0x65, 0x73, 0x63, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x22, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, 0x3f, + 0x22, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, + 0x38, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x73, 0x74, 0x72, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x72, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x28, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x38, 0x30, 0x2c, 0x20, 0x5b, 0x22, + 0x6f, 0x6e, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x32, 0x38, 0x2c, 0x20, 0x5b, 0x22, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x5b, 0x22, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x61, 0x73, 0x2d, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x6d, + 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, + 0x5b, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2d, 0x6e, 0x65, 0x77, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x75, 0x74, 0x66, 0x38, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, + 0x5b, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x73, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x2d, 0x67, 0x61, 0x70, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x28, 0x74, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x2c, 0x20, 0x73, 0x65, 0x65, + 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, + 0x7d, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, + 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x39, 0x30, 0x5f, 0x28, 0x78, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x33, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x28, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x61, + 0x6b, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x78, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x78, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x30, 0x20, 0x3d, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x30, 0x20, 0x3d, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x39, 0x33, + 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x39, 0x32, 0x5f, 0x20, 0x3d, 0x20, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x39, 0x32, + 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x5f, 0x39, 0x32, 0x5f, 0x29, 0x2e, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x39, 0x32, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, + 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x5f, + 0x39, 0x33, 0x5f, 0x28, 0x29, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, + 0x30, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x2c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x76, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x39, 0x35, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, + 0x33, 0x66, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, + 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x28, 0x78, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x30, 0x5b, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x30, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x5f, 0x39, 0x35, 0x5f, 0x28, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x3a, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x70, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x78, 0x30, 0x2c, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x76, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x74, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6e, 0x69, 0x6c, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x78, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x23, 0x3c, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x78, 0x30, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x70, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x39, 0x30, 0x5f, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x69, 0x65, 0x77, 0x28, 0x78, 0x2c, + 0x20, 0x5f, 0x33, 0x66, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x70, 0x28, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x78, 0x2c, 0x20, 0x5f, 0x33, + 0x66, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x2c, 0x20, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x69, 0x65, 0x77, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, + 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x65, + 0x77, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x31, 0x2e, + 0x30, 0x2e, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, + 0x72, 0x6e, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x47, 0x2e, 0x69, + 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, + 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, + 0x65, 0x72, 0x72, 0x29, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x28, + 0x22, 0x2d, 0x2d, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, 0x20, + 0x25, 0x73, 0x5c, 0x6e, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x29, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x6b, + 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x74, 0x29, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x6b, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x23, + 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x5b, + 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x6b, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x69, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, 0x20, 0x6b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x2c, + 0x20, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x31, 0x30, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x2c, 0x20, 0x5f, + 0x32, 0x34, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x20, + 0x3c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x5f, + 0x32, 0x34, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6b, 0x65, 0x79, + 0x73, 0x2c, 0x20, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x63, 0x63, + 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x28, + 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x62, + 0x6c, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, + 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, + 0x3d, 0x20, 0x73, 0x75, 0x63, 0x63, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x65, + 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x74, 0x2c, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x5f, 0x32, 0x34, 0x31, 0x5b, 0x66, 0x5d, 0x0a, 0x20, + 0x6e, 0x20, 0x6d, 0x61, 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x2c, 0x20, + 0x5f, 0x33, 0x66, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, + 0x28, 0x5f, 0x33, 0x66, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, + 0x20, 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, + 0x31, 0x30, 0x34, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x5b, 0x66, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, + 0x34, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x78, 0x20, + 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x5f, 0x20, 0x3d, 0x20, + 0x66, 0x30, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, + 0x31, 0x30, 0x36, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x36, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, + 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, + 0x76, 0x6d, 0x61, 0x70, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x5f, + 0x33, 0x66, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x28, + 0x5f, 0x33, 0x66, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x66, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, + 0x3d, 0x20, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, + 0x30, 0x38, 0x5f, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x5f, 0x32, 0x34, 0x31, 0x29, 0x5b, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x30, 0x38, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x78, 0x20, 0x69, + 0x6e, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x31, 0x30, + 0x5f, 0x2c, 0x20, 0x5f, 0x31, 0x31, 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x66, + 0x30, 0x28, 0x6b, 0x2c, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x5f, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x31, + 0x31, 0x5f, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, + 0x31, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, + 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x30, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x31, 0x31, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x78, 0x20, 0x69, 0x6e, 0x20, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, - 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x2c, 0x20, - 0x5f, 0x32, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x30, 0x28, 0x6b, 0x2c, - 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, - 0x5f, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x30, 0x5b, 0x6b, 0x65, 0x79, - 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x30, 0x2c, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6f, 0x75, 0x74, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x66, 0x72, 0x6f, - 0x6d, 0x2c, 0x20, 0x74, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x30, 0x20, 0x3d, 0x20, 0x28, - 0x74, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x30, 0x5b, 0x6b, - 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x74, 0x6f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, - 0x66, 0x28, 0x78, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x6e, 0x29, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x70, 0x79, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x5f, 0x33, 0x66, + 0x74, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x74, + 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x5b, 0x6b, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x6f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, + 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x28, 0x6e, - 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, - 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, - 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x2c, 0x20, 0x74, 0x62, 0x6c, - 0x2c, 0x20, 0x28, 0x28, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x20, - 0x2b, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x31, 0x31, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x28, + 0x5f, 0x33, 0x66, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x33, + 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x33, 0x5f, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x31, 0x33, + 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, + 0x28, 0x78, 0x2c, 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x28, 0x28, 0x5f, + 0x33, 0x66, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x62, @@ -12037,362 +13186,394 @@ unsigned char loadfennel_lua[] = { 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, - 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, - 0x30, 0x5f, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x69, - 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x31, 0x35, 0x5f, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x5f, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x20, 0x3d, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x31, 0x31, 0x35, 0x5f, 0x29, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x5f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, + 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x69, 0x6c, + 0x5f, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x5f, 0x33, 0x66, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x61, 0x66, 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6b, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x61, 0x78, 0x20, 0x3d, 0x20, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5b, 0x69, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x6d, 0x61, 0x70, 0x28, 0x73, 0x61, 0x66, 0x65, 0x2c, 0x20, + 0x28, 0x5f, 0x33, 0x66, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x32, 0x20, 0x6f, 0x72, 0x20, 0x76, 0x69, 0x65, 0x77, 0x29, 0x29, 0x2c, + 0x20, 0x22, 0x20, 0x22, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x72, - 0x65, 0x66, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, - 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, 0x79, - 0x6d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x2c, - 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, 0x30, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x69, - 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6b, 0x20, 0x3e, 0x20, 0x6d, 0x61, - 0x78, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x6b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, - 0x78, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x61, 0x66, 0x65, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, - 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x69, 0x6c, 0x5f, - 0x73, 0x79, 0x6d, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, - 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x22, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x70, - 0x28, 0x73, 0x61, 0x66, 0x65, 0x2c, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x32, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x22, - 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x29, 0x20, 0x2e, 0x2e, - 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x2c, 0x20, 0x74, - 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x28, 0x61, 0x2c, - 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x28, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x61, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x62, - 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, - 0x33, 0x63, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x5b, 0x31, - 0x5d, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x28, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x53, 0x59, 0x4d, - 0x42, 0x4f, 0x4c, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x65, 0x71, 0x20, 0x3d, - 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, - 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x6c, 0x74, 0x20, - 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x63, 0x2c, 0x20, 0x5f, 0x5f, + 0x63, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, + 0x64, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x64, 0x65, 0x72, + 0x65, 0x66, 0x28, 0x61, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x65, 0x72, + 0x65, 0x66, 0x28, 0x62, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x61, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x62, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x63, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, - 0x7b, 0x22, 0x45, 0x58, 0x50, 0x52, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x74, + 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x65, 0x71, 0x20, 0x3d, + 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x6c, + 0x74, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x63, 0x2c, 0x20, + 0x22, 0x53, 0x59, 0x4d, 0x42, 0x4f, 0x4c, 0x22, 0x7d, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, + 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x5f, + 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x64, 0x65, 0x72, 0x65, 0x66, 0x28, 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, + 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x30, 0x5f, 0x2c, + 0x20, 0x22, 0x45, 0x58, 0x50, 0x52, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, + 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5f, + 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x4c, 0x49, 0x53, 0x54, 0x22, 0x7d, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x5f, + 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x69, 0x65, + 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, + 0x5f, 0x65, 0x71, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, + 0x2c, 0x20, 0x5f, 0x5f, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, + 0x5f, 0x33, 0x63, 0x2c, 0x20, 0x22, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, + 0x54, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x53, 0x45, 0x51, 0x55, + 0x45, 0x4e, 0x43, 0x45, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x7b, 0x5f, + 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, + 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, - 0x72, 0x65, 0x66, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, - 0x22, 0x4c, 0x49, 0x53, 0x54, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x6c, - 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x5f, 0x33, 0x65, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x43, 0x4f, 0x4d, 0x4d, 0x45, - 0x4e, 0x54, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x65, 0x71, 0x20, 0x3d, 0x20, - 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x2c, - 0x20, 0x5f, 0x5f, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, - 0x33, 0x63, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, 0x45, - 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, - 0x61, 0x72, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, - 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x22, 0x2e, - 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x20, 0x7b, 0x22, 0x56, 0x41, 0x52, 0x41, - 0x52, 0x47, 0x22, 0x2c, 0x20, 0x5f, 0x5f, 0x66, 0x65, 0x6e, 0x6e, 0x65, - 0x6c, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, - 0x66, 0x2c, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, 0x7d, 0x29, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x65, - 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x66, 0x2c, 0x20, 0x22, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, + 0x22, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x5f, 0x31, 0x32, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x5f, 0x30, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x33, 0x66, - 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, - 0x20, 0x28, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x22, 0x46, 0x45, - 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x29, - 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x66, 0x69, - 0x6e, 0x64, 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x6f, 0x72, 0x20, 0x5f, 0x31, 0x32, 0x31, 0x5f, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, + 0x33, 0x66, 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x3d, 0x20, 0x28, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x22, + 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, + 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x6c, 0x6c, + 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x3a, + 0x66, 0x69, 0x6e, 0x64, 0x28, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x2e, 0x2e, + 0x2e, 0x7d, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x79, 0x6d, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x66, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x3f, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x33, + 0x66, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, + 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, + 0x5f, 0x33, 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x7b, 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6b, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, + 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, - 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, - 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, - 0x6d, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x2c, 0x20, - 0x5b, 0x22, 0x3f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x5f, 0x33, 0x66, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x28, 0x5f, 0x33, - 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x7b, - 0x7d, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, 0x79, 0x6d, + 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x2e, 0x2e, + 0x2e, 0x7d, 0x2c, 0x20, 0x7b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x28, 0x73, 0x74, 0x72, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x65, + 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x2c, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x5f, 0x73, 0x79, 0x6d, 0x20, - 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x29, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, - 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x2e, 0x2e, 0x2e, - 0x7d, 0x2c, 0x20, 0x7b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x28, 0x73, 0x74, 0x72, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x65, 0x74, - 0x79, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x73, 0x74, 0x72, 0x63, 0x6f, 0x64, - 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x65, 0x74, - 0x79, 0x70, 0x65, 0x7d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, - 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x32, 0x61, - 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x5f, - 0x33, 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x5f, 0x20, - 0x3d, 0x20, 0x28, 0x5f, 0x33, 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x3d, 0x20, 0x5f, 0x31, 0x5f, 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2c, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x7d, 0x2c, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, - 0x61, 0x72, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, - 0x78, 0x70, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, - 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, - 0x72, 0x67, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, - 0x3d, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x33, 0x66, - 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, - 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x78, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x28, 0x78, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x6d, 0x74, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x29, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x65, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, + 0x63, 0x6f, 0x64, 0x65, 0x7d, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, + 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x32, + 0x61, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, + 0x5f, 0x33, 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, + 0x74, 0x5f, 0x31, 0x32, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x33, + 0x66, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x31, 0x32, 0x33, 0x5f, 0x5b, 0x22, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x74, 0x5f, 0x31, 0x32, 0x33, 0x5f, + 0x5b, 0x22, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x7d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x67, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x78, 0x20, - 0x7e, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6c, - 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x67, 0x5f, 0x33, 0x66, + 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x76, 0x61, + 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x28, 0x78, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, - 0x66, 0x28, 0x78, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, + 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, - 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, - 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x73, 0x74, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, - 0x70, 0x65, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, - 0x74, 0x72, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, - 0x5e, 0x25, 0x2e, 0x25, 0x3a, 0x5d, 0x2b, 0x5b, 0x25, 0x2e, 0x25, 0x3a, - 0x5d, 0x3f, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, - 0x72, 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x2d, 0x73, 0x79, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, - 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, - 0x28, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, - 0x3d, 0x20, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, 0x20, 0x2d, - 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, 0x23, - 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, - 0x3d, 0x20, 0x70, 0x61, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x25, 0x2e, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x29, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x3a, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x2e, 0x25, 0x2e, 0x22, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x62, - 0x79, 0x74, 0x65, 0x28, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, 0x22, - 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, - 0x62, 0x79, 0x74, 0x65, 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, - 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, - 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, - 0x66, 0x28, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x2e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x0a, 0x20, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x33, 0x66, 0x28, 0x78, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x74, 0x2e, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, - 0x6c, 0x6b, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x28, 0x72, 0x6f, 0x6f, 0x74, - 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x28, + 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x78, 0x20, 0x7e, 0x3d, 0x20, 0x76, 0x61, + 0x72, 0x61, 0x72, 0x67, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x78, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, + 0x74, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x29, 0x20, + 0x7e, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x5f, 0x6d, 0x74, + 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, 0x66, 0x28, 0x78, 0x29, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, + 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, + 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, + 0x66, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, + 0x72, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x67, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x25, 0x2e, 0x25, 0x3a, + 0x5d, 0x2b, 0x5b, 0x25, 0x2e, 0x25, 0x3a, 0x5d, 0x3f, 0x22, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x74, 0x3a, 0x73, 0x75, + 0x62, 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x3a, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x2d, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x3a, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2e, + 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x5b, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x74, 0x3a, 0x73, 0x75, + 0x62, 0x28, 0x31, 0x2c, 0x20, 0x28, 0x20, 0x2d, 0x20, 0x32, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x28, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x3e, + 0x20, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x25, 0x2e, 0x25, 0x2e, 0x22, 0x29, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x62, 0x79, 0x74, 0x65, 0x28, + 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x62, 0x79, 0x74, 0x65, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x62, 0x79, 0x74, 0x65, + 0x28, 0x28, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7e, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x28, + 0x22, 0x2e, 0x22, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x28, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, + 0x66, 0x28, 0x61, 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, 0x73, 0x74, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x5f, + 0x74, 0x72, 0x65, 0x65, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x66, + 0x2c, 0x20, 0x5f, 0x33, 0x66, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x69, 0x74, @@ -12410,331 +13591,382 @@ unsigned char loadfennel_lua[] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x28, 0x28, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x2c, - 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, - 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, - 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, - 0x3d, 0x20, 0x7b, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x62, - 0x72, 0x65, 0x61, 0x6b, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, - 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6c, - 0x73, 0x65, 0x69, 0x66, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, - 0x2c, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, - 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x20, - 0x22, 0x69, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6e, - 0x6f, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x68, 0x65, 0x6e, - 0x22, 0x2c, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x22, - 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, - 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x67, 0x6f, 0x74, 0x6f, 0x22, 0x7d, - 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x75, - 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x29, 0x20, - 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, - 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x76, 0x5d, 0x20, 0x3d, - 0x20, 0x69, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x33, - 0x66, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x5b, 0x25, 0x61, 0x5f, 0x5d, - 0x5b, 0x25, 0x77, 0x5f, 0x5d, 0x2a, 0x24, 0x22, 0x29, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, - 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x29, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, - 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, - 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x76, 0x22, 0x7d, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, - 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, - 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x6e, - 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, - 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x5f, 0x31, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x7b, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, - 0x5b, 0x22, 0x73, 0x65, 0x74, 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x5f, 0x32, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, - 0x32, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x33, - 0x5f, 0x5b, 0x22, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x22, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x65, - 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x5b, 0x22, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x5f, - 0x33, 0x5f, 0x5b, 0x22, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x6f, - 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, - 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x69, 0x66, 0x20, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x6f, 0x6f, - 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, - 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x61, + 0x6c, 0x6b, 0x28, 0x28, 0x5f, 0x33, 0x66, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x2c, 0x20, 0x6e, 0x69, + 0x6c, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x6f, 0x6f, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, + 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x22, 0x2c, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x20, 0x22, 0x65, + 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x20, 0x22, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x22, 0x2c, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2c, 0x20, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x2c, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0x20, + 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x22, + 0x2c, 0x20, 0x22, 0x6f, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x2c, 0x20, + 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, + 0x2c, 0x20, 0x22, 0x67, 0x6f, 0x74, 0x6f, 0x22, 0x7d, 0x0a, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x75, 0x61, 0x5f, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x76, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x5e, 0x5b, 0x25, 0x61, 0x5f, 0x5d, 0x5b, 0x25, 0x77, + 0x5f, 0x5d, 0x2a, 0x24, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x5b, 0x73, 0x74, 0x72, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x22, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x22, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x22, + 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x2c, 0x20, 0x22, 0x65, 0x6e, 0x76, 0x22, 0x2c, + 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, + 0x6e, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x45, 0x6e, 0x76, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x6f, + 0x70, 0x74, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x62, + 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x31, 0x32, 0x39, 0x5f, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, + 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x72, 0x65, + 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x32, 0x39, 0x5f, 0x7d, + 0x0a, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x5b, 0x22, 0x73, 0x65, 0x74, + 0x2d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x5f, 0x31, 0x33, 0x30, + 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, 0x31, 0x5f, 0x20, 0x3d, + 0x20, 0x5f, 0x31, 0x33, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, + 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, 0x31, 0x5f, 0x5b, 0x22, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, 0x31, 0x5f, 0x5b, + 0x22, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, + 0x31, 0x5f, 0x5b, 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, + 0x5f, 0x31, 0x33, 0x31, 0x5f, 0x5b, 0x22, 0x72, 0x65, 0x73, 0x65, 0x74, + 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, + 0x74, 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x61, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x28, + 0x5f, 0x31, 0x33, 0x32, 0x5f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, + 0x33, 0x5f, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x32, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, 0x33, + 0x5f, 0x5b, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x72, 0x67, 0x5f, + 0x31, 0x33, 0x33, 0x5f, 0x5b, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x3d, 0x20, + 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x31, 0x33, 0x33, 0x5f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x28, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x2d, 0x64, + 0x65, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x2c, 0x20, 0x28, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x7b, + 0x7d, 0x29, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x77, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5b, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x77, 0x61, 0x72, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x25, 0x73, 0x22, 0x2c, 0x20, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x33, - 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5b, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x69, 0x6c, - 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x29, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, - 0x20, 0x5f, 0x33, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x20, 0x3d, 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x5b, - 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, 0x66, - 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2d, 0x6f, 0x6e, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, - 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x65, 0x78, 0x70, - 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x33, 0x66, 0x2c, - 0x20, 0x5b, 0x22, 0x6c, 0x75, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, 0x6f, - 0x72, 0x64, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x5f, - 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x5b, 0x22, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, - 0x63, 0x61, 0x74, 0x28, 0x7b, 0x22, 0x2e, 0x2f, 0x3f, 0x2e, 0x66, 0x6e, - 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, - 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x66, 0x6e, 0x6c, - 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, - 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, - 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4d, 0x41, - 0x43, 0x52, 0x4f, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, - 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x65, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5b, 0x22, - 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, - 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, - 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, - 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x33, - 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x67, 0x5f, 0x33, 0x66, 0x2c, 0x20, - 0x5b, 0x22, 0x77, 0x61, 0x6c, 0x6b, 0x2d, 0x74, 0x72, 0x65, 0x65, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x5f, 0x74, 0x72, 0x65, - 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, - 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x64, - 0x65, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x72, 0x65, 0x66, - 0x2c, 0x20, 0x65, 0x78, 0x70, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, - 0x72, 0x2c, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x20, 0x3d, 0x20, 0x68, 0x6f, - 0x6f, 0x6b, 0x2c, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, - 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x70, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, - 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, - 0x61, 0x74, 0x28, 0x7b, 0x22, 0x2e, 0x2f, 0x3f, 0x2e, 0x66, 0x6e, 0x6c, - 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, - 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, - 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x50, 0x41, - 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, - 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x6f, 0x74, - 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, - 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3d, + 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x5f, 0x20, 0x3d, 0x20, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5b, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x6e, 0x69, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x5f, 0x31, 0x33, + 0x35, 0x5f, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x31, 0x33, 0x35, 0x5f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x7b, 0x77, 0x61, 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x77, 0x61, + 0x72, 0x6e, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x2c, - 0x20, 0x76, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x67, - 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x20, - 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, - 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x22, - 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, 0x3d, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x22, 0x29, 0x0a, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x29, 0x0a, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5f, - 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, - 0x22, 0x5d, 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x7d, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, - 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x30, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, - 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, - 0x65, 0x6e, 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x65, 0x6e, 0x64, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, - 0x6f, 0x70, 0x74, 0x73, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2c, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, 0x79, 0x28, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, 0x28, 0x6f, 0x70, 0x74, 0x73, - 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x20, 0x3d, + 0x20, 0x6b, 0x76, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x6d, 0x61, 0x70, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x5b, 0x22, 0x77, 0x61, 0x6c, + 0x6b, 0x2d, 0x74, 0x72, 0x65, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x77, + 0x61, 0x6c, 0x6b, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x5b, 0x22, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6d, + 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, + 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x72, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, + 0x22, 0x65, 0x78, 0x70, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, + 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x5f, 0x33, 0x66, 0x2c, 0x20, + 0x5b, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, + 0x22, 0x76, 0x61, 0x72, 0x67, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x61, 0x72, 0x67, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x64, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x33, 0x66, 0x2c, 0x20, 0x5b, 0x22, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x2d, 0x6c, 0x75, 0x61, 0x2d, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x33, 0x66, + 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x75, 0x61, 0x2d, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x68, + 0x6f, 0x6f, 0x6b, 0x20, 0x3d, 0x20, 0x68, 0x6f, 0x6f, 0x6b, 0x2c, 0x20, + 0x5b, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2d, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, + 0x3d, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x2d, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x33, 0x66, 0x2c, + 0x20, 0x5b, 0x22, 0x61, 0x73, 0x74, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2c, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x22, 0x2e, + 0x2f, 0x3f, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x2f, + 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, + 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x22, 0x46, 0x45, 0x4e, + 0x4e, 0x45, 0x4c, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, + 0x20, 0x22, 0x3b, 0x22, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x7b, 0x22, 0x2e, 0x2f, 0x3f, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, + 0x20, 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, 0x2d, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, + 0x22, 0x2e, 0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, 0x2e, 0x66, 0x6e, + 0x6c, 0x22, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x22, + 0x46, 0x45, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4d, 0x41, 0x43, 0x52, 0x4f, + 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x29, 0x7d, 0x2c, 0x20, 0x22, 0x3b, + 0x22, 0x29, 0x7d, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x75, 0x74, 0x69, 0x6c, + 0x73, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x29, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x22, 0x29, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x22, 0x29, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x76, 0x28, + 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, + 0x65, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, + 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, + 0x7b, 0x7d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, + 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x65, + 0x6e, 0x76, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x65, 0x6e, 0x76, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x77, 0x72, 0x61, 0x70, 0x2d, 0x65, + 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x70, + 0x79, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, + 0x5b, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2d, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x5d, + 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, - 0x22, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, - 0x74, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, - 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x0a, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, 0x73, 0x74, 0x72, 0x2c, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x2e, 0x2e, - 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, - 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x6f, - 0x70, 0x74, 0x73, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, - 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, - 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x73, 0x74, 0x72, - 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, - 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, - 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, - 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, 0x6c, 0x75, - 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x65, 0x6e, - 0x76, 0x2c, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x49, 0x4c, 0x45, 0x52, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x22, 0x5d, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, 0x73, 0x74, + 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, + 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x76, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x28, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x31, 0x36, 0x5f, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x40, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, + 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x28, 0x6c, 0x75, 0x61, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, + 0x20, 0x5f, 0x36, 0x31, 0x36, 0x5f, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, @@ -12800,55 +14032,56 @@ unsigned char loadfennel_lua[] = { 0x61, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x76, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, - 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x66, 0x6f, 0x72, + 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x6f, 0x75, 0x74, + 0x29, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x2d, + 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, + 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, + 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, + 0x22, 0x5d, 0x28, 0x6b, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x33, 0x66, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, + 0x5d, 0x28, 0x6b, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, + 0x33, 0x66, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, + 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, - 0x6b, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x33, - 0x66, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, - 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5b, 0x22, 0x66, 0x6e, 0x6c, 0x2f, 0x62, - 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x2c, - 0x20, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x3f, 0x22, 0x5d, - 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x2c, 0x20, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x2c, 0x20, 0x5b, - 0x22, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x3f, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, - 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x66, 0x6f, 0x72, 0x6d, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, - 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x33, 0x66, - 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x2d, 0x66, 0x6f, - 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x6b, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x33, 0x66, 0x29, 0x2c, + 0x20, 0x5b, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x66, + 0x6f, 0x72, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, + 0x5d, 0x28, 0x6b, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x33, 0x66, 0x29, 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, - 0x28, 0x6b, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x33, 0x66, 0x29, - 0x2c, 0x20, 0x5b, 0x22, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3f, 0x22, 0x5d, 0x28, 0x6b, 0x2c, 0x20, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x33, 0x66, 0x29, 0x2c, 0x20, - 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x3f, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, 0x47, 0x29, - 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x28, 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, - 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, - 0x5f, 0x30, 0x5f, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x28, 0x6b, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x5f, 0x33, + 0x66, 0x29, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x5f, 0x47, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x36, 0x31, 0x37, 0x5f, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x36, 0x31, 0x37, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6b, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x5b, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3f, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x28, 0x5f, + 0x36, 0x31, 0x37, 0x5f, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x32, 0x2c, 0x20, 0x76, 0x32, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, @@ -12864,597 +14097,802 @@ unsigned char loadfennel_lua[] = { 0x6f, 0x6e, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, - 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x3f, 0x22, 0x5d, 0x20, - 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x65, - 0x6e, 0x64, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, - 0x20, 0x3d, 0x20, 0x7b, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, - 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, - 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6c, - 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, - 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, - 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, - 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x2c, - 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, - 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, + 0x20, 0x7b, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x5b, 0x22, 0x6c, + 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x22, 0x5d, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, + 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, - 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, - 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, - 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, - 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, - 0x73, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x63, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, + 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x3f, 0x22, 0x5d, 0x2c, 0x20, 0x76, 0x61, + 0x72, 0x67, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, + 0x61, 0x72, 0x67, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, + 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x22, 0x5d, + 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, + 0x3f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, + 0x5b, 0x22, 0x73, 0x79, 0x6d, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x3f, 0x22, + 0x5d, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x72, 0x2c, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, + 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x5b, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, - 0x2c, 0x20, 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x2c, 0x20, 0x64, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x20, 0x3d, - 0x20, 0x65, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, - 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x67, 0x72, 0x61, - 0x6e, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x61, 0x74, - 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x6f, - 0x61, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, - 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x2c, 0x20, - 0x6d, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, - 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, - 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, - 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, - 0x5d, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x70, 0x61, 0x72, - 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, - 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x74, - 0x68, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x61, - 0x74, 0x68, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x20, 0x3d, 0x20, 0x72, - 0x65, 0x70, 0x6c, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, - 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x2c, - 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, - 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x5b, 0x22, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x5b, + 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x31, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, + 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x2d, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0x5d, 0x2c, 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, + 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x61, + 0x6b, 0x65, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x5d, 0x2c, 0x20, + 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x2c, 0x20, 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x73, 0x5b, 0x22, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, + 0x65, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x5d, + 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, + 0x73, 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x5d, 0x2c, 0x20, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, + 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, + 0x5d, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x28, 0x29, 0x2c, 0x20, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, - 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x73, - 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6e, 0x74, - 0x61, 0x78, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, - 0x6b, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, - 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x2d, 0x75, 0x6e, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x69, - 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x20, 0x3d, - 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x2c, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, - 0x30, 0x2e, 0x31, 0x30, 0x2e, 0x30, 0x22, 0x2c, 0x20, 0x76, 0x69, 0x65, - 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, 0x7d, 0x0a, 0x75, 0x74, - 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2d, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, - 0x6f, 0x64, 0x0a, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x3d, 0x3d, 0x3d, 0x5b, - 0x3b, 0x3b, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, - 0x74, 0x2d, 0x69, 0x6e, 0x20, 0x46, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x20, 0x55, 0x6e, 0x6c, 0x69, - 0x6b, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, - 0x74, 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x6f, 0x6f, - 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x75, - 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, - 0x3b, 0x3b, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x20, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x64, 0x69, 0x6f, 0x73, 0x79, 0x6e, 0x63, 0x72, 0x61, - 0x74, 0x69, 0x63, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, - 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x61, 0x6e, 0x79, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x79, 0x65, 0x74, - 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, - 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x69, 0x72, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x3b, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, - 0x73, 0x74, 0x6f, 0x70, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x75, - 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, 0x2a, 0x20, 0x5b, - 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, - 0x54, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, - 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x73, 0x20, 0x69, - 0x74, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2c, 0x20, 0x65, 0x74, - 0x63, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x72, - 0x20, 0x78, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x20, 0x28, - 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, - 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, - 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, - 0x32, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x5d, 0x28, 0x29, 0x2c, + 0x20, 0x64, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x73, 0x2e, 0x64, 0x6f, 0x63, 0x2c, 0x20, 0x76, 0x69, 0x65, + 0x77, 0x20, 0x3d, 0x20, 0x76, 0x69, 0x65, 0x77, 0x2c, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x64, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x32, 0x61, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x2e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x2c, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x6c, + 0x6f, 0x61, 0x64, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x5d, 0x2c, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, + 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, 0x22, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x2c, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x5b, + 0x22, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x22, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x2c, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x2c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x5b, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x5d, 0x7d, + 0x0a, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x5b, 0x22, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x2d, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, + 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x3d, + 0x3d, 0x3d, 0x5b, 0x3b, 0x3b, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x74, 0x2d, 0x69, 0x6e, 0x20, 0x46, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x20, 0x55, + 0x6e, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6c, 0x64, 0x20, + 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x72, 0x75, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x3b, 0x3b, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x77, 0x68, 0x61, 0x74, 0x20, 0x69, 0x64, 0x69, 0x6f, 0x73, 0x79, 0x6e, + 0x63, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x0a, 0x20, 0x20, 0x3b, + 0x3b, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x79, 0x65, 0x74, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, + 0x3b, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x3b, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x64, 0x6f, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x61, + 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, + 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, + 0x0a, 0x20, 0x20, 0x54, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, + 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x20, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c, 0x69, + 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2c, + 0x20, 0x65, 0x74, 0x63, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x78, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, + 0x65, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, + 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, + 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, + 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, + 0x6c, 0x74, 0x20, 0x32, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x78, 0x20, 0x65, + 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, + 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, + 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2d, + 0x3e, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x73, 0x70, + 0x6c, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x0a, 0x20, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, + 0x61, 0x72, 0x20, 0x78, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, + 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, + 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, + 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, + 0x74, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x78, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3e, 0x3e, 0x2a, 0x20, + 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6c, 0x61, - 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, - 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2d, 0x3e, 0x2c, 0x20, - 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x0a, 0x20, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, - 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, - 0x78, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x20, 0x28, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, - 0x5b, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, - 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x78, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, - 0x74, 0x20, 0x78, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, - 0x66, 0x6e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, - 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, - 0x69, 0x6c, 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, - 0x73, 0x20, 0x2d, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x6e, 0x69, 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, - 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, - 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, - 0x30, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, - 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, - 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, - 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x20, 0x65, 0x6c, 0x73, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, - 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x20, 0x28, 0x67, - 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x32, + 0x20, 0x20, 0x22, 0x4e, 0x69, 0x6c, 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, + 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2d, 0x3e, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x69, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x5b, 0x65, 0x6c, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x65, 0x6c, 0x73, 0x20, 0x31, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, + 0x70, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x65, 0x6c, 0x20, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x2c, 0x74, 0x6d, 0x70, 0x20, 0x2c, 0x76, 0x61, 0x6c, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x2d, 0x3f, 0x3e, 0x20, 0x2c, 0x65, 0x6c, + 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, + 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, + 0x70, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x28, 0x66, 0x6e, 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, 0x20, 0x5b, 0x76, + 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x4e, 0x69, 0x6c, 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x2d, 0x3e, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x2d, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, + 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, + 0x20, 0x61, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, + 0x3d, 0x20, 0x30, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, + 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x65, 0x6c, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x20, 0x65, 0x6c, 0x73, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x3f, 0x20, 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x20, + 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x74, 0x6d, 0x70, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x2c, 0x74, 0x6d, + 0x70, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x2d, 0x3f, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, + 0x28, 0x2d, 0x3f, 0x3e, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, - 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, - 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x69, - 0x6c, 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, - 0x64, 0x2d, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, - 0x2d, 0x3e, 0x3e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, + 0x20, 0x3f, 0x64, 0x6f, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x20, 0x2e, + 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x69, 0x6c, + 0x2d, 0x73, 0x61, 0x66, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x75, 0x70, 0x2e, 0x0a, 0x20, 0x20, 0x53, + 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x2e, 0x20, 0x28, 0x64, 0x6f, + 0x74, 0x29, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x65, - 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, - 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, 0x30, - 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, - 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, 0x73, - 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x20, 0x65, 0x6c, 0x73, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, - 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, - 0x65, 0x29, 0x20, 0x65, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x65, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x20, 0x28, 0x67, 0x65, - 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, 0x6c, 0x20, 0x74, 0x6d, - 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x74, 0x6d, 0x70, - 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x2c, 0x74, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2d, - 0x3f, 0x3e, 0x3e, 0x20, 0x2c, 0x65, 0x6c, 0x20, 0x2c, 0x28, 0x75, 0x6e, - 0x70, 0x61, 0x63, 0x6b, 0x20, 0x65, 0x6c, 0x73, 0x29, 0x29, 0x0a, 0x20, + 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, + 0x61, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, + 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x65, 0x79, + 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x5b, 0x68, 0x65, 0x61, 0x64, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, + 0x79, 0x6d, 0x20, 0x3a, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, + 0x20, 0x60, 0x28, 0x64, 0x6f, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x2c, + 0x68, 0x65, 0x61, 0x64, 0x20, 0x2c, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x2c, + 0x68, 0x65, 0x61, 0x64, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x6b, 0x20, + 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, + 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x20, 0x4b, 0x69, 0x6e, 0x64, 0x61, 0x20, 0x67, 0x6e, 0x61, + 0x72, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, + 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x75, + 0x61, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, + 0x3b, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x6d, 0x70, 0x6c, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6d, 0x69, + 0x74, 0x73, 0x20, 0x61, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x2c, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x69, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x20, 0x28, 0x23, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x29, 0x20, 0x60, 0x28, 0x69, + 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, + 0x2c, 0x68, 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2c, 0x74, 0x6d, 0x70, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x3f, - 0x64, 0x6f, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x69, 0x6c, 0x2d, 0x73, - 0x61, 0x66, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, - 0x6f, 0x6b, 0x20, 0x75, 0x70, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x61, 0x6d, - 0x65, 0x20, 0x61, 0x73, 0x20, 0x2e, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x29, - 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x63, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, 0x6c, - 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6e, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x61, 0x20, - 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, - 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x68, 0x65, 0x61, 0x64, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x20, 0x3a, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x20, 0x60, - 0x28, 0x64, 0x6f, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x2c, 0x68, 0x65, - 0x61, 0x64, 0x20, 0x2c, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x2c, 0x68, 0x65, - 0x61, 0x64, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x6b, 0x20, 0x28, 0x69, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x4b, 0x69, 0x6e, 0x64, 0x61, 0x20, 0x67, 0x6e, 0x61, 0x72, 0x6c, - 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6c, - 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x62, 0x75, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x2e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, - 0x57, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6d, - 0x70, 0x6c, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, - 0x20, 0x61, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, - 0x63, 0x69, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, - 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x69, 0x66, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x20, 0x28, 0x23, 0x20, 0x6c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x29, 0x20, 0x60, 0x28, 0x69, 0x66, 0x20, - 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2c, 0x68, - 0x65, 0x61, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x2c, 0x68, 0x65, + 0x61, 0x64, 0x20, 0x28, 0x2e, 0x20, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x20, + 0x2c, 0x6b, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x64, 0x6f, 0x74, + 0x6f, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, + 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, + 0x65, 0x6c, 0x74, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, + 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x65, 0x6c, + 0x74, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, + 0x20, 0x65, 0x6c, 0x74, 0x29, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x65, + 0x6c, 0x74, 0x20, 0x32, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x28, 0x66, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x2a, 0x20, 0x5b, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2d, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x75, 0x74, 0x68, + 0x79, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x69, 0x66, 0x20, + 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, + 0x62, 0x6f, 0x64, 0x79, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x2a, 0x20, 0x5b, 0x63, 0x6c, + 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x60, 0x6c, 0x65, 0x74, 0x60, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, + 0x73, 0x20, 0x28, 0x76, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x20, + 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x73, 0x20, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, + 0x65, 0x20, 0x60, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x60, 0x20, 0x73, + 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x75, + 0x70, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x74, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x66, 0x6e, 0x20, 0x60, 0x28, 0x66, + 0x6e, 0x20, 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, + 0x60, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x23, 0x20, 0x5b, 0x6f, 0x6b, + 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x2c, 0x68, 0x65, 0x61, 0x64, - 0x20, 0x28, 0x2e, 0x20, 0x2c, 0x68, 0x65, 0x61, 0x64, 0x20, 0x2c, 0x6b, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x64, 0x6f, 0x74, 0x6f, 0x2a, - 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, - 0x73, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x70, - 0x6c, 0x69, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x67, - 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x60, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2c, - 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x65, 0x6c, - 0x74, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, 0x2e, - 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x65, 0x6c, 0x74, 0x20, 0x32, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x23, 0x20, 0x2e, + 0x2e, 0x2e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, 0x2e, + 0x2e, 0x20, 0x30, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, + 0x63, 0x6b, 0x20, 0x60, 0x28, 0x2e, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x29, 0x20, 0x3a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, + 0x63, 0x6b, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, + 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x74, 0x68, 0x2d, + 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x65, 0x6c, 0x74, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, - 0x20, 0x28, 0x66, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x2a, 0x20, 0x5b, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, - 0x64, 0x79, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x62, - 0x6f, 0x64, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, - 0x2d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x6c, - 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x75, 0x74, - 0x68, 0x79, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x20, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x6f, 0x64, - 0x79, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x69, 0x66, - 0x20, 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x34, 0x20, 0x60, 0x28, + 0x3a, 0x20, 0x2c, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x69, 0x29, 0x20, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, + 0x73, 0x23, 0x20, 0x28, 0x5f, 0x47, 0x2e, 0x78, 0x70, 0x63, 0x61, 0x6c, + 0x6c, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x66, 0x6e, 0x20, 0x2c, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x2d, 0x76, 0x61, 0x6c, 0x20, 0x5b, 0x69, 0x74, 0x65, + 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x76, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6e, 0x69, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, + 0x69, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x32, 0x20, 0x2d, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x28, 0x3d, 0x20, 0x3a, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x28, 0x2e, 0x20, + 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x69, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x64, 0x6f, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x29, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x3a, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, + 0x65, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, + 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x69, 0x29, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x28, 0x6f, 0x72, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, + 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x2a, 0x20, 0x5b, 0x63, - 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x60, 0x6c, 0x65, 0x74, - 0x60, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6b, - 0x65, 0x73, 0x20, 0x28, 0x76, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, - 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x65, - 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x0a, 0x20, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x73, 0x20, 0x65, 0x76, - 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x69, - 0x64, 0x65, 0x20, 0x60, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x60, 0x20, - 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, - 0x75, 0x70, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, - 0x69, 0x74, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x66, 0x6e, 0x20, 0x60, 0x28, - 0x66, 0x6e, 0x20, 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, - 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, - 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x23, 0x20, 0x5b, 0x6f, - 0x6b, 0x23, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x6f, 0x6b, 0x23, 0x20, - 0x2e, 0x2e, 0x2e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x2e, - 0x2e, 0x2e, 0x20, 0x30, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, - 0x61, 0x63, 0x6b, 0x20, 0x60, 0x28, 0x2e, 0x20, 0x28, 0x6f, 0x72, 0x20, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x2e, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x64, 0x65, - 0x62, 0x75, 0x67, 0x29, 0x20, 0x3a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, - 0x61, 0x63, 0x6b, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, - 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, 0x79, 0x6d, - 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x74, 0x68, - 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x34, 0x20, 0x60, - 0x28, 0x3a, 0x20, 0x2c, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x2d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x20, 0x69, 0x29, 0x20, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2d, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x72, 0x73, 0x23, 0x20, 0x28, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, - 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x66, 0x6e, 0x20, 0x2c, 0x74, 0x72, 0x61, - 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, 0x2d, - 0x74, 0x62, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, - 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, - 0x65, 0x20, 0x62, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x6b, 0x65, 0x79, - 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x54, - 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, - 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x73, - 0x20, 0x61, 0x20, 0x5c, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x5c, 0x22, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x32, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, - 0x6e, 0x69, 0x6c, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, - 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, - 0x5b, 0x6b, 0x20, 0x76, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, - 0x7b, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x5c, 0x22, 0x72, 0x65, - 0x64, 0x5c, 0x22, 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, - 0x5c, 0x22, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, 0x7d, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x20, 0x76, 0x20, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x7b, 0x3a, 0x72, 0x65, 0x64, 0x20, 0x5c, 0x22, 0x61, 0x70, 0x70, 0x6c, - 0x65, 0x5c, 0x22, 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, - 0x5c, 0x22, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, 0x7d, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, - 0x6c, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, - 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, - 0x65, 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, + 0x69, 0x6e, 0x74, 0x6f, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x20, 0x69, 0x6e, 0x20, 0x3a, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x5b, 0x5d, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, + 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x65, 0x78, 0x70, + 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, + 0x0a, 0x20, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x0a, 0x20, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x28, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x6b, 0x65, + 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x0a, 0x20, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x20, 0x5b, 0x6b, 0x20, 0x76, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x20, 0x7b, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x5c, 0x22, + 0x72, 0x65, 0x64, 0x5c, 0x22, 0x20, 0x3a, 0x6f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x5c, 0x22, 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5c, 0x22, + 0x7d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x3a, 0x72, 0x65, 0x64, 0x20, 0x5c, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x5c, 0x22, 0x20, 0x3a, 0x6f, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x20, 0x5c, 0x22, 0x6f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x5c, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x3a, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x75, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x3a, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, + 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, + 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, - 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, - 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x7b, 0x7d, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x20, 0x2c, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x0a, 0x20, 0x20, 0x20, + 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x31, 0x20, + 0x6f, 0x72, 0x20, 0x32, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x20, 0x77, + 0x72, 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6b, 0x76, 0x2d, + 0x65, 0x78, 0x70, 0x72, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, + 0x70, 0x72, 0x29, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x60, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x6b, + 0x65, 0x79, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x20, 0x2c, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x74, 0x62, 0x6c, 0x23, 0x20, 0x2c, 0x28, 0x69, 0x6e, 0x74, 0x6f, 0x2d, + 0x76, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, + 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x2c, 0x6b, + 0x76, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6b, 0x23, 0x20, 0x76, 0x23, 0x29, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x6b, 0x23, 0x20, 0x76, 0x23, 0x29, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, 0x5b, 0x69, 0x74, - 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2d, 0x65, 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, - 0x61, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, - 0x62, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, - 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x73, 0x20, 0x61, 0x20, 0x5c, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x5c, 0x22, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, - 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, - 0x5b, 0x5f, 0x20, 0x76, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x20, 0x5b, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35, 0x5d, - 0x29, 0x5d, 0x20, 0x28, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x28, 0x3e, 0x20, - 0x76, 0x20, 0x32, 0x29, 0x20, 0x28, 0x2a, 0x20, 0x76, 0x20, 0x76, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x39, 0x20, 0x31, 0x36, 0x20, 0x32, - 0x35, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, - 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, - 0x62, 0x6c, 0x29, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, + 0x23, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, + 0x6e, 0x20, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x20, + 0x5b, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x61, + 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x0a, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x5c, 0x22, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x5c, 0x22, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x5b, 0x5f, 0x20, 0x76, 0x20, + 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x31, 0x20, 0x32, + 0x20, 0x33, 0x20, 0x34, 0x20, 0x35, 0x5d, 0x29, 0x5d, 0x20, 0x28, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x76, 0x20, + 0x33, 0x29, 0x20, 0x28, 0x2a, 0x20, 0x76, 0x20, 0x76, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5b, 0x31, 0x20, 0x34, 0x20, 0x31, 0x36, 0x20, 0x32, + 0x35, 0x5d, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x53, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x3a, 0x69, 0x6e, 0x74, + 0x6f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x75, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, + 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x3a, 0x75, 0x6e, 0x74, 0x69, 0x6c, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2e, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, + 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, + 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x32, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x78, 0x61, 0x63, + 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x74, 0x62, 0x6c, 0x23, 0x20, 0x2c, 0x28, 0x69, 0x6e, 0x74, 0x6f, 0x2d, + 0x76, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x20, 0x69, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x20, 0x76, 0x61, 0x72, 0x20, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x74, 0x74, + 0x79, 0x20, 0x67, 0x6f, 0x6f, 0x64, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x6f, 0x6f, 0x73, 0x74, + 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x70, 0x2e, 0x68, 0x61, + 0x67, 0x65, 0x6c, 0x62, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x69, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2d, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, + 0x23, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x74, 0x62, + 0x6c, 0x23, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, + 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x23, 0x20, + 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x23, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x73, 0x65, 0x74, 0x20, 0x69, 0x23, 0x20, 0x28, 0x2b, 0x20, 0x69, 0x23, + 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, + 0x74, 0x62, 0x6c, 0x23, 0x20, 0x69, 0x23, 0x20, 0x76, 0x61, 0x6c, 0x23, + 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x62, 0x6c, 0x23, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x28, 0x66, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x65, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, + 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x65, 0x78, 0x70, 0x72, + 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, + 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, 0x49, 0x74, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x0a, 0x20, 0x20, + 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x62, 0x65, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x65, - 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x60, 0x65, 0x61, + 0x63, 0x68, 0x60, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x2e, 0x0a, 0x20, + 0x20, 0x49, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, + 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x0a, 0x20, 0x20, 0x49, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5b, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x20, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x7b, 0x3a, + 0x61, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x32, 0x20, 0x3a, 0x6f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x33, 0x7d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x2b, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, + 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x3f, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x28, + 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x69, + 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x34, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x65, 0x78, + 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, @@ -13464,634 +14902,578 @@ unsigned char loadfennel_lua[] = { 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x5b, - 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, - 0x61, 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x74, 0x73, 0x65, 0x74, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x20, 0x28, 0x2b, - 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x74, 0x62, 0x6c, - 0x23, 0x29, 0x20, 0x31, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x23, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, - 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x20, 0x5b, 0x69, 0x74, 0x65, 0x72, - 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x65, - 0x78, 0x70, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x20, - 0x49, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x0a, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, - 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x20, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, - 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, - 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, - 0x60, 0x65, 0x61, 0x63, 0x68, 0x60, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, - 0x2e, 0x0a, 0x20, 0x20, 0x49, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x20, - 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x66, - 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, - 0x69, 0x76, 0x65, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x69, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, - 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x49, 0x74, 0x20, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, - 0x74, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, - 0x5b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x20, 0x6e, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x20, 0x7b, 0x3a, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x32, 0x20, 0x3a, - 0x6f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x33, 0x7d, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2b, 0x20, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x20, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x3f, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, - 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x29, 0x20, - 0x34, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, - 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, - 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, - 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x72, - 0x61, 0x70, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x63, 0x63, 0x75, - 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, - 0x2d, 0x74, 0x62, 0x6c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, - 0x69, 0x6e, 0x69, 0x74, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, - 0x74, 0x62, 0x6c, 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x60, 0x28, 0x64, 0x6f, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, - 0x2c, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x20, 0x2c, - 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, - 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x2c, 0x61, 0x63, + 0x68, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x76, + 0x61, 0x72, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, + 0x6c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x69, 0x6e, 0x69, + 0x74, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, + 0x20, 0x31, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x28, 0x64, 0x6f, 0x20, 0x28, 0x76, 0x61, 0x72, 0x20, 0x2c, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x20, 0x2c, 0x61, 0x63, 0x63, - 0x75, 0x6d, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x61, 0x63, - 0x63, 0x75, 0x6d, 0x2d, 0x76, 0x61, 0x72, 0x29, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x61, 0x6c, 0x2a, 0x20, 0x5b, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x20, 0x22, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x79, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, - 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, - 0x20, 0x61, 0x72, 0x67, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x72, - 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x75, 0x6d, 0x2d, 0x69, 0x6e, 0x69, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x2c, 0x69, 0x74, 0x65, 0x72, 0x2d, 0x74, 0x62, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x73, 0x65, 0x74, 0x20, 0x2c, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x2d, 0x76, 0x61, 0x72, 0x20, 0x2c, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2d, + 0x65, 0x78, 0x70, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x2d, 0x76, 0x61, 0x72, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, + 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x2a, 0x20, 0x5b, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x66, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x20, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x61, 0x72, + 0x67, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x5b, 0x2e, + 0x2e, 0x2e, 0x5d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x3d, + 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x62, - 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x3d, 0x20, 0x60, 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x72, - 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x72, + 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x60, + 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x20, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x66, 0x20, 0x28, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x5d, 0x0a, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, - 0x64, 0x79, 0x20, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x66, 0x6e, 0x20, 0x5b, 0x2c, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, - 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x20, 0x5b, 0x6e, - 0x20, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x2e, 0x0a, - 0x20, 0x20, 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, - 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, - 0x64, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, - 0x6e, 0x20, 0x5b, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x5d, 0x20, - 0x28, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, - 0x5f, 0x29, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x20, - 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x5f, - 0x47, 0x2e, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x2d, 0x2d, 0x20, 0x57, 0x41, 0x52, 0x4e, 0x49, - 0x4e, 0x47, 0x3a, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, - 0x73, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, - 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, - 0x65, 0x2e, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x29, - 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x20, 0x28, 0x3d, - 0x20, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, - 0x6f, 0x72, 0x20, 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x6e, - 0x20, 0x30, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x45, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, - 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, - 0x72, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x3e, 0x3d, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x72, 0x67, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x66, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, + 0x5b, 0x2c, 0x5f, 0x56, 0x41, 0x52, 0x41, 0x52, 0x47, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x69, 0x63, 0x6b, + 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x20, 0x5b, 0x6e, 0x20, 0x66, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, + 0x20, 0x69, 0x74, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x2e, 0x0a, 0x20, 0x20, 0x0a, + 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, 0x69, 0x63, 0x6b, + 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x5b, + 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x5d, 0x20, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x29, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, + 0x6e, 0x64, 0x20, 0x5f, 0x47, 0x2e, 0x69, 0x6f, 0x20, 0x5f, 0x47, 0x2e, + 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x5f, 0x47, 0x2e, 0x69, + 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2d, 0x2d, 0x20, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, + 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x5c, + 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3d, + 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x29, 0x20, 0x3a, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, + 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x20, + 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x6e, 0x20, 0x30, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x6c, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2c, + 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, + 0x20, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x69, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, + 0x66, 0x6e, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2c, + 0x66, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x69, + 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2a, 0x20, 0x5b, + 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x60, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, + 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x73, + 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x32, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x28, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x29, 0x20, 0x2e, 0x2e, + 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, + 0x29, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3d, 0x20, + 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, 0x20, 0x6e, 0x20, + 0x30, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x28, 0x6d, 0x61, 0x74, + 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x20, 0x6e, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6c, + 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, 0x31, 0x20, 0x28, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x60, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x20, 0x28, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x2c, 0x66, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, - 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x2a, 0x20, 0x5b, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x60, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x60, 0x20, 0x73, 0x70, 0x65, - 0x63, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x65, 0x6d, - 0x69, 0x74, 0x73, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, - 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x70, 0x69, 0x63, - 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x32, 0x20, 0x2e, - 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, - 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x28, 0x5f, 0x30, 0x5f, 0x20, 0x5f, 0x31, 0x5f, 0x29, - 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x5f, 0x30, 0x5f, 0x20, - 0x5f, 0x31, 0x5f, 0x29, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x6e, 0x29, 0x29, 0x20, 0x28, 0x3e, 0x3d, - 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x28, - 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x20, 0x6e, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x45, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, - 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, - 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, - 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, 0x20, 0x31, 0x20, - 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, - 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x60, 0x28, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, - 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, - 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x6e, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6c, 0x65, 0x74, 0x2d, - 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, - 0x66, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x60, 0x28, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, - 0x5b, 0x2c, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x2c, - 0x6c, 0x65, 0x74, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, + 0x73, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, + 0x3d, 0x20, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x60, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x2c, 0x6c, + 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x2c, 0x6c, 0x65, 0x74, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x29, + 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, + 0x66, 0x6e, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2a, 0x20, 0x5b, + 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x69, 0x6c, 0x2d, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x4c, 0x69, 0x6b, + 0x65, 0x20, 0x60, 0x66, 0x6e, 0x60, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x61, + 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x66, 0x20, 0x61, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, + 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x73, 0x0a, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x75, 0x6e, + 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x73, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x72, 0x67, 0x73, 0x20, 0x5b, + 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x28, 0x69, + 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, 0x2e, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x29, 0x20, 0x28, 0x2e, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, + 0x33, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x3e, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x2c, 0x28, 0x75, - 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6c, 0x65, 0x74, 0x2d, 0x73, 0x79, - 0x6d, 0x73, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, - 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, - 0x2a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, - 0x72, 0x69, 0x74, 0x79, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, - 0x67, 0x2e, 0x0a, 0x20, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, - 0x72, 0x6f, 0x77, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x64, 0x65, - 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x6e, 0x69, 0x6c, 0x2c, - 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x0a, 0x20, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x3f, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x61, 0x72, 0x67, 0x73, 0x20, - 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, - 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x28, 0x2e, - 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x32, 0x29, 0x20, 0x28, 0x2e, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x3f, - 0x20, 0x33, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3f, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, - 0x28, 0x3e, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, - 0x72, 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x28, 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x64, 0x6f, 0x63, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x34, 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, - 0x61, 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x30, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, + 0x2e, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x64, 0x6f, 0x63, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x2d, 0x20, 0x34, 0x20, 0x28, 0x69, 0x66, 0x20, 0x68, 0x61, + 0x73, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x3f, 0x20, 0x30, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x3f, 0x20, 0x30, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x70, 0x74, - 0x79, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3f, 0x20, 0x28, 0x3c, 0x20, 0x28, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, - 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x21, 0x20, 0x5b, 0x61, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x3f, 0x20, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, - 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x61, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x61, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x21, 0x20, 0x61, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x61, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x61, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x61, 0x73, 0x3a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x20, 0x22, 0x5e, 0x3f, 0x22, 0x29, 0x29, 0x20, - 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x26, 0x22, - 0x29, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, - 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x2e, 0x2e, 0x2e, - 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, + 0x68, 0x61, 0x73, 0x2d, 0x64, 0x6f, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x3f, 0x20, 0x30, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3f, 0x20, 0x28, 0x3c, 0x20, 0x28, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, - 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x2c, 0x61, 0x29, 0x0a, 0x20, 0x20, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x21, 0x20, 0x5b, 0x61, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3f, 0x20, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, + 0x20, 0x5b, 0x5f, 0x20, 0x61, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x61, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x21, 0x20, 0x61, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x5b, 0x61, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x61, 0x73, 0x3a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x20, 0x22, 0x5e, 0x3f, 0x22, 0x29, 0x29, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x26, 0x22, 0x29, + 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x5f, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6e, + 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, + 0x29, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x61, 0x73, 0x20, 0x22, + 0x26, 0x61, 0x73, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x20, 0x61, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x2d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, - 0x22, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x6e, 0x20, - 0x25, 0x73, 0x3a, 0x25, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x60, 0x28, 0x5f, 0x47, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, + 0x2c, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x28, 0x3a, 0x20, 0x22, 0x4d, + 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x25, 0x73, + 0x3a, 0x25, 0x73, 0x22, 0x20, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x28, 0x74, - 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2c, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3a, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6f, 0x72, + 0x20, 0x61, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x22, 0x3f, 0x22, 0x29, + 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, + 0x3d, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x29, + 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, + 0x72, 0x67, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, + 0x20, 0x61, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x61, + 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x21, + 0x20, 0x61, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x69, 0x66, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x62, 0x6f, 0x64, + 0x79, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x28, 0x73, 0x79, 0x6d, + 0x20, 0x3a, 0x6e, 0x69, 0x6c, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x2a, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x3f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, + 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x7b, 0x2c, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x7d, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, 0x20, 0x5b, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3f, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x61, + 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3f, 0x20, 0x60, 0x64, 0x6f, 0x20, 0x60, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x60, 0x28, 0x2c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, + 0x2c, 0x28, 0x76, 0x69, 0x65, 0x77, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x29, 0x29, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, + 0x20, 0x5b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, + 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x69, + 0x6e, 0x64, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x0a, 0x20, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x61, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x6b, 0x2f, 0x76, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x79, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x6d, + 0x79, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x31, 0x20, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x20, 0x3a, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x32, 0x7d, + 0x20, 0x3a, 0x70, 0x72, 0x6f, 0x6a, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x29, 0x20, 0x3b, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, + 0x64, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, + 0x28, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, + 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x73, 0x20, 0x68, 0x6f, 0x77, 0x20, + 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x20, 0x75, 0x70, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x65, + 0x6e, 0x76, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x75, 0x66, 0x66, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77, 0x65, 0x69, 0x72, 0x64, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x5b, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x28, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x28, 0x67, 0x65, 0x74, 0x2d, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, + 0x20, 0x28, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x53, 0x2e, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x20, 0x60, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, + 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x2c, 0x6d, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x2e, - 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x22, 0x3f, 0x22, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x3a, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x61, 0x72, 0x67, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x29, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x67, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x61, 0x20, - 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x61, 0x72, 0x67, 0x6c, - 0x69, 0x73, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x21, 0x20, 0x61, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x3f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x20, 0x3a, 0x6e, - 0x69, 0x6c, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x60, 0x28, 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2a, 0x20, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x2e, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x5b, 0x2e, 0x2e, - 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x20, 0x7b, 0x2c, 0x28, 0x74, 0x6f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x28, - 0x66, 0x6e, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, - 0x61, 0x72, 0x67, 0x73, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, 0x20, 0x5b, 0x66, 0x6f, 0x72, 0x6d, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3f, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x70, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, - 0x0a, 0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x65, - 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, - 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x3f, 0x20, 0x60, 0x64, 0x6f, 0x20, 0x60, 0x70, 0x72, 0x69, - 0x6e, 0x74, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x2c, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x2c, 0x28, 0x76, - 0x69, 0x65, 0x77, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x65, 0x78, - 0x70, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x5f, 0x53, - 0x43, 0x4f, 0x50, 0x45, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, 0x20, 0x5b, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x69, 0x6e, 0x64, 0x73, - 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x0a, 0x20, - 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, - 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6b, - 0x2f, 0x76, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, - 0x20, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x79, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x6d, 0x79, 0x2d, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x3a, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x31, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x20, - 0x3a, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x32, 0x7d, 0x20, 0x3a, 0x70, - 0x72, 0x6f, 0x6a, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x29, 0x20, - 0x3b, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x62, 0x79, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x28, 0x3d, 0x20, - 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x32, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, - 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x28, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x31, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6e, - 0x61, 0x6d, 0x65, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x74, 0x6f, 0x20, 0x62, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x2e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x63, - 0x6f, 0x70, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, - 0x28, 0x67, 0x65, 0x74, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x28, 0x66, 0x65, - 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, - 0x53, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2d, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x73, 0x20, 0x60, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x2c, 0x6d, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x20, 0x7b, 0x7d, 0x20, 0x61, 0x73, 0x74, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, - 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x7b, 0x7d, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x31, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x77, 0x68, + 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, + 0x65, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x31, 0x29, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x2a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x31, 0x2d, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3f, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x31, 0x29, 0x20, 0x28, 0x2e, 0x20, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, - 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x31, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, - 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, - 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3f, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, - 0x5b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x5b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6b, 0x65, 0x79, 0x5d, - 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, - 0x2e, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, - 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x5b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x2d, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x20, 0x22, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6f, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, + 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, + 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x28, 0x2e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x2a, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6b, 0x65, 0x79, - 0x20, 0x28, 0x2e, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x3b, 0x20, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0a, - 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x5b, 0x76, - 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, - 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, - 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x60, 0x28, 0x61, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x69, 0x20, 0x70, 0x61, 0x74, - 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x73, 0x75, - 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, - 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, - 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x5b, 0x28, 0x2e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, - 0x69, 0x29, 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x2e, 0x2e, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x20, 0x22, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2d, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x22, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6b, 0x65, 0x79, 0x20, 0x28, 0x2e, + 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x3b, 0x20, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x5b, + 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x69, 0x20, 0x70, 0x61, + 0x74, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x73, + 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, + 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x28, 0x2e, 0x20, 0x76, 0x61, 0x6c, 0x73, + 0x20, 0x69, 0x29, 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, - 0x5f, 0x20, 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, - 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, - 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2c, 0x76, 0x61, 0x6c, - 0x29, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x6b, - 0x20, 0x70, 0x61, 0x74, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x3d, - 0x20, 0x70, 0x61, 0x74, 0x20, 0x60, 0x26, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x5b, 0x5f, 0x20, 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, + 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x20, + 0x28, 0x3d, 0x20, 0x28, 0x5f, 0x47, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x5b, 0x5d, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, + 0x68, 0x20, 0x5b, 0x6b, 0x20, 0x70, 0x61, 0x74, 0x20, 0x28, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, + 0x66, 0x20, 0x28, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x20, 0x60, 0x26, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x72, 0x65, 0x73, 0x74, 0x2d, + 0x70, 0x61, 0x74, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x74, 0x2d, 0x76, + 0x61, 0x6c, 0x20, 0x60, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, + 0x2c, 0x6b, 0x20, 0x28, 0x28, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x5f, 0x47, 0x2e, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x60, + 0x28, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x20, 0x31, 0x20, 0x2c, 0x72, 0x65, 0x73, 0x74, 0x2d, 0x76, 0x61, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x73, 0x74, 0x2d, 0x70, 0x61, 0x74, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x72, 0x65, 0x73, 0x74, 0x2d, 0x70, 0x61, + 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, + 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, @@ -14105,706 +15487,700 @@ unsigned char loadfennel_lua[] = { 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, + 0x6e, 0x67, 0x73, 0x20, 0x72, 0x65, 0x73, 0x74, 0x2d, 0x70, 0x61, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x5b, 0x72, 0x65, 0x73, 0x74, 0x2d, 0x76, 0x61, 0x6c, + 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x6b, 0x20, 0x60, 0x26, 0x61, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x70, 0x61, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, + 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6b, 0x29, 0x29, 0x20, 0x28, 0x3d, + 0x20, 0x60, 0x26, 0x61, 0x73, 0x20, 0x70, 0x61, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x60, 0x28, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x20, 0x2c, 0x6b, 0x20, 0x28, 0x28, 0x6f, 0x72, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x20, 0x5f, 0x47, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x29, 0x20, - 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, - 0x20, 0x6b, 0x20, 0x60, 0x26, 0x61, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, + 0x28, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x28, 0x2e, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, + 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x26, 0x61, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x20, 0x70, 0x61, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x6b, 0x29, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x60, 0x26, 0x61, 0x73, 0x20, - 0x70, 0x61, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x64, + 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x20, 0x26, 0x2f, 0x26, 0x61, 0x73, 0x3b, 0x20, 0x61, 0x6c, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x69, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6f, 0x72, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x3a, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6b, + 0x29, 0x29, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6e, 0x6f, 0x74, + 0x3d, 0x20, 0x60, 0x26, 0x61, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x6b, 0x20, 0x31, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x20, 0x28, 0x2b, 0x20, 0x6b, 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x26, 0x61, 0x73, 0x20, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x28, 0x2e, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2b, 0x20, - 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x26, 0x2f, 0x26, 0x61, 0x73, - 0x3b, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x67, 0x6f, - 0x74, 0x20, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x6e, 0x6f, - 0x74, 0x3d, 0x20, 0x3a, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x6b, 0x29, 0x29, 0x20, 0x28, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x60, 0x26, 0x61, 0x73, - 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, - 0x28, 0x2d, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x60, 0x26, 0x20, 0x28, 0x2e, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2d, 0x20, + 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x73, 0x75, 0x62, 0x76, 0x61, 0x6c, 0x20, 0x60, 0x28, + 0x2e, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, + 0x73, 0x75, 0x62, 0x76, 0x61, 0x6c, 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, - 0x20, 0x60, 0x26, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x28, 0x2d, 0x20, 0x6b, 0x20, 0x31, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x73, 0x75, 0x62, - 0x76, 0x61, 0x6c, 0x20, 0x60, 0x28, 0x2e, 0x20, 0x2c, 0x76, 0x61, 0x6c, - 0x20, 0x2c, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x73, 0x75, 0x62, 0x76, 0x61, 0x6c, - 0x5d, 0x20, 0x70, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, - 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, - 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x73, 0x75, - 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x5d, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x62, 0x20, 0x28, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x73, 0x75, 0x62, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x62, 0x29, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, + 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x53, + 0x54, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, + 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, + 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, + 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x74, 0x69, + 0x6c, 0x20, 0x77, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x65, + 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, + 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x23, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, + 0x6c, 0x73, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, + 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x63, 0x61, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x6f, 0x6e, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, + 0x65, 0x74, 0x20, 0x5b, 0x5b, 0x76, 0x61, 0x6c, 0x5d, 0x20, 0x76, 0x61, + 0x6c, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, + 0x66, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x29, 0x20, 0x3b, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6f, + 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x20, 0x62, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x5b, 0x76, 0x61, - 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, - 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x41, 0x53, 0x54, 0x20, 0x6f, 0x66, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, - 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, - 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x69, 0x66, - 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, - 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, - 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x67, 0x61, - 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x68, 0x65, 0x72, - 0x65, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x77, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x77, - 0x65, 0x27, 0x72, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, - 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, - 0x20, 0x28, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, - 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x23, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x29, 0x20, 0x6f, 0x72, - 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, - 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x73, - 0x65, 0x20, 0x77, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x63, 0x61, - 0x72, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x2e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x5b, 0x76, - 0x61, 0x6c, 0x5d, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x72, 0x20, - 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3b, 0x20, 0x75, 0x6e, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x29, + 0x20, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x22, 0x5f, 0x22, 0x20, + 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x20, 0x3b, 0x20, 0x6e, 0x65, + 0x76, 0x65, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x79, 0x20, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, + 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3f, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, + 0x69, 0x6c, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6e, 0x6f, 0x74, - 0x3d, 0x20, 0x22, 0x5f, 0x22, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x29, 0x20, 0x31, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, 0x2c, 0x76, 0x61, 0x6c, + 0x20, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x5b, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x79, 0x20, 0x61, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x65, 0x27, 0x76, 0x65, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, 0x2e, 0x20, 0x75, 0x6e, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, 0x2c, 0x28, 0x2e, 0x20, 0x75, 0x6e, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, + 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x61, + 0x20, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, + 0x72, 0x64, 0x3f, 0x20, 0x28, 0x3a, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x29, 0x20, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x22, 0x5e, 0x5f, 0x22, + 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, 0x29, 0x20, 0x28, + 0x74, 0x73, 0x65, 0x74, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x29, 0x20, 0x3b, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x75, 0x6e, - 0x69, 0x66, 0x79, 0x20, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x77, + 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, 0x20, 0x28, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x28, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x29, 0x20, 0x22, 0x5e, 0x3f, 0x22, 0x29, 0x29, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x20, 0x28, 0x3d, 0x20, 0x3a, 0x6e, 0x69, 0x6c, 0x20, 0x28, 0x74, 0x6f, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, - 0x64, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, - 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, - 0x69, 0x6e, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3f, 0x20, 0x28, 0x2e, - 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x73, 0x79, 0x6d, 0x3f, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x31, 0x29, - 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, - 0x3d, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x75, 0x6e, - 0x69, 0x66, 0x79, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x77, 0x65, 0x27, 0x76, 0x65, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x61, - 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x73, - 0x79, 0x6d, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x20, 0x28, 0x2e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, - 0x2c, 0x28, 0x2e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, - 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, + 0x2c, 0x28, 0x73, 0x79, 0x6d, 0x20, 0x3a, 0x6e, 0x69, 0x6c, 0x29, 0x20, + 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x29, 0x20, 0x5b, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, - 0x62, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x3f, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x3f, 0x20, 0x28, 0x3a, - 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3a, 0x66, 0x69, 0x6e, - 0x64, 0x20, 0x22, 0x5e, 0x5f, 0x22, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, - 0x72, 0x64, 0x3f, 0x29, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x75, - 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, - 0x20, 0x28, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, - 0x64, 0x3f, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, - 0x69, 0x6e, 0x64, 0x20, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x22, - 0x5e, 0x3f, 0x22, 0x29, 0x29, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, - 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x2c, 0x28, 0x73, 0x79, 0x6d, 0x20, - 0x3a, 0x6e, 0x69, 0x6c, 0x29, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x29, 0x29, - 0x20, 0x5b, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, - 0x6c, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, - 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, - 0x69, 0x73, 0x74, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x20, 0x32, 0x29, 0x20, 0x60, 0x3f, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, - 0x65, 0x74, 0x20, 0x5b, 0x28, 0x70, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x2e, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x31, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, + 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x32, 0x29, + 0x20, 0x60, 0x3f, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x28, 0x70, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x73, 0x20, 0x28, 0x2e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, - 0x6e, 0x64, 0x20, 0x2c, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x33, 0x29, 0x29, 0x5d, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x61, - 0x6e, 0x64, 0x20, 0x2c, 0x70, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x2c, 0x28, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x33, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x60, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x2c, 0x70, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, - 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x64, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x28, - 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, - 0x61, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, - 0x74, 0x3f, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, - 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x2d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x20, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, - 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x29, 0x20, 0x5b, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, - 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, - 0x74, 0x75, 0x61, 0x6c, 0x20, 0x60, 0x69, 0x66, 0x60, 0x20, 0x41, 0x53, - 0x54, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, - 0x76, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x30, 0x20, 0x28, - 0x25, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, - 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x29, 0x29, 0x20, 0x3b, - 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x20, 0x6f, 0x64, 0x64, 0x20, 0x66, - 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, - 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x28, 0x73, - 0x79, 0x6d, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x6f, 0x75, 0x74, 0x20, - 0x60, 0x28, 0x69, 0x66, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x73, 0x20, 0x28, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x3d, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x60, 0x28, 0x3d, 0x20, 0x2c, 0x76, 0x61, 0x6c, 0x20, + 0x2c, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x5b, 0x5d, + 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, + 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x60, + 0x69, 0x66, 0x60, 0x20, 0x41, 0x53, 0x54, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x2e, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, + 0x74, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, + 0x20, 0x32, 0x29, 0x29, 0x20, 0x3b, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, + 0x20, 0x6f, 0x64, 0x64, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, - 0x65, 0x73, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, - 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, - 0x79, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, - 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x20, 0x7b, 0x7d, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x75, 0x74, - 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x2d, 0x76, 0x61, 0x6c, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x5b, 0x63, - 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x48, 0x6f, 0x77, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, - 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x3f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x67, 0x65, 0x6e, - 0x73, 0x79, 0x6d, 0x73, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x28, 0x6c, - 0x69, 0x73, 0x74, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, - 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, - 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, - 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, - 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, - 0x73, 0x74, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, - 0x65, 0x73, 0x20, 0x69, 0x29, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x60, 0x3f, - 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, - 0x69, 0x20, 0x32, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x73, 0x29, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x20, 0x22, 0x5f, 0x22, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x5b, 0x6f, 0x75, 0x74, 0x20, 0x60, 0x28, 0x69, 0x66, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, + 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x28, + 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x28, 0x2e, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, + 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x29, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x7b, 0x7d, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x6f, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x60, 0x28, 0x6c, 0x65, 0x74, + 0x20, 0x2c, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x20, 0x63, - 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x62, 0x6f, 0x64, 0x79, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, + 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, + 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x2d, 0x73, + 0x79, 0x6d, 0x73, 0x20, 0x5b, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x48, 0x6f, 0x77, 0x20, 0x6d, + 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x3f, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, + 0x6e, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x73, 0x2e, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x73, + 0x79, 0x6d, 0x73, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x28, 0x67, + 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, + 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, + 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x28, 0x2e, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x29, + 0x20, 0x28, 0x3d, 0x20, 0x60, 0x3f, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x20, 0x32, 0x29, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, - 0x69, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, - 0x3f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x69, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x6e, 0x75, - 0x6d, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x63, 0x6c, - 0x61, 0x75, 0x73, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x2e, 0x20, 0x73, - 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x29, 0x29, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x69, 0x29, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x63, 0x6c, 0x61, 0x75, + 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x5b, 0x76, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x20, 0x28, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, - 0x65, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, - 0x75, 0x6d, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x79, 0x6d, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, 0x20, 0x5b, - 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x3b, 0x20, 0x4f, 0x6c, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, - 0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x64, 0x6f, 0x65, - 0x73, 0x6e, 0x27, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, - 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x60, 0x77, 0x68, 0x65, 0x72, 0x65, 0x27, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x6f, 0x72, 0x27, 0x2e, 0x20, 0x4e, - 0x65, 0x77, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x69, 0x73, - 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x60, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x77, - 0x68, 0x65, 0x72, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, - 0x3b, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x73, 0x69, 0x6d, 0x70, - 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x73, - 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, 0x65, 0x64, 0x73, 0x20, 0x69, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x60, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, 0x27, - 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, - 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, - 0x76, 0x61, 0x6c, 0x2d, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, - 0x30, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x66, 0x6d, 0x6f, 0x64, - 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, - 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, - 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2f, 0x62, 0x6f, 0x64, - 0x79, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, - 0x63, 0x74, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, - 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x62, 0x69, 0x6e, - 0x64, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x61, - 0x6e, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x73, - 0x20, 0x77, 0x65, 0x20, 0x65, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, - 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x60, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x76, 0x61, 0x6c, - 0x73, 0x20, 0x76, 0x61, 0x6c, 0x5d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x76, 0x61, 0x6c, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, - 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, - 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x66, 0x72, - 0x6f, 0x6d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, - 0x78, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x32, 0x20, 0x5b, - 0x73, 0x65, 0x71, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x73, - 0x65, 0x71, 0x60, 0x20, 0x62, 0x79, 0x20, 0x32, 0x2e, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x49, 0x66, 0x20, 0x60, 0x73, 0x65, 0x71, - 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6f, 0x64, 0x64, 0x20, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, - 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x72, - 0x6f, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x3a, 0x20, 0x5b, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, - 0x20, 0x35, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20, 0x5b, 0x5b, 0x31, 0x20, 0x32, - 0x5d, 0x20, 0x5b, 0x33, 0x20, 0x34, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x73, 0x20, 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x5b, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, - 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x73, 0x65, 0x71, 0x29, - 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, - 0x28, 0x2e, 0x20, 0x73, 0x65, 0x71, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, + 0x74, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x20, 0x76, 0x61, + 0x6c, 0x6e, 0x75, 0x6d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, - 0x71, 0x20, 0x28, 0x2b, 0x20, 0x69, 0x20, 0x31, 0x29, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x28, 0x74, 0x73, 0x65, 0x74, 0x20, 0x73, 0x79, 0x6d, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x20, 0x28, 0x67, 0x65, + 0x6e, 0x73, 0x79, 0x6d, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x79, 0x6d, 0x73, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x2a, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, + 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x4f, 0x6c, + 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x60, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, + 0x6f, 0x72, 0x27, 0x2e, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x60, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x2d, 0x77, 0x68, 0x65, 0x72, 0x65, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, + 0x65, 0x64, 0x73, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x60, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x2a, 0x27, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x28, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x76, 0x61, 0x6c, 0x2d, 0x73, 0x79, + 0x6d, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x20, 0x28, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x6d, 0x61, 0x74, + 0x68, 0x2e, 0x66, 0x6d, 0x6f, 0x64, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x20, + 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, + 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x20, 0x61, 0x67, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x67, 0x61, 0x69, + 0x6e, 0x73, 0x74, 0x20, 0x61, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x67, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x60, 0x6c, 0x65, + 0x74, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x5d, + 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6f, + 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x0a, 0x20, 0x20, 0x0a, 0x20, + 0x20, 0x28, 0x66, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x2d, 0x32, 0x20, 0x5b, 0x73, 0x65, 0x71, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x73, 0x65, 0x71, 0x60, 0x20, 0x62, 0x79, + 0x20, 0x32, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x49, + 0x66, 0x20, 0x60, 0x73, 0x65, 0x71, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x6f, 0x64, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x69, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x2e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x20, 0x5b, 0x31, + 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, + 0x20, 0x5b, 0x5b, 0x31, 0x20, 0x32, 0x5d, 0x20, 0x5b, 0x33, 0x20, 0x34, + 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, + 0x5b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x73, 0x20, 0x5b, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x5b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x5b, 0x5d, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x6f, 0x72, + 0x20, 0x5b, 0x69, 0x20, 0x31, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x20, 0x73, 0x65, 0x71, 0x29, 0x20, 0x32, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, 0x71, + 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, 0x71, 0x20, 0x28, 0x2b, 0x20, 0x69, + 0x20, 0x31, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x73, + 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x60, 0x6e, 0x69, 0x6c, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x60, 0x6e, 0x69, 0x6c, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x69, 0x20, + 0x76, 0x31, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x76, 0x32, + 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x69, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, - 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x29, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x60, 0x6e, - 0x69, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, - 0x69, 0x6c, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x60, 0x6e, 0x69, 0x6c, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, - 0x63, 0x68, 0x20, 0x5b, 0x69, 0x20, 0x76, 0x31, 0x20, 0x28, 0x69, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x73, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, - 0x65, 0x74, 0x20, 0x5b, 0x76, 0x32, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x69, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x76, 0x32, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x5b, 0x76, - 0x31, 0x20, 0x76, 0x32, 0x5d, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, - 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x5f, 0x20, - 0x26, 0x20, 0x70, 0x61, 0x74, 0x73, 0x5d, 0x20, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x60, 0x28, - 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x20, 0x70, 0x61, 0x74, 0x73, 0x2a, - 0x29, 0x60, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, - 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x60, 0x67, 0x75, 0x61, - 0x72, 0x64, 0x60, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, - 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x3b, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x31, - 0x20, 0x70, 0x61, 0x74, 0x32, 0x29, 0x2c, 0x20, 0x67, 0x75, 0x61, 0x72, - 0x64, 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, 0x61, 0x74, 0x31, 0x20, - 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x28, 0x70, 0x61, - 0x74, 0x32, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x72, - 0x65, 0x73, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x70, 0x61, - 0x74, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, - 0x74, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x70, 0x61, 0x74, 0x20, 0x60, 0x3f, 0x20, 0x28, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x29, 0x29, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, - 0x6e, 0x64, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x5d, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x73, 0x20, 0x5b, 0x76, 0x31, 0x20, 0x76, 0x32, 0x5d, 0x29, + 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x6f, + 0x72, 0x20, 0x5b, 0x5b, 0x5f, 0x20, 0x26, 0x20, 0x70, 0x61, 0x74, 0x73, + 0x5d, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, - 0x72, 0x6d, 0x73, 0x20, 0x60, 0x77, 0x68, 0x65, 0x72, 0x65, 0x60, 0x20, - 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x60, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, - 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x3b, 0x3b, 0x20, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x3e, 0x20, 0x5b, - 0x70, 0x61, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, - 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70, 0x61, 0x74, 0x20, 0x67, - 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, - 0x61, 0x74, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x28, 0x77, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x31, 0x20, - 0x70, 0x61, 0x74, 0x32, 0x29, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, - 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, 0x61, 0x74, 0x31, 0x20, 0x3f, - 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x28, 0x70, 0x61, 0x74, - 0x32, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, - 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x63, 0x6f, 0x6e, 0x64, - 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6f, 0x6e, 0x64, - 0x20, 0x31, 0x29, 0x20, 0x60, 0x77, 0x68, 0x65, 0x72, 0x65, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, - 0x74, 0x20, 0x5b, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x2e, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x32, 0x29, 0x5d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, - 0x2e, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x20, - 0x60, 0x6f, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x6f, 0x72, 0x20, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x5b, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x33, 0x29, 0x5d, 0x29, 0x0a, + 0x72, 0x6d, 0x73, 0x20, 0x60, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, + 0x20, 0x70, 0x61, 0x74, 0x73, 0x2a, 0x29, 0x60, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x60, 0x67, 0x75, 0x61, 0x72, 0x64, 0x60, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x28, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x74, 0x31, 0x20, 0x70, 0x61, 0x74, 0x32, 0x29, + 0x2c, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, 0x3d, 0x3e, 0x20, 0x5b, + 0x28, 0x70, 0x61, 0x74, 0x31, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x29, 0x20, 0x28, 0x70, 0x61, 0x74, 0x32, 0x20, 0x3f, 0x20, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x72, 0x65, 0x73, 0x20, 0x5b, 0x5d, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, + 0x20, 0x5b, 0x5f, 0x20, 0x70, 0x61, 0x74, 0x20, 0x28, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x20, 0x70, 0x61, 0x74, 0x73, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x72, 0x65, 0x73, + 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x70, 0x61, 0x74, 0x20, 0x60, + 0x3f, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x73, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, + 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x5b, 0x63, 0x6f, + 0x6e, 0x64, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x60, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x60, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x60, 0x20, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x70, 0x61, + 0x74, 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x70, 0x61, 0x74, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x20, 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x70, 0x61, 0x74, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, + 0x3d, 0x3e, 0x20, 0x5b, 0x28, 0x70, 0x61, 0x74, 0x20, 0x3f, 0x20, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3b, + 0x3b, 0x20, 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x28, 0x6f, 0x72, + 0x20, 0x70, 0x61, 0x74, 0x31, 0x20, 0x70, 0x61, 0x74, 0x32, 0x29, 0x20, + 0x67, 0x75, 0x61, 0x72, 0x64, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5b, 0x28, + 0x70, 0x61, 0x74, 0x31, 0x20, 0x3f, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x29, 0x20, 0x28, 0x70, 0x61, 0x74, 0x32, 0x20, 0x3f, 0x20, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, + 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x6c, 0x69, 0x73, 0x74, + 0x3f, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, + 0x2e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x31, 0x29, 0x20, 0x60, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x2e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x32, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x28, + 0x6c, 0x69, 0x73, 0x74, 0x3f, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x29, 0x20, 0x28, 0x3d, 0x20, 0x28, 0x2e, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x20, 0x31, 0x29, 0x20, 0x60, 0x6f, 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x28, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, - 0x60, 0x3f, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x20, 0x33, 0x29, 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x63, 0x6f, - 0x6e, 0x64, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, - 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x77, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x76, 0x61, - 0x6c, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x53, - 0x79, 0x6e, 0x74, 0x61, 0x78, 0x3a, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x62, - 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x77, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x67, - 0x75, 0x61, 0x72, 0x64, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x2a, - 0x29, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x73, 0x2a, 0x29, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, 0x67, + 0x20, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2d, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x5b, + 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x20, 0x33, 0x29, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5b, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x60, 0x3f, 0x20, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x33, 0x29, + 0x29, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x5d, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x6e, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x5b, 0x76, 0x61, + 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x2e, 0x20, 0x53, 0x65, 0x65, + 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x3a, + 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x2a, 0x29, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, - 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x69, 0x65, - 0x73, 0x20, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x2d, 0x32, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, - 0x2e, 0x2e, 0x29, 0x20, 0x32, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x28, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x2a, 0x29, 0x20, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x73, 0x2a, + 0x29, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x2d, 0x62, 0x6f, 0x64, 0x69, 0x65, 0x73, 0x20, 0x28, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x32, 0x20, 0x5b, 0x2e, 0x2e, + 0x2e, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x28, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x3d, 0x20, + 0x30, 0x20, 0x28, 0x25, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x32, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x2e, - 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, - 0x79, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x5b, 0x63, 0x6f, - 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5d, 0x20, 0x28, 0x69, 0x70, - 0x61, 0x69, 0x72, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2d, 0x62, - 0x6f, 0x64, 0x69, 0x65, 0x73, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x20, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x29, - 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x65, 0x6c, 0x73, 0x65, 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x2d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x2a, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, - 0x79, 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x7b, - 0x3a, 0x2d, 0x3e, 0x20, 0x2d, 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, - 0x2d, 0x3e, 0x3e, 0x20, 0x2d, 0x3e, 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, - 0x3a, 0x2d, 0x3f, 0x3e, 0x20, 0x2d, 0x3f, 0x3e, 0x2a, 0x0a, 0x20, 0x20, - 0x20, 0x3a, 0x2d, 0x3f, 0x3e, 0x3e, 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, - 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x3f, 0x2e, 0x20, 0x3f, 0x64, 0x6f, 0x74, - 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x64, 0x6f, 0x74, 0x6f, 0x20, 0x64, 0x6f, - 0x74, 0x6f, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x77, 0x68, 0x65, 0x6e, - 0x20, 0x77, 0x68, 0x65, 0x6e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x77, - 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x69, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x61, 0x63, 0x63, 0x75, - 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, - 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x6c, 0x61, 0x6d, 0x62, - 0x64, 0x61, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2a, 0x0a, 0x20, - 0x20, 0x20, 0x3a, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, - 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x2a, 0x0a, - 0x20, 0x20, 0x20, 0x3a, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2a, 0x0a, 0x20, 0x20, - 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, - 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2a, 0x0a, 0x20, 0x20, - 0x20, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x2d, 0x77, 0x68, 0x65, 0x72, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x5d, - 0x3d, 0x3d, 0x3d, 0x5d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, + 0x28, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x22, 0x23, 0x22, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x5b, 0x5d, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x5b, 0x5f, 0x20, 0x5b, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x5d, 0x20, 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x2d, 0x62, 0x6f, 0x64, 0x69, 0x65, 0x73, 0x29, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x65, + 0x61, 0x63, 0x68, 0x20, 0x5b, 0x5f, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x28, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x28, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x69, 0x66, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x2d, 0x62, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x2d, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2a, 0x20, 0x76, 0x61, 0x6c, + 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x2d, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x0a, 0x20, 0x20, 0x7b, 0x3a, 0x2d, 0x3e, 0x20, 0x2d, 0x3e, + 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x2d, 0x3e, 0x3e, 0x20, 0x2d, 0x3e, + 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x2d, 0x3f, 0x3e, 0x20, 0x2d, + 0x3f, 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x2d, 0x3f, 0x3e, 0x3e, + 0x20, 0x2d, 0x3f, 0x3e, 0x3e, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x3f, + 0x2e, 0x20, 0x3f, 0x64, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x64, + 0x6f, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x74, 0x6f, 0x2a, 0x0a, 0x20, 0x20, + 0x20, 0x3a, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x2a, + 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, + 0x65, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6f, 0x70, 0x65, 0x6e, + 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x0a, 0x20, + 0x20, 0x20, 0x3a, 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x2a, 0x0a, 0x20, 0x20, + 0x20, 0x3a, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2a, + 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x2a, 0x0a, 0x20, 0x20, + 0x20, 0x3a, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x6c, 0x61, 0x6d, + 0x62, 0x64, 0x61, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, 0x69, 0x63, + 0x6b, 0x2d, 0x61, 0x72, 0x67, 0x73, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x2d, + 0x61, 0x72, 0x67, 0x73, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x70, 0x69, + 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x70, 0x69, + 0x63, 0x6b, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2a, 0x0a, 0x20, + 0x20, 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x20, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2d, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x5d, 0x3d, 0x3d, 0x3d, 0x5d, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x65, + 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x22, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x30, 0x5f, 0x28, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, - 0x5f, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x6e, 0x69, - 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, - 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x64, 0x6f, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, - 0x31, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, - 0x6c, 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, - 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x75, 0x74, 0x69, - 0x6c, 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x31, 0x5f, 0x30, 0x5b, 0x22, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, - 0x5f, 0x31, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, - 0x5f, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, - 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x63, 0x72, - 0x6f, 0x73, 0x2c, 0x20, 0x7b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, - 0x6e, 0x76, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x3d, 0x20, 0x22, 0x73, 0x72, 0x63, 0x2f, 0x66, 0x65, 0x6e, 0x6e, - 0x65, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2e, 0x66, 0x6e, - 0x6c, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x29, - 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, - 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x62, 0x75, 0x69, - 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6b, 0x5d, 0x20, - 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x22, 0x5c, 0x32, 0x30, 0x36, 0x5c, - 0x31, 0x38, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x73, 0x2e, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x0a, 0x20, 0x20, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x65, 0x6e, - 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, - 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a + 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x5f, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, + 0x65, 0x6c, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x5f, 0x36, 0x32, 0x30, 0x5f, 0x0a, 0x20, 0x20, 0x5f, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x36, 0x32, + 0x31, 0x5f, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x73, 0x5b, 0x22, 0x6d, 0x61, 0x6b, 0x65, 0x2d, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x76, 0x22, 0x5d, 0x28, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x28, 0x5f, 0x36, + 0x32, 0x31, 0x5f, 0x29, 0x5b, 0x22, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x36, 0x32, 0x31, 0x5f, 0x5b, 0x22, 0x66, 0x65, 0x6e, + 0x6e, 0x65, 0x6c, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x36, + 0x32, 0x31, 0x5f, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, + 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x28, 0x62, + 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x2c, 0x20, 0x7b, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x65, 0x6e, + 0x76, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2c, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, + 0x20, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x72, 0x63, + 0x2f, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x72, + 0x6f, 0x73, 0x2e, 0x66, 0x6e, 0x6c, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x62, 0x75, 0x69, 0x6c, + 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x73, 0x5b, 0x22, 0x5c, 0x32, 0x30, 0x36, 0x5c, 0x31, + 0x38, 0x37, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, + 0x2e, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x0a, 0x20, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x5b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x5b, 0x27, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x27, + 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x0a }; -unsigned int loadfennel_lua_len = 177681; +unsigned int loadfennel_lua_len = 194192; diff --git a/vendor/fennel/fennel.lua b/vendor/fennel/fennel.lua index 9572c34cb..77b2c5bf1 100644 --- a/vendor/fennel/fennel.lua +++ b/vendor/fennel/fennel.lua @@ -3,15 +3,17 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local parser = require("fennel.parser") local compiler = require("fennel.compiler") local specials = require("fennel.specials") + local view = require("fennel.view") + local unpack = (table.unpack or _G.unpack) local function default_read_chunk(parser_state) - local function _0_() + local function _519_() if (0 < parser_state["stack-size"]) then return ".." else return ">> " end end - io.write(_0_()) + io.write(_519_()) io.flush() local input = io.read() return (input and (input .. "\n")) @@ -21,22 +23,23 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return io.write("\n") end local function default_on_error(errtype, err, lua_source) - local function _1_() - local _0_0 = errtype - if (_0_0 == "Lua Compile") then + local function _521_() + local _520_ = errtype + if (_520_ == "Lua Compile") then return ("Bad code generated - likely a bug with the compiler:\n" .. "--- Generated Lua Start ---\n" .. lua_source .. "--- Generated Lua End ---\n") - elseif (_0_0 == "Runtime") then + elseif (_520_ == "Runtime") then return (compiler.traceback(tostring(err), 4) .. "\n") - else - local _ = _0_0 + elseif true then + local _ = _520_ return ("%s error: %s\n"):format(errtype, tostring(err)) + else + return nil end end - return io.write(_1_()) + return io.write(_521_()) end local save_source = table.concat({"local ___i___ = 1", "while true do", " local name, value = debug.getlocal(1, ___i___)", " if(name and name ~= \"___i___\") then", " ___replLocals___[name] = value", " ___i___ = ___i___ + 1", " else break end end"}, "\n") local function splice_save_locals(env, lua_source) - env.___replLocals___ = (env.___replLocals___ or {}) local spliced_source = {} local bind = "local %s = ___replLocals___['%s']" for line in lua_source:gmatch("([^\n]+)\n?") do @@ -47,6 +50,7 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end if ((1 < #spliced_source) and (spliced_source[#spliced_source]):match("^ *return .*$")) then table.insert(spliced_source, #spliced_source, save_source) + else end return table.concat(spliced_source, "\n") end @@ -56,39 +60,35 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local stop_looking_3f = false local function add_partials(input, tbl, prefix, method_3f) for k in utils.allpairs(tbl) do - local k0 = nil + local k0 if ((tbl == env) or (tbl == env.___replLocals___)) then k0 = scope.unmanglings[k] else k0 = k end if ((#matches < 2000) and (type(k0) == "string") and (input == k0:sub(0, #input)) and (not method_3f or ("function" == type(tbl[k0])))) then - local function _1_() + local function _525_() if method_3f then return (prefix .. ":" .. k0) else return (prefix .. k0) end end - table.insert(matches, _1_()) + table.insert(matches, _525_()) + else end end return nil end local function descend(input, tbl, prefix, add_matches, method_3f) - local splitter = nil + local splitter if method_3f then splitter = "^([^:]+):(.*)" else splitter = "^([^.]+)%.(.*)" end local head, tail = input:match(splitter) - local raw_head = nil - if ((tbl == env) or (tbl == env.___replLocals___)) then - raw_head = scope.manglings[head] - else - raw_head = head - end + local raw_head = (scope.manglings[head] or head) if (type(tbl[raw_head]) == "table") then stop_looking_3f = true if method_3f then @@ -96,10 +96,12 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) else return add_matches(tail, tbl[raw_head], (prefix .. head)) end + else + return nil end end local function add_matches(input, tbl, prefix) - local prefix0 = nil + local prefix0 if prefix then prefix0 = (prefix .. ".") else @@ -114,10 +116,8 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end end for _, source in ipairs({scope.specials, scope.macros, (env.___replLocals___ or {}), env, env._G}) do + if stop_looking_3f then break end add_matches(input_fragment, source) - if stop_looking_3f then - break - end end return matches end @@ -126,29 +126,35 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return input:match("^%s*,") end local function command_docs() - local _0_ + local _532_ do - local tbl_0_ = {} + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto for name, f in pairs(commands) do - tbl_0_[(#tbl_0_ + 1)] = (" ,%s - %s"):format(name, ((compiler.metadata):get(f, "fnl/docstring") or "undocumented")) + local val_16_auto = (" ,%s - %s"):format(name, ((compiler.metadata):get(f, "fnl/docstring") or "undocumented")) + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else + end end - _0_ = tbl_0_ + _532_ = tbl_14_auto end - return table.concat(_0_, "\n") + return table.concat(_532_, "\n") end commands.help = function(_, _0, on_values) - return on_values({("Welcome to Fennel.\nThis is the REPL where you can enter code to be evaluated.\nYou can also run these repl commands:\n\n" .. command_docs() .. "\n ,exit - Leave the repl.\n\nUse (doc something) to see descriptions for individual macros and special forms.\n\nFor more information about the language, see https://fennel-lang.org/reference")}) + return on_values({("Welcome to Fennel.\nThis is the REPL where you can enter code to be evaluated.\nYou can also run these repl commands:\n\n" .. command_docs() .. "\n ,exit - Leave the repl.\n\nUse ,doc something to see descriptions for individual macros and special forms.\n\nFor more information about the language, see https://fennel-lang.org/reference")}) end do end (compiler.metadata):set(commands.help, "fnl/docstring", "Show this message.") local function reload(module_name, env, on_values, on_error) - local _0_0, _1_0 = pcall(specials["load-code"]("return require(...)", env), module_name) - if ((_0_0 == true) and (nil ~= _1_0)) then - local old = _1_0 - local _ = nil + local _534_, _535_ = pcall(specials["load-code"]("return require(...)", env), module_name) + if ((_534_ == true) and (nil ~= _535_)) then + local old = _535_ + local _ package.loaded[module_name] = nil _ = nil local ok, new = pcall(require, module_name) - local new0 = nil + local new0 if not ok then on_values({new}) new0 = old @@ -160,38 +166,42 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) old[k] = v end for k in pairs(old) do - if (nil == new0[k]) then + if (nil == (new0)[k]) then old[k] = nil + else end end package.loaded[module_name] = old + else end return on_values({"ok"}) - elseif ((_0_0 == false) and (nil ~= _1_0)) then - local msg = _1_0 - local function _3_() - local _2_0 = msg:gsub("\n.*", "") - return _2_0 + elseif ((_534_ == false) and (nil ~= _535_)) then + local msg = _535_ + local function _540_() + local _539_ = msg:gsub("\n.*", "") + return _539_ end - return on_error("Runtime", _3_()) + return on_error("Runtime", _540_()) + else + return nil end end local function run_command(read, on_error, f) - local _0_0, _1_0, _2_0 = pcall(read) - if ((_0_0 == true) and (_1_0 == true) and (nil ~= _2_0)) then - local val = _2_0 + local _542_, _543_, _544_ = pcall(read) + if ((_542_ == true) and (_543_ == true) and (nil ~= _544_)) then + local val = _544_ return f(val) - elseif ((_0_0 == false) and true and true) then - local _3fparse_ok = _1_0 - local _3ferr = _2_0 + elseif (_542_ == false) then return on_error("Parse", "Couldn't parse input.") + else + return nil end end commands.reload = function(env, read, on_values, on_error) - local function _0_(_241) + local function _546_(_241) return reload(tostring(_241), env, on_values, on_error) end - return run_command(read, on_error, _0_) + return run_command(read, on_error, _546_) end do end (compiler.metadata):set(commands.reload, "fnl/docstring", "Reload the specified module.") commands.reset = function(env, _, on_values) @@ -199,71 +209,85 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return on_values({"ok"}) end do end (compiler.metadata):set(commands.reset, "fnl/docstring", "Erase all repl-local scope.") - commands.complete = function(env, read, on_values, on_error, scope) - local function _0_(_241) - return on_values(completer(env, scope, tostring(_241))) - end - return run_command(read, on_error, _0_) - end - do end (compiler.metadata):set(commands.complete, "fnl/docstring", "Print all possible completions for a given input.") - local function apropos_2a(pattern, module, prefix, seen, names) - for name, module0 in pairs(module) do - if (("string" == type(name)) and (package ~= module0)) then - local _0_0 = type(module0) - if (_0_0 == "function") then + commands.complete = function(env, read, on_values, on_error, scope, chars) + local function _547_() + return on_values(completer(env, scope, string.char(unpack(chars)):gsub(",complete +", ""):sub(1, -2))) + end + return run_command(read, on_error, _547_) + end + do end (compiler.metadata):set(commands.complete, "fnl/docstring", "Print all possible completions for a given input symbol.") + local function apropos_2a(pattern, tbl, prefix, seen, names) + for name, subtbl in pairs(tbl) do + if (("string" == type(name)) and (package ~= subtbl)) then + local _548_ = type(subtbl) + if (_548_ == "function") then if ((prefix .. name)):match(pattern) then table.insert(names, (prefix .. name)) + else end - elseif (_0_0 == "table") then - if not seen[module0] then - local _2_ + elseif (_548_ == "table") then + if not seen[subtbl] then + local _551_ do - local _1_0 = seen - _1_0[module0] = true - _2_ = _1_0 + local _550_ = seen + _550_[subtbl] = true + _551_ = _550_ end - apropos_2a(pattern, module0, (prefix .. name:gsub("%.", "/") .. "."), _2_, names) + apropos_2a(pattern, subtbl, (prefix .. name:gsub("%.", "/") .. "."), _551_, names) + else end + else end + else end end return names end local function apropos(pattern) local names = apropos_2a(pattern, package.loaded, "", {}, {}) - local tbl_0_ = {} + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto for _, name in ipairs(names) do - tbl_0_[(#tbl_0_ + 1)] = name:gsub("^_G%.", "") + local val_16_auto = name:gsub("^_G%.", "") + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else + end end - return tbl_0_ + return tbl_14_auto end - commands.apropos = function(env, read, on_values, on_error, scope) - local function _0_(_241) + commands.apropos = function(_env, read, on_values, on_error, _scope) + local function _556_(_241) return on_values(apropos(tostring(_241))) end - return run_command(read, on_error, _0_) + return run_command(read, on_error, _556_) end do end (compiler.metadata):set(commands.apropos, "fnl/docstring", "Print all functions matching a pattern in all loaded modules.") local function apropos_follow_path(path) - local paths = nil + local paths do - local tbl_0_ = {} + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto for p in path:gmatch("[^%.]+") do - tbl_0_[(#tbl_0_ + 1)] = p + local val_16_auto = p + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else + end end - paths = tbl_0_ + paths = tbl_14_auto end local tgt = package.loaded for _, path0 in ipairs(paths) do - local _1_ + if (nil == tgt) then break end + local _559_ do - local _0_0 = path0:gsub("%/", ".") - _1_ = _0_0 - end - tgt = tgt[_1_] - if (nil == tgt) then - break + local _558_ = path0:gsub("%/", ".") + _559_ = _558_ end + tgt = tgt[_559_] end return tgt end @@ -272,112 +296,198 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) for _, path in ipairs(apropos(".*")) do local tgt = apropos_follow_path(path) if ("function" == type(tgt)) then - local _0_0 = (compiler.metadata):get(tgt, "fnl/docstring") - if (nil ~= _0_0) then - local docstr = _0_0 + local _560_ = (compiler.metadata):get(tgt, "fnl/docstring") + if (nil ~= _560_) then + local docstr = _560_ if docstr:match(pattern) then table.insert(names, path) + else end + else end + else end end return names end - commands["apropos-doc"] = function(env, read, on_values, on_error, scope) - local function _0_(_241) + commands["apropos-doc"] = function(_env, read, on_values, on_error, _scope) + local function _564_(_241) return on_values(apropos_doc(tostring(_241))) end - return run_command(read, on_error, _0_) + return run_command(read, on_error, _564_) end do end (compiler.metadata):set(commands["apropos-doc"], "fnl/docstring", "Print all functions that match the pattern in their docs") - local function apropos_show_docs(pattern) + local function apropos_show_docs(on_values, pattern) for _, path in ipairs(apropos(pattern)) do local tgt = apropos_follow_path(path) if (("function" == type(tgt)) and (compiler.metadata):get(tgt, "fnl/docstring")) then - print(specials.doc(tgt, path)) - print() + on_values(specials.doc(tgt, path)) + on_values() + else end end return nil end - commands["apropos-show-docs"] = function(env, read, _, on_error, scope) - local function _0_(_241) - return apropos_show_docs(tostring(_241)) + commands["apropos-show-docs"] = function(_env, read, on_values, on_error) + local function _566_(_241) + return apropos_show_docs(on_values, tostring(_241)) end - return run_command(read, on_error, _0_) + return run_command(read, on_error, _566_) end do end (compiler.metadata):set(commands["apropos-show-docs"], "fnl/docstring", "Print all documentations matching a pattern in function name") - local function load_plugin_commands() - if (utils.root and utils.root.options and utils.root.options.plugins) then - for _, plugin in ipairs(utils.root.options.plugins) do - for name, f in pairs(plugin) do - local _0_0 = name:match("^repl%-command%-(.*)") - if (nil ~= _0_0) then - local cmd_name = _0_0 - commands[cmd_name] = (commands[cmd_name] or f) + local function resolve(identifier, _567_, scope) + local _arg_568_ = _567_ + local ___replLocals___ = _arg_568_["___replLocals___"] + local env = _arg_568_ + local e + local function _569_(_241, _242) + return (___replLocals___[_242] or env[_242]) + end + e = setmetatable({}, {__index = _569_}) + local code = compiler["compile-string"](tostring(identifier), {scope = scope}) + return specials["load-code"](code, e)() + end + commands.find = function(env, read, on_values, on_error, scope) + local function _570_(_241) + local _571_ + do + local _572_ = utils["sym?"](_241) + if (nil ~= _572_) then + local _573_ = resolve(_572_, env, scope) + if (nil ~= _573_) then + _571_ = debug.getinfo(_573_) + else + _571_ = _573_ end + else + _571_ = _572_ end end - return nil + if ((_G.type(_571_) == "table") and (nil ~= (_571_).short_src) and (nil ~= (_571_).linedefined) and (nil ~= (_571_).source) and ((_571_).what == "Lua")) then + local src = (_571_).short_src + local line = (_571_).linedefined + local source = (_571_).source + local fnlsrc + do + local t_576_ = compiler.sourcemap + if (nil ~= t_576_) then + t_576_ = (t_576_)[source] + else + end + if (nil ~= t_576_) then + t_576_ = (t_576_)[line] + else + end + if (nil ~= t_576_) then + t_576_ = (t_576_)[2] + else + end + fnlsrc = t_576_ + end + return on_values({string.format("%s:%s", src, (fnlsrc or line))}) + elseif (_571_ == nil) then + return on_error("Repl", "Unknown value") + elseif true then + local _ = _571_ + return on_error("Repl", "No source info") + else + return nil + end end + return run_command(read, on_error, _570_) end - local function run_command0(input, read, loop, env, on_values, on_error, scope) - load_plugin_commands() + do end (compiler.metadata):set(commands.find, "fnl/docstring", "Print the filename and line number for a given function") + commands.doc = function(env, read, on_values, on_error, scope) + local function _581_(_241) + local name = tostring(_241) + local target = (scope.specials[name] or scope.macros[name] or resolve(name, env, scope)) + return on_values({specials.doc(target, name)}) + end + return run_command(read, on_error, _581_) + end + do end (compiler.metadata):set(commands.doc, "fnl/docstring", "Print the docstring and arglist for a function, macro, or special form.") + local function load_plugin_commands(plugins) + for _, plugin in ipairs((plugins or {})) do + for name, f in pairs(plugin) do + local _582_ = name:match("^repl%-command%-(.*)") + if (nil ~= _582_) then + local cmd_name = _582_ + commands[cmd_name] = (commands[cmd_name] or f) + else + end + end + end + return nil + end + local function run_command_loop(input, read, loop, env, on_values, on_error, scope, chars) local command_name = input:match(",([^%s/]+)") do - local _0_0 = commands[command_name] - if (nil ~= _0_0) then - local command = _0_0 - command(env, read, on_values, on_error, scope) - else - local _ = _0_0 + local _584_ = commands[command_name] + if (nil ~= _584_) then + local command = _584_ + command(env, read, on_values, on_error, scope, chars) + elseif true then + local _ = _584_ if ("exit" ~= command_name) then on_values({"Unknown command", command_name}) + else end + else end end if ("exit" ~= command_name) then return loop() + else + return nil end end local function repl(options) local old_root_options = utils.root.options - local env = nil - if options.env then - env = specials["wrap-env"](options.env) - else - env = setmetatable({}, {__index = (rawget(_G, "_ENV") or _G)}) - end + local env = specials["wrap-env"]((options.env or (rawget(_G, "_ENV") or _G))) local save_locals_3f = ((options.saveLocals ~= false) and env.debug and env.debug.getlocal) - local opts = {} - local _ = nil - for k, v in pairs(options) do - opts[k] = v - end - _ = nil + local opts = utils.copy(options) local read_chunk = (opts.readChunk or default_read_chunk) local on_values = (opts.onValues or default_on_values) local on_error = (opts.onError or default_on_error) - local pp = (opts.pp or tostring) + local pp = (opts.pp or view) local byte_stream, clear_stream = parser.granulate(read_chunk) local chars = {} local read, reset = nil, nil - local function _1_(parser_state) + local function _588_(parser_state) local c = byte_stream(parser_state) table.insert(chars, c) return c end - read, reset = parser.parser(_1_) - local scope = compiler["make-scope"]() + read, reset = parser.parser(_588_) + opts.env, opts.scope = env, compiler["make-scope"]() opts.useMetadata = (options.useMetadata ~= false) if (opts.allowedGlobals == nil) then - opts.allowedGlobals = specials["current-global-names"](opts.env) + opts.allowedGlobals = specials["current-global-names"](env) + else end if opts.registerCompleter then - local function _3_(...) - return completer(env, scope, ...) + local function _592_() + local _590_ = env + local _591_ = opts.scope + local function _593_(...) + return completer(_590_, _591_, ...) + end + return _593_ + end + opts.registerCompleter(_592_()) + else + end + load_plugin_commands(opts.plugins) + if save_locals_3f then + local function newindex(t, k, v) + if opts.scope.unmanglings[k] then + return rawset(t, k, v) + else + return nil + end end - opts.registerCompleter(_3_) + env.___replLocals___ = setmetatable({}, {__newindex = newindex}) + else end local function print_values(...) local vals = {...} @@ -392,52 +502,64 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) for k in pairs(chars) do chars[k] = nil end + reset() local ok, parse_ok_3f, x = pcall(read) - local src_string = string.char((table.unpack or _G.unpack)(chars)) - utils.root.options = opts + local src_string = string.char(unpack(chars)) if not ok then on_error("Parse", parse_ok_3f) clear_stream() - reset() return loop() elseif command_3f(src_string) then - return run_command0(src_string, read, loop, env, on_values, on_error, scope) + return run_command_loop(src_string, read, loop, env, on_values, on_error, opts.scope, chars) else if parse_ok_3f then do - local _4_0, _5_0 = pcall(compiler.compile, x, {["assert-compile"] = opts["assert-compile"], ["parse-error"] = opts["parse-error"], correlate = opts.correlate, moduleName = opts.moduleName, scope = scope, source = src_string, useBitLib = opts.useBitLib, useMetadata = opts.useMetadata}) - if ((_4_0 == false) and (nil ~= _5_0)) then - local msg = _5_0 + local _597_, _598_ = nil, nil + local function _600_() + local _599_ = opts + _599_["source"] = src_string + return _599_ + end + _597_, _598_ = pcall(compiler.compile, x, _600_()) + if ((_597_ == false) and (nil ~= _598_)) then + local msg = _598_ clear_stream() on_error("Compile", msg) - elseif ((_4_0 == true) and (nil ~= _5_0)) then - local src = _5_0 - local src0 = nil + elseif ((_597_ == true) and (nil ~= _598_)) then + local src = _598_ + local src0 if save_locals_3f then - src0 = splice_save_locals(env, src) + src0 = splice_save_locals(env, src, opts.scope) else src0 = src end - local _7_0, _8_0 = pcall(specials["load-code"], src0, env) - if ((_7_0 == false) and (nil ~= _8_0)) then - local msg = _8_0 + local _602_, _603_ = pcall(specials["load-code"], src0, env) + if ((_602_ == false) and (nil ~= _603_)) then + local msg = _603_ clear_stream() on_error("Lua Compile", msg, src0) - elseif (true and (nil ~= _8_0)) then - local _0 = _7_0 - local chunk = _8_0 - local function _9_() + elseif (true and (nil ~= _603_)) then + local _ = _602_ + local chunk = _603_ + local function _604_() return print_values(chunk()) end - local function _10_(...) - return on_error("Runtime", ...) + local function _605_() + local function _606_(...) + return on_error("Runtime", ...) + end + return _606_ end - xpcall(_9_, _10_) + xpcall(_604_, _605_()) + else end + else end end utils.root.options = old_root_options return loop() + else + return nil end end end @@ -445,2042 +567,1721 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end return repl end -package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) - local type_order = {["function"] = 5, boolean = 2, number = 1, string = 3, table = 4, thread = 7, userdata = 6} - local function sort_keys(_0_0, _1_0) - local _1_ = _0_0 - local a = _1_[1] - local _2_ = _1_0 - local b = _2_[1] - local ta = type(a) - local tb = type(b) - if ((ta == tb) and ((ta == "string") or (ta == "number"))) then - return (a < b) - else - local dta = type_order[ta] - local dtb = type_order[tb] - if (dta and dtb) then - return (dta < dtb) - elseif dta then - return true - elseif dtb then - return false +package.preload["fennel.specials"] = package.preload["fennel.specials"] or function(...) + local utils = require("fennel.utils") + local view = require("fennel.view") + local parser = require("fennel.parser") + local compiler = require("fennel.compiler") + local unpack = (table.unpack or _G.unpack) + local SPECIALS = compiler.scopes.global.specials + local function wrap_env(env) + local function _345_(_, key) + if (type(key) == "string") then + return env[compiler["global-unmangling"](key)] else - return (ta < tb) - end - end - end - local function max_index_gap(kv) - local gap = 0 - if (#kv > 0) then - local _2_ = kv - local _3_ = _2_[1] - local i = _3_[1] - local rest = {(table.unpack or unpack)(_2_, 2)} - for _, _4_0 in ipairs(rest) do - local _5_ = _4_0 - local k = _5_[1] - if ((k - i) > gap) then - gap = (k - i) - end - i = k - end - end - return gap - end - local function fill_gaps(kv) - local missing_indexes = {} - local i = 0 - for _, _2_0 in ipairs(kv) do - local _3_ = _2_0 - local j = _3_[1] - if (512 < j) then - return true - end - i = (i + 1) - while (i < j) do - table.insert(missing_indexes, i) - i = (i + 1) - end - end - for _, k in ipairs(missing_indexes) do - table.insert(kv, k, {k}) - end - return nil - end - local function table_kv_pairs(t, options) - local assoc_3f = false - local kv = {} - local insert = table.insert - for k, v in pairs(t) do - if (type(k) ~= "number") then - assoc_3f = true + return env[key] end - insert(kv, {k, v}) end - table.sort(kv, sort_keys) - if not assoc_3f then - local gap = max_index_gap(kv) - if (max_index_gap(kv) > options["max-sparse-gap"]) then - assoc_3f = true + local function _347_(_, key, value) + if (type(key) == "string") then + env[compiler["global-unmangling"](key)] = value + return nil else - if fill_gaps(kv) then - assoc_3f = true - end + env[key] = value + return nil end end - if (#kv == 0) then - return kv, "empty" - else - local function _3_() - if assoc_3f then - return "table" + local function _349_() + local function putenv(k, v) + local _350_ + if (type(k) == "string") then + _350_ = compiler["global-unmangling"](k) else - return "seq" + _350_ = k end + return _350_, v end - return kv, _3_() + return next, utils.kvmap(env, putenv), nil end + return setmetatable({}, {__index = _345_, __newindex = _347_, __pairs = _349_}) end - local function count_table_appearances(t, appearances) - if (type(t) == "table") then - if not appearances[t] then - appearances[t] = 1 - for k, v in pairs(t) do - count_table_appearances(k, appearances) - count_table_appearances(v, appearances) + local function current_global_names(_3fenv) + local mt + do + local _352_ = getmetatable(_3fenv) + if ((_G.type(_352_) == "table") and (nil ~= (_352_).__pairs)) then + local mtpairs = (_352_).__pairs + local tbl_11_auto = {} + for k, v in mtpairs(_3fenv) do + local _353_, _354_ = k, v + if ((nil ~= _353_) and (nil ~= _354_)) then + local k_12_auto = _353_ + local v_13_auto = _354_ + tbl_11_auto[k_12_auto] = v_13_auto + else + end end + mt = tbl_11_auto + elseif (_352_ == nil) then + mt = (_3fenv or _G) else - appearances[t] = ((appearances[t] or 0) + 1) + mt = nil end end - return appearances + return (mt and utils.kvmap(mt, compiler["global-unmangling"])) end - local function save_table(t, seen) - local seen0 = (seen or {len = 0}) - local id = (seen0.len + 1) - if not seen0[t] then - seen0[t] = id - seen0.len = id + local function load_code(code, _3fenv, _3ffilename) + local env = (_3fenv or rawget(_G, "_ENV") or _G) + if (rawget(_G, "setfenv") and rawget(_G, "loadstring")) then + local f = assert(_G.loadstring(code, _3ffilename)) + local _357_ = f + setfenv(_357_, env) + return _357_ + else + return assert(load(code, _3ffilename, "t", env)) end - return seen0 end - local function detect_cycle(t, seen, _3fk) - if ("table" == type(t)) then - seen[t] = true - local _2_0, _3_0 = next(t, _3fk) - if ((nil ~= _2_0) and (nil ~= _3_0)) then - local k = _2_0 - local v = _3_0 - return (seen[k] or detect_cycle(k, seen) or seen[v] or detect_cycle(v, seen) or detect_cycle(t, seen, k)) + local function doc_2a(tgt, name) + if not tgt then + return (name .. " not found") + else + local docstring = (((compiler.metadata):get(tgt, "fnl/docstring") or "#")):gsub("\n$", ""):gsub("\n", "\n ") + local mt = getmetatable(tgt) + if ((type(tgt) == "function") or ((type(mt) == "table") and (type(mt.__call) == "function"))) then + local arglist = table.concat(((compiler.metadata):get(tgt, "fnl/arglist") or {"#"}), " ") + local _359_ + if (#arglist > 0) then + _359_ = " " + else + _359_ = "" + end + return string.format("(%s%s%s)\n %s", name, _359_, arglist, docstring) + else + return string.format("%s\n %s", name, docstring) end end end - local function visible_cycle_3f(t, options) - return (options["detect-cycles?"] and detect_cycle(t, {}) and save_table(t, options.seen) and (1 < (options.appearances[t] or 0))) + local function doc_special(name, arglist, docstring, body_form_3f) + compiler.metadata[SPECIALS[name]] = {["fnl/arglist"] = arglist, ["fnl/docstring"] = docstring, ["fnl/body-form?"] = body_form_3f} + return nil end - local function table_indent(t, indent, id) - local opener_length = nil - if id then - opener_length = (#tostring(id) + 2) - else - opener_length = 1 + local function compile_do(ast, scope, parent, _3fstart) + local start = (_3fstart or 2) + local len = #ast + local sub_scope = compiler["make-scope"](scope) + for i = start, len do + compiler.compile1(ast[i], sub_scope, parent, {nval = 0}) end - return (indent + opener_length) + return nil end - local pp = nil - local function concat_table_lines(elements, options, multiline_3f, indent, table_type, prefix) - local indent_str = ("\n" .. string.rep(" ", indent)) - local open = nil - local function _2_() - if ("seq" == table_type) then - return "[" + SPECIALS["do"] = function(ast, scope, parent, opts, _3fstart, _3fchunk, _3fsub_scope, _3fpre_syms) + local start = (_3fstart or 2) + local sub_scope = (_3fsub_scope or compiler["make-scope"](scope)) + local chunk = (_3fchunk or {}) + local len = #ast + local retexprs = {returned = true} + local function compile_body(outer_target, outer_tail, outer_retexprs) + if (len < start) then + compiler.compile1(nil, sub_scope, chunk, {tail = outer_tail, target = outer_target}) else - return "{" + for i = start, len do + local subopts = {nval = (((i ~= len) and 0) or opts.nval), tail = (((i == len) and outer_tail) or nil), target = (((i == len) and outer_target) or nil)} + local _ = utils["propagate-options"](opts, subopts) + local subexprs = compiler.compile1(ast[i], sub_scope, chunk, subopts) + if (i ~= len) then + compiler["keep-side-effects"](subexprs, parent, nil, ast[i]) + else + end + end end + compiler.emit(parent, chunk, ast) + compiler.emit(parent, "end", ast) + utils.hook("do", ast, sub_scope) + return (outer_retexprs or retexprs) end - open = ((prefix or "") .. _2_()) - local close = nil - if ("seq" == table_type) then - close = "]" - else - close = "}" - end - local oneline = (open .. table.concat(elements, " ") .. close) - if (not options["one-line?"] and (multiline_3f or ((indent + #oneline) > options["line-length"]))) then - return (open .. table.concat(elements, indent_str) .. close) + if (opts.target or (opts.nval == 0) or opts.tail) then + compiler.emit(parent, "do", ast) + return compile_body(opts.target, opts.tail) + elseif opts.nval then + local syms = {} + for i = 1, opts.nval do + local s = ((_3fpre_syms and (_3fpre_syms)[i]) or compiler.gensym(scope)) + do end (syms)[i] = s + retexprs[i] = utils.expr(s, "sym") + end + local outer_target = table.concat(syms, ", ") + compiler.emit(parent, string.format("local %s", outer_target), ast) + compiler.emit(parent, "do", ast) + return compile_body(outer_target, opts.tail) else - return oneline + local fname = compiler.gensym(scope) + local fargs + if scope.vararg then + fargs = "..." + else + fargs = "" + end + compiler.emit(parent, string.format("local function %s(%s)", fname, fargs), ast) + return compile_body(nil, true, utils.expr((fname .. "(" .. fargs .. ")"), "statement")) end end - local function pp_associative(t, kv, options, indent, key_3f) - local multiline_3f = false - local id = options.seen[t] - if (options.level >= options.depth) then - return "{...}" - elseif (id and options["detect-cycles?"]) then - return ("@" .. id .. "{...}") - else - local visible_cycle_3f0 = visible_cycle_3f(t, options) - local id0 = (visible_cycle_3f0 and options.seen[t]) - local indent0 = table_indent(t, indent, id0) - local slength = nil - local function _3_() - local _2_0 = rawget(_G, "utf8") - if _2_0 then - return _2_0.len - else - return _2_0 + doc_special("do", {"..."}, "Evaluate multiple forms; return last value.", true) + SPECIALS.values = function(ast, scope, parent) + local len = #ast + local exprs = {} + for i = 2, len do + local subexprs = compiler.compile1(ast[i], scope, parent, {nval = ((i ~= len) and 1)}) + table.insert(exprs, subexprs[1]) + if (i == len) then + for j = 2, #subexprs do + table.insert(exprs, subexprs[j]) end - end - local function _4_(_241) - return #_241 - end - slength = ((options["utf8?"] and _3_()) or _4_) - local prefix = nil - if visible_cycle_3f0 then - prefix = ("@" .. id0) else - prefix = "" end - local items = nil + end + return exprs + end + doc_special("values", {"..."}, "Return multiple values from a function. Must be in tail position.") + local function deep_tostring(x, key_3f) + if utils["sequence?"](x) then + local _368_ do - local tbl_0_ = {} - for _, _6_0 in pairs(kv) do - local _7_ = _6_0 - local k = _7_[1] - local v = _7_[2] - local _8_ - do - local k0 = pp(k, options, (indent0 + 1), true) - local v0 = pp(v, options, (indent0 + slength(k0) + 1)) - multiline_3f = (multiline_3f or k0:find("\n") or v0:find("\n")) - _8_ = (k0 .. " " .. v0) + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for _, v in ipairs(x) do + local val_16_auto = deep_tostring(v) + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else end - tbl_0_[(#tbl_0_ + 1)] = _8_ end - items = tbl_0_ - end - return concat_table_lines(items, options, multiline_3f, indent0, "table", prefix) - end - end - local function pp_sequence(t, kv, options, indent) - local multiline_3f = false - local id = options.seen[t] - if (options.level >= options.depth) then - return "[...]" - elseif (id and options["detect-cycles?"]) then - return ("@" .. id .. "[...]") - else - local visible_cycle_3f0 = visible_cycle_3f(t, options) - local id0 = (visible_cycle_3f0 and options.seen[t]) - local indent0 = table_indent(t, indent, id0) - local prefix = nil - if visible_cycle_3f0 then - prefix = ("@" .. id0) - else - prefix = "" + _368_ = tbl_14_auto end - local items = nil + return ("[" .. table.concat(_368_, " ") .. "]") + elseif utils["table?"](x) then + local _370_ do - local tbl_0_ = {} - for _, _3_0 in pairs(kv) do - local _4_ = _3_0 - local _0 = _4_[1] - local v = _4_[2] - local _5_ - do - local v0 = pp(v, options, indent0) - multiline_3f = (multiline_3f or v0:find("\n")) - _5_ = v0 + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for k, v in pairs(x) do + local val_16_auto = (deep_tostring(k, true) .. " " .. deep_tostring(v)) + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else end - tbl_0_[(#tbl_0_ + 1)] = _5_ end - items = tbl_0_ + _370_ = tbl_14_auto end - return concat_table_lines(items, options, multiline_3f, indent0, "seq", prefix) + return ("{" .. table.concat(_370_, " ") .. "}") + elseif (key_3f and (type(x) == "string") and x:find("^[-%w?\\^_!$%&*+./@:|<=>]+$")) then + return (":" .. x) + elseif (type(x) == "string") then + return string.format("%q", x):gsub("\\\"", "\\\\\""):gsub("\"", "\\\"") + else + return tostring(x) end end - local function concat_lines(lines, options, indent, force_multi_line_3f) - if (#lines == 0) then - if options["empty-as-sequence?"] then - return "[]" - else - return "{}" - end - else - local oneline = nil - local _2_ - do - local tbl_0_ = {} - for _, line in ipairs(lines) do - tbl_0_[(#tbl_0_ + 1)] = line:gsub("^%s+", "") - end - _2_ = tbl_0_ + local function set_fn_metadata(arg_list, docstring, parent, fn_name) + if utils.root.options.useMetadata then + local args + local function _373_(_241) + return ("\"%s\""):format(deep_tostring(_241)) end - oneline = table.concat(_2_, " ") - if (not options["one-line?"] and (force_multi_line_3f or oneline:find("\n") or ((indent + #oneline) > options["line-length"]))) then - return table.concat(lines, ("\n" .. string.rep(" ", indent))) + args = utils.map(arg_list, _373_) + local meta_fields = {"\"fnl/arglist\"", ("{" .. table.concat(args, ", ") .. "}")} + if docstring then + table.insert(meta_fields, "\"fnl/docstring\"") + table.insert(meta_fields, ("\"" .. docstring:gsub("%s+$", ""):gsub("\\", "\\\\"):gsub("\n", "\\n"):gsub("\"", "\\\"") .. "\"")) else - return oneline end + local meta_str = ("require(\"%s\").metadata"):format((utils.root.options.moduleName or "fennel")) + return compiler.emit(parent, ("pcall(function() %s:setall(%s, %s) end)"):format(meta_str, fn_name, table.concat(meta_fields, ", "))) + else + return nil end end - local function pp_metamethod(t, metamethod, options, indent) - if (options.level >= options.depth) then - if options["empty-as-sequence?"] then - return "[...]" + local function get_fn_name(ast, scope, fn_name, multi) + if (fn_name and (fn_name[1] ~= "nil")) then + local _376_ + if not multi then + _376_ = compiler["declare-local"](fn_name, {}, scope, ast) else - return "{...}" + _376_ = (compiler["symbol-to-expression"](fn_name, scope))[1] end + return _376_, not multi, 3 else - local _ = nil - local function _2_(_241) - return visible_cycle_3f(_241, options) - end - options["visible-cycle?"] = _2_ - _ = nil - local lines, force_multi_line_3f = metamethod(t, pp, options, indent) - options["visible-cycle?"] = nil - local _3_0 = type(lines) - if (_3_0 == "string") then - return lines - elseif (_3_0 == "table") then - return concat_lines(lines, options, indent, force_multi_line_3f) - else - local _0 = _3_0 - return error("__fennelview metamethod must return a table of lines") - end + return nil, true, 2 end end - local function pp_table(x, options, indent) - options.level = (options.level + 1) - local x0 = nil + local function compile_named_fn(ast, f_scope, f_chunk, parent, index, fn_name, local_3f, arg_name_list, arg_list, docstring) + for i = (index + 1), #ast do + compiler.compile1(ast[i], f_scope, f_chunk, {nval = (((i ~= #ast) and 0) or nil), tail = (i == #ast)}) + end + local _379_ + if local_3f then + _379_ = "local function %s(%s)" + else + _379_ = "%s = function(%s)" + end + compiler.emit(parent, string.format(_379_, fn_name, table.concat(arg_name_list, ", ")), ast) + compiler.emit(parent, f_chunk, ast) + compiler.emit(parent, "end", ast) + set_fn_metadata(arg_list, docstring, parent, fn_name) + utils.hook("fn", ast, f_scope) + return utils.expr(fn_name, "sym") + end + local function compile_anonymous_fn(ast, f_scope, f_chunk, parent, index, arg_name_list, arg_list, docstring, scope) + local fn_name = compiler.gensym(scope) + return compile_named_fn(ast, f_scope, f_chunk, parent, index, fn_name, true, arg_name_list, arg_list, docstring) + end + SPECIALS.fn = function(ast, scope, parent) + local f_scope do - local _2_0 = nil - if options["metamethod?"] then - local _3_0 = x - if _3_0 then - local _4_0 = getmetatable(_3_0) - if _4_0 then - _2_0 = _4_0.__fennelview - else - _2_0 = _4_0 - end - else - _2_0 = _3_0 - end - else - _2_0 = nil - end - if (nil ~= _2_0) then - local metamethod = _2_0 - x0 = pp_metamethod(x, metamethod, options, indent) + local _381_ = compiler["make-scope"](scope) + do end (_381_)["vararg"] = false + f_scope = _381_ + end + local f_chunk = {} + local fn_sym = utils["sym?"](ast[2]) + local multi = (fn_sym and utils["multi-sym?"](fn_sym[1])) + local fn_name, local_3f, index = get_fn_name(ast, scope, fn_sym, multi) + local arg_list = compiler.assert(utils["table?"](ast[index]), "expected parameters table", ast) + compiler.assert((not multi or not multi["multi-sym-method-call"]), ("unexpected multi symbol " .. tostring(fn_name)), fn_sym) + local function get_arg_name(arg) + if utils["varg?"](arg) then + compiler.assert((arg == arg_list[#arg_list]), "expected vararg as last parameter", ast) + f_scope.vararg = true + return "..." + elseif (utils["sym?"](arg) and (tostring(arg) ~= "nil") and not utils["multi-sym?"](tostring(arg))) then + return compiler["declare-local"](arg, {}, f_scope, ast) + elseif utils["table?"](arg) then + local raw = utils.sym(compiler.gensym(scope)) + local declared = compiler["declare-local"](raw, {}, f_scope, ast) + compiler.destructure(arg, raw, ast, f_scope, f_chunk, {declaration = true, nomulti = true, symtype = "arg"}) + return declared else - local _ = _2_0 - local _4_0, _5_0 = table_kv_pairs(x, options) - if (true and (_5_0 == "empty")) then - local _0 = _4_0 - if options["empty-as-sequence?"] then - x0 = "[]" - else - x0 = "{}" - end - elseif ((nil ~= _4_0) and (_5_0 == "table")) then - local kv = _4_0 - x0 = pp_associative(x, kv, options, indent) - elseif ((nil ~= _4_0) and (_5_0 == "seq")) then - local kv = _4_0 - x0 = pp_sequence(x, kv, options, indent) - else - x0 = nil - end + return compiler.assert(false, ("expected symbol for function parameter: %s"):format(tostring(arg)), ast[index]) end end - options.level = (options.level - 1) - return x0 - end - local function number__3estring(n) - local _2_0 = string.gsub(tostring(n), ",", ".") - return _2_0 - end - local function colon_string_3f(s) - return s:find("^[-%w?^_!$%&*+./@|<=>]+$") - end - local function pp_string(str, options, indent) - local escs = nil - local _2_ - if (options["escape-newlines?"] and (#str < (options["line-length"] - indent))) then - _2_ = "\\n" + local arg_name_list = utils.map(arg_list, get_arg_name) + local index0, docstring = nil, nil + if ((type(ast[(index + 1)]) == "string") and ((index + 1) < #ast)) then + index0, docstring = (index + 1), ast[(index + 1)] else - _2_ = "\n" + index0, docstring = index, nil end - local function _4_(_241, _242) - return ("\\%03d"):format(_242:byte()) + if fn_name then + return compile_named_fn(ast, f_scope, f_chunk, parent, index0, fn_name, local_3f, arg_name_list, arg_list, docstring) + else + return compile_anonymous_fn(ast, f_scope, f_chunk, parent, index0, arg_name_list, arg_list, docstring, scope) end - escs = setmetatable({["\""] = "\\\"", ["\11"] = "\\v", ["\12"] = "\\f", ["\13"] = "\\r", ["\7"] = "\\a", ["\8"] = "\\b", ["\9"] = "\\t", ["\\"] = "\\\\", ["\n"] = _2_}, {__index = _4_}) - return ("\"" .. str:gsub("[%c\\\"]", escs) .. "\"") end - local function make_options(t, options) - local defaults = {["detect-cycles?"] = true, ["empty-as-sequence?"] = false, ["escape-newlines?"] = false, ["line-length"] = 80, ["max-sparse-gap"] = 10, ["metamethod?"] = true, ["one-line?"] = false, ["prefer-colon?"] = false, ["utf8?"] = true, depth = 128} - local overrides = {appearances = count_table_appearances(t, {}), level = 0, seen = {len = 0}} - for k, v in pairs((options or {})) do - defaults[k] = v - end - for k, v in pairs(overrides) do - defaults[k] = v + doc_special("fn", {"name?", "args", "docstring?", "..."}, "Function syntax. May optionally include a name and docstring.\nIf a name is provided, the function will be bound in the current scope.\nWhen called with the wrong number of args, excess args will be discarded\nand lacking args will be nil, use lambda for arity-checked functions.", true) + SPECIALS.lua = function(ast, _, parent) + compiler.assert(((#ast == 2) or (#ast == 3)), "expected 1 or 2 arguments", ast) + local _386_ + do + local _385_ = utils["sym?"](ast[2]) + if (nil ~= _385_) then + _386_ = tostring(_385_) + else + _386_ = _385_ + end end - return defaults - end - local function _2_(x, options, indent, colon_3f) - local indent0 = (indent or 0) - local options0 = (options or make_options(x)) - local x0 = nil - if options0.preprocess then - x0 = options0.preprocess(x, options0) + if ("nil" ~= _386_) then + table.insert(parent, {ast = ast, leaf = tostring(ast[2])}) else - x0 = x end - local tv = type(x0) - local function _5_() - local _4_0 = getmetatable(x0) - if _4_0 then - return _4_0.__fennelview + local _390_ + do + local _389_ = utils["sym?"](ast[3]) + if (nil ~= _389_) then + _390_ = tostring(_389_) else - return _4_0 + _390_ = _389_ end end - if ((tv == "table") or ((tv == "userdata") and _5_())) then - return pp_table(x0, options0, indent0) - elseif (tv == "number") then - return number__3estring(x0) + if ("nil" ~= _390_) then + return tostring(ast[3]) else - local function _6_() - if (colon_3f ~= nil) then - return colon_3f - elseif ("function" == type(options0["prefer-colon?"])) then - return options0["prefer-colon?"](x0) + return nil + end + end + local function dot(ast, scope, parent) + compiler.assert((1 < #ast), "expected table argument", ast) + local len = #ast + local _let_393_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local lhs = _let_393_[1] + if (len == 2) then + return tostring(lhs) + else + local indices = {} + for i = 3, len do + local index = ast[i] + if ((type(index) == "string") and utils["valid-lua-identifier?"](index)) then + table.insert(indices, ("." .. index)) else - return options0["prefer-colon?"] + local _let_394_ = compiler.compile1(index, scope, parent, {nval = 1}) + local index0 = _let_394_[1] + table.insert(indices, ("[" .. tostring(index0) .. "]")) end end - if ((tv == "string") and colon_string_3f(x0) and _6_()) then - return (":" .. x0) - elseif (tv == "string") then - return pp_string(x0, options0, indent0) - elseif ((tv == "boolean") or (tv == "nil")) then - return tostring(x0) + if (tostring(lhs):find("[{\"0-9]") or ("nil" == tostring(lhs))) then + return ("(" .. tostring(lhs) .. ")" .. table.concat(indices)) else - return ("#<" .. tostring(x0) .. ">") + return (tostring(lhs) .. table.concat(indices)) end end end - pp = _2_ - local function view(x, options) - return pp(x, make_options(x, options), 0) + SPECIALS["."] = dot + doc_special(".", {"tbl", "key1", "..."}, "Look up key1 in tbl table. If more args are provided, do a nested lookup.") + SPECIALS.global = function(ast, scope, parent) + compiler.assert((#ast == 3), "expected name and value", ast) + compiler.destructure(ast[2], ast[3], ast, scope, parent, {forceglobal = true, nomulti = true, symtype = "global"}) + return nil end - return view -end -package.preload["fennel.specials"] = package.preload["fennel.specials"] or function(...) - local utils = require("fennel.utils") - local view = require("fennel.view") - local parser = require("fennel.parser") - local compiler = require("fennel.compiler") - local unpack = (table.unpack or _G.unpack) - local SPECIALS = compiler.scopes.global.specials - local function wrap_env(env) - local function _0_(_, key) - if (type(key) == "string") then - return env[compiler["global-unmangling"](key)] - else - return env[key] - end - end - local function _1_(_, key, value) - if (type(key) == "string") then - env[compiler["global-unmangling"](key)] = value - return nil - else - env[key] = value - return nil - end - end - local function _2_() - local function putenv(k, v) - local _3_ - if (type(k) == "string") then - _3_ = compiler["global-unmangling"](k) + doc_special("global", {"name", "val"}, "Set name as a global with val.") + SPECIALS.set = function(ast, scope, parent) + compiler.assert((#ast == 3), "expected name and value", ast) + compiler.destructure(ast[2], ast[3], ast, scope, parent, {noundef = true, symtype = "set"}) + return nil + end + doc_special("set", {"name", "val"}, "Set a local variable to a new value. Only works on locals using var.") + local function set_forcibly_21_2a(ast, scope, parent) + compiler.assert((#ast == 3), "expected name and value", ast) + compiler.destructure(ast[2], ast[3], ast, scope, parent, {forceset = true, symtype = "set"}) + return nil + end + SPECIALS["set-forcibly!"] = set_forcibly_21_2a + local function local_2a(ast, scope, parent) + compiler.assert((#ast == 3), "expected name and value", ast) + compiler.destructure(ast[2], ast[3], ast, scope, parent, {declaration = true, nomulti = true, symtype = "local"}) + return nil + end + SPECIALS["local"] = local_2a + doc_special("local", {"name", "val"}, "Introduce new top-level immutable local.") + SPECIALS.var = function(ast, scope, parent) + compiler.assert((#ast == 3), "expected name and value", ast) + compiler.destructure(ast[2], ast[3], ast, scope, parent, {declaration = true, isvar = true, nomulti = true, symtype = "var"}) + return nil + end + doc_special("var", {"name", "val"}, "Introduce new mutable local.") + local function kv_3f(t) + local _398_ + do + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for k in pairs(t) do + local val_16_auto + if not ("number" == type(k)) then + val_16_auto = k + else + val_16_auto = nil + end + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto else - _3_ = k end - return _3_, v end - return next, utils.kvmap(env, putenv), nil + _398_ = tbl_14_auto end - return setmetatable({}, {__index = _0_, __newindex = _1_, __pairs = _2_}) + return (_398_)[1] end - local function current_global_names(env) - local mt = nil - do - local _0_0 = getmetatable(env) - if ((type(_0_0) == "table") and (nil ~= _0_0.__pairs)) then - local __pairs = _0_0.__pairs - local tbl_0_ = {} - for k, v in __pairs(env) do - local _1_0, _2_0 = k, v - if ((nil ~= _1_0) and (nil ~= _2_0)) then - local k_0_ = _1_0 - local v_0_ = _2_0 - tbl_0_[k_0_] = v_0_ - end - end - mt = tbl_0_ - elseif (_0_0 == nil) then - mt = (env or _G) - else - mt = nil - end + SPECIALS.let = function(ast, scope, parent, opts) + local bindings = ast[2] + local pre_syms = {} + compiler.assert((utils["table?"](bindings) and not kv_3f(bindings)), "expected binding sequence", bindings) + compiler.assert(((#bindings % 2) == 0), "expected even number of name/value bindings", ast[2]) + compiler.assert((#ast >= 3), "expected body expression", ast[1]) + for _ = 1, (opts.nval or 0) do + table.insert(pre_syms, compiler.gensym(scope)) end - return (mt and utils.kvmap(mt, compiler["global-unmangling"])) + local sub_scope = compiler["make-scope"](scope) + local sub_chunk = {} + for i = 1, #bindings, 2 do + compiler.destructure(bindings[i], bindings[(i + 1)], ast, sub_scope, sub_chunk, {declaration = true, nomulti = true, symtype = "let"}) + end + return SPECIALS["do"](ast, scope, parent, opts, 3, sub_chunk, sub_scope, pre_syms) end - local function load_code(code, environment, filename) - local environment0 = (environment or rawget(_G, "_ENV") or _G) - if (rawget(_G, "setfenv") and rawget(_G, "loadstring")) then - local f = assert(_G.loadstring(code, filename)) - _G.setfenv(f, environment0) - return f + doc_special("let", {"[name1 val1 ... nameN valN]", "..."}, "Introduces a new scope in which a given set of local bindings are used.", true) + local function get_prev_line(parent) + if ("table" == type(parent)) then + return get_prev_line((parent.leaf or parent[#parent])) else - return assert(load(code, filename, "t", environment0)) + return (parent or "") end end - local function doc_2a(tgt, name) - if not tgt then - return (name .. " not found") - else - local docstring = (((compiler.metadata):get(tgt, "fnl/docstring") or "#")):gsub("\n$", ""):gsub("\n", "\n ") - local mt = getmetatable(tgt) - if ((type(tgt) == "function") or ((type(mt) == "table") and (type(mt.__call) == "function"))) then - local arglist = table.concat(((compiler.metadata):get(tgt, "fnl/arglist") or {"#"}), " ") - local _0_ - if (#arglist > 0) then - _0_ = " " - else - _0_ = "" - end - return string.format("(%s%s%s)\n %s", name, _0_, arglist, docstring) + local function disambiguate_3f(rootstr, parent) + local function _403_() + local _402_ = get_prev_line(parent) + if (nil ~= _402_) then + local prev_line = _402_ + return prev_line:match("%)$") else - return string.format("%s\n %s", name, docstring) + return nil end end + return (rootstr:match("^{") or _403_()) end - local function doc_special(name, arglist, docstring, body_form_3f) - compiler.metadata[SPECIALS[name]] = {["fnl/arglist"] = arglist, ["fnl/body-form?"] = body_form_3f, ["fnl/docstring"] = docstring} - return nil + SPECIALS.tset = function(ast, scope, parent) + compiler.assert((#ast > 3), "expected table, key, and value arguments", ast) + local root = (compiler.compile1(ast[2], scope, parent, {nval = 1}))[1] + local keys = {} + for i = 3, (#ast - 1) do + local _let_405_ = compiler.compile1(ast[i], scope, parent, {nval = 1}) + local key = _let_405_[1] + table.insert(keys, tostring(key)) + end + local value = (compiler.compile1(ast[#ast], scope, parent, {nval = 1}))[1] + local rootstr = tostring(root) + local fmtstr + if disambiguate_3f(rootstr, parent) then + fmtstr = "do end (%s)[%s] = %s" + else + fmtstr = "%s[%s] = %s" + end + return compiler.emit(parent, fmtstr:format(rootstr, table.concat(keys, "]["), tostring(value)), ast) end - local function compile_do(ast, scope, parent, start) - local start0 = (start or 2) - local len = #ast - local sub_scope = compiler["make-scope"](scope) - for i = start0, len do - compiler.compile1(ast[i], sub_scope, parent, {nval = 0}) + doc_special("tset", {"tbl", "key1", "...", "keyN", "val"}, "Set the value of a table field. Can take additional keys to set\nnested values, but all parents must contain an existing table.") + local function calculate_target(scope, opts) + if not (opts.tail or opts.target or opts.nval) then + return "iife", true, nil + elseif (opts.nval and (opts.nval ~= 0) and not opts.target) then + local accum = {} + local target_exprs = {} + for i = 1, opts.nval do + local s = compiler.gensym(scope) + do end (accum)[i] = s + target_exprs[i] = utils.expr(s, "sym") + end + return "target", opts.tail, table.concat(accum, ", "), target_exprs + else + return "none", opts.tail, opts.target end - return nil end - SPECIALS["do"] = function(ast, scope, parent, opts, start, chunk, sub_scope, pre_syms) - local start0 = (start or 2) - local sub_scope0 = (sub_scope or compiler["make-scope"](scope)) - local chunk0 = (chunk or {}) - local len = #ast - local retexprs = {returned = true} - local function compile_body(outer_target, outer_tail, outer_retexprs) - if (len < start0) then - compiler.compile1(nil, sub_scope0, chunk0, {tail = outer_tail, target = outer_target}) + local function if_2a(ast, scope, parent, opts) + compiler.assert((2 < #ast), "expected condition and body", ast) + local do_scope = compiler["make-scope"](scope) + local branches = {} + local wrapper, inner_tail, inner_target, target_exprs = calculate_target(scope, opts) + local body_opts = {nval = opts.nval, tail = inner_tail, target = inner_target} + local function compile_body(i) + local chunk = {} + local cscope = compiler["make-scope"](do_scope) + compiler["keep-side-effects"](compiler.compile1(ast[i], cscope, chunk, body_opts), chunk, nil, ast[i]) + return {chunk = chunk, scope = cscope} + end + if (1 == (#ast % 2)) then + table.insert(ast, utils.sym("nil")) + else + end + for i = 2, (#ast - 1), 2 do + local condchunk = {} + local res = compiler.compile1(ast[i], do_scope, condchunk, {nval = 1}) + local cond = res[1] + local branch = compile_body((i + 1)) + branch.cond = cond + branch.condchunk = condchunk + branch.nested = ((i ~= 2) and (next(condchunk, nil) == nil)) + table.insert(branches, branch) + end + local else_branch = compile_body(#ast) + local s = compiler.gensym(scope) + local buffer = {} + local last_buffer = buffer + for i = 1, #branches do + local branch = branches[i] + local fstr + if not branch.nested then + fstr = "if %s then" else - for i = start0, len do - local subopts = {nval = (((i ~= len) and 0) or opts.nval), tail = (((i == len) and outer_tail) or nil), target = (((i == len) and outer_target) or nil)} - local _ = utils["propagate-options"](opts, subopts) - local subexprs = compiler.compile1(ast[i], sub_scope0, chunk0, subopts) - if (i ~= len) then - compiler["keep-side-effects"](subexprs, parent, nil, ast[i]) - end + fstr = "elseif %s then" + end + local cond = tostring(branch.cond) + local cond_line = fstr:format(cond) + if branch.nested then + compiler.emit(last_buffer, branch.condchunk, ast) + else + for _, v in ipairs(branch.condchunk) do + compiler.emit(last_buffer, v, ast) end end - compiler.emit(parent, chunk0, ast) - compiler.emit(parent, "end", ast) - return (outer_retexprs or retexprs) + compiler.emit(last_buffer, cond_line, ast) + compiler.emit(last_buffer, branch.chunk, ast) + if (i == #branches) then + compiler.emit(last_buffer, "else", ast) + compiler.emit(last_buffer, else_branch.chunk, ast) + compiler.emit(last_buffer, "end", ast) + elseif not (branches[(i + 1)]).nested then + local next_buffer = {} + compiler.emit(last_buffer, "else", ast) + compiler.emit(last_buffer, next_buffer, ast) + compiler.emit(last_buffer, "end", ast) + last_buffer = next_buffer + else + end end - if (opts.target or (opts.nval == 0) or opts.tail) then - compiler.emit(parent, "do", ast) - return compile_body(opts.target, opts.tail) - elseif opts.nval then - local syms = {} - for i = 1, opts.nval do - local s = ((pre_syms and pre_syms[i]) or compiler.gensym(scope)) - syms[i] = s - retexprs[i] = utils.expr(s, "sym") + if (wrapper == "iife") then + local iifeargs = ((scope.vararg and "...") or "") + compiler.emit(parent, ("local function %s(%s)"):format(tostring(s), iifeargs), ast) + compiler.emit(parent, buffer, ast) + compiler.emit(parent, "end", ast) + return utils.expr(("%s(%s)"):format(tostring(s), iifeargs), "statement") + elseif (wrapper == "none") then + for i = 1, #buffer do + compiler.emit(parent, buffer[i], ast) end - local outer_target = table.concat(syms, ", ") - compiler.emit(parent, string.format("local %s", outer_target), ast) - compiler.emit(parent, "do", ast) - return compile_body(outer_target, opts.tail) + return {returned = true} else - local fname = compiler.gensym(scope) - local fargs = nil - if scope.vararg then - fargs = "..." - else - fargs = "" + compiler.emit(parent, ("local %s"):format(inner_target), ast) + for i = 1, #buffer do + compiler.emit(parent, buffer[i], ast) end - compiler.emit(parent, string.format("local function %s(%s)", fname, fargs), ast) - utils.hook("do", ast, sub_scope0) - return compile_body(nil, true, utils.expr((fname .. "(" .. fargs .. ")"), "statement")) + return target_exprs end end - doc_special("do", {"..."}, "Evaluate multiple forms; return last value.", true) - SPECIALS.values = function(ast, scope, parent) - local len = #ast - local exprs = {} - for i = 2, len do - local subexprs = compiler.compile1(ast[i], scope, parent, {nval = ((i ~= len) and 1)}) - table.insert(exprs, subexprs[1]) - if (i == len) then - for j = 2, #subexprs do - table.insert(exprs, subexprs[j]) - end - end + SPECIALS["if"] = if_2a + doc_special("if", {"cond1", "body1", "...", "condN", "bodyN"}, "Conditional form.\nTakes any number of condition/body pairs and evaluates the first body where\nthe condition evaluates to truthy. Similar to cond in other lisps.") + local function remove_until_condition(bindings) + if ("until" == bindings[(#bindings - 1)]) then + table.remove(bindings, (#bindings - 1)) + return table.remove(bindings) + else + return nil end - return exprs end - doc_special("values", {"..."}, "Return multiple values from a function. Must be in tail position.") - local function deep_tostring(x, key_3f) - local elems = {} - if utils["sequence?"](x) then - local _0_ - do - local tbl_0_ = {} - for _, v in ipairs(x) do - tbl_0_[(#tbl_0_ + 1)] = deep_tostring(v) - end - _0_ = tbl_0_ - end - return ("[" .. table.concat(_0_, " ") .. "]") - elseif utils["table?"](x) then - local _0_ - do - local tbl_0_ = {} - for k, v in pairs(x) do - tbl_0_[(#tbl_0_ + 1)] = (deep_tostring(k, true) .. " " .. deep_tostring(v)) - end - _0_ = tbl_0_ - end - return ("{" .. table.concat(_0_, " ") .. "}") - elseif (key_3f and (type(x) == "string") and x:find("^[-%w?\\^_!$%&*+./@:|<=>]+$")) then - return (":" .. x) - elseif (type(x) == "string") then - return string.format("%q", x):gsub("\\\"", "\\\\\""):gsub("\"", "\\\"") + local function compile_until(condition, scope, chunk) + if condition then + local _let_414_ = compiler.compile1(condition, scope, chunk, {nval = 1}) + local condition_lua = _let_414_[1] + return compiler.emit(chunk, ("if %s then break end"):format(tostring(condition_lua)), utils.expr(condition, "expression")) else - return tostring(x) + return nil end end - local function set_fn_metadata(arg_list, docstring, parent, fn_name) - if utils.root.options.useMetadata then - local args = nil - local function _0_(_241) - return ("\"%s\""):format(deep_tostring(_241)) + SPECIALS.each = function(ast, scope, parent) + compiler.assert((#ast >= 3), "expected body expression", ast[1]) + local binding = compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) + local _ = compiler.assert((2 <= #binding), "expected binding and iterator", binding) + local until_condition = remove_until_condition(binding) + local iter = table.remove(binding, #binding) + local destructures = {} + local new_manglings = {} + local sub_scope = compiler["make-scope"](scope) + local function destructure_binding(v) + compiler.assert(("string" ~= type(v)), ("unexpected iterator clause " .. tostring(v)), binding) + if utils["sym?"](v) then + return compiler["declare-local"](v, {}, sub_scope, ast, new_manglings) + else + local raw = utils.sym(compiler.gensym(sub_scope)) + do end (destructures)[raw] = v + return compiler["declare-local"](raw, {}, sub_scope, ast) end - args = utils.map(arg_list, _0_) - local meta_fields = {"\"fnl/arglist\"", ("{" .. table.concat(args, ", ") .. "}")} - if docstring then - table.insert(meta_fields, "\"fnl/docstring\"") - table.insert(meta_fields, ("\"" .. docstring:gsub("%s+$", ""):gsub("\\", "\\\\"):gsub("\n", "\\n"):gsub("\"", "\\\"") .. "\"")) + end + local bind_vars = utils.map(binding, destructure_binding) + local vals = compiler.compile1(iter, scope, parent) + local val_names = utils.map(vals, tostring) + local chunk = {} + compiler.emit(parent, ("for %s in %s do"):format(table.concat(bind_vars, ", "), table.concat(val_names, ", ")), ast) + for raw, args in utils.stablepairs(destructures) do + compiler.destructure(args, raw, ast, sub_scope, chunk, {declaration = true, nomulti = true, symtype = "each"}) + end + compiler["apply-manglings"](sub_scope, new_manglings, ast) + compile_until(until_condition, sub_scope, chunk) + compile_do(ast, sub_scope, chunk, 3) + compiler.emit(parent, chunk, ast) + return compiler.emit(parent, "end", ast) + end + doc_special("each", {"[key value (iterator)]", "..."}, "Runs the body once for each set of values provided by the given iterator.\nMost commonly used with ipairs for sequential tables or pairs for undefined\norder, but can be used with any iterator.", true) + local function while_2a(ast, scope, parent) + local len1 = #parent + local condition = (compiler.compile1(ast[2], scope, parent, {nval = 1}))[1] + local len2 = #parent + local sub_chunk = {} + if (len1 ~= len2) then + for i = (len1 + 1), len2 do + table.insert(sub_chunk, parent[i]) + do end (parent)[i] = nil end - local meta_str = ("require(\"%s\").metadata"):format((utils.root.options.moduleName or "fennel")) - return compiler.emit(parent, ("pcall(function() %s:setall(%s, %s) end)"):format(meta_str, fn_name, table.concat(meta_fields, ", "))) + compiler.emit(parent, "while true do", ast) + compiler.emit(sub_chunk, ("if not %s then break end"):format(condition[1]), ast) + else + compiler.emit(parent, ("while " .. tostring(condition) .. " do"), ast) end + compile_do(ast, compiler["make-scope"](scope), sub_chunk, 3) + compiler.emit(parent, sub_chunk, ast) + return compiler.emit(parent, "end", ast) end - local function get_fn_name(ast, scope, fn_name, multi) - if (fn_name and (fn_name[1] ~= "nil")) then - local _0_ - if not multi then - _0_ = compiler["declare-local"](fn_name, {}, scope, ast) + SPECIALS["while"] = while_2a + doc_special("while", {"condition", "..."}, "The classic while loop. Evaluates body until a condition is non-truthy.", true) + local function for_2a(ast, scope, parent) + local ranges = compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) + local until_condition = remove_until_condition(ast[2]) + local binding_sym = table.remove(ast[2], 1) + local sub_scope = compiler["make-scope"](scope) + local range_args = {} + local chunk = {} + compiler.assert(utils["sym?"](binding_sym), ("unable to bind %s %s"):format(type(binding_sym), tostring(binding_sym)), ast[2]) + compiler.assert((#ast >= 3), "expected body expression", ast[1]) + compiler.assert((#ranges <= 3), "unexpected arguments", ranges[4]) + for i = 1, math.min(#ranges, 3) do + range_args[i] = tostring((compiler.compile1(ranges[i], scope, parent, {nval = 1}))[1]) + end + compiler.emit(parent, ("for %s = %s do"):format(compiler["declare-local"](binding_sym, {}, sub_scope, ast), table.concat(range_args, ", ")), ast) + compile_until(until_condition, sub_scope, chunk) + compile_do(ast, sub_scope, chunk, 3) + compiler.emit(parent, chunk, ast) + return compiler.emit(parent, "end", ast) + end + SPECIALS["for"] = for_2a + doc_special("for", {"[index start stop step?]", "..."}, "Numeric loop construct.\nEvaluates body once for each value between start and stop (inclusive).", true) + local function native_method_call(ast, _scope, _parent, target, args) + local _let_418_ = ast + local _ = _let_418_[1] + local _0 = _let_418_[2] + local method_string = _let_418_[3] + local call_string + if ((target.type == "literal") or (target.type == "varg") or (target.type == "expression")) then + call_string = "(%s):%s(%s)" + else + call_string = "%s:%s(%s)" + end + return utils.expr(string.format(call_string, tostring(target), method_string, table.concat(args, ", ")), "statement") + end + local function nonnative_method_call(ast, scope, parent, target, args) + local method_string = tostring((compiler.compile1(ast[3], scope, parent, {nval = 1}))[1]) + local args0 = {tostring(target), unpack(args)} + return utils.expr(string.format("%s[%s](%s)", tostring(target), method_string, table.concat(args0, ", ")), "statement") + end + local function double_eval_protected_method_call(ast, scope, parent, target, args) + local method_string = tostring((compiler.compile1(ast[3], scope, parent, {nval = 1}))[1]) + local call = "(function(tgt, m, ...) return tgt[m](tgt, ...) end)(%s, %s)" + table.insert(args, 1, method_string) + return utils.expr(string.format(call, tostring(target), table.concat(args, ", ")), "statement") + end + local function method_call(ast, scope, parent) + compiler.assert((2 < #ast), "expected at least 2 arguments", ast) + local _let_420_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local target = _let_420_[1] + local args = {} + for i = 4, #ast do + local subexprs + local _421_ + if (i ~= #ast) then + _421_ = 1 else - _0_ = compiler["symbol-to-expression"](fn_name, scope)[1] + _421_ = nil end - return _0_, not multi, 3 + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _421_}) + utils.map(subexprs, tostring, args) + end + if ((type(ast[3]) == "string") and utils["valid-lua-identifier?"](ast[3])) then + return native_method_call(ast, scope, parent, target, args) + elseif (target.type == "sym") then + return nonnative_method_call(ast, scope, parent, target, args) else - return nil, true, 2 + return double_eval_protected_method_call(ast, scope, parent, target, args) end end - local function compile_named_fn(ast, f_scope, f_chunk, parent, index, fn_name, local_3f, arg_name_list, arg_list, docstring) - for i = (index + 1), #ast do - compiler.compile1(ast[i], f_scope, f_chunk, {nval = (((i ~= #ast) and 0) or nil), tail = (i == #ast)}) + SPECIALS[":"] = method_call + doc_special(":", {"tbl", "method-name", "..."}, "Call the named method on tbl with the provided args.\nMethod name doesn't have to be known at compile-time; if it is, use\n(tbl:method-name ...) instead.") + SPECIALS.comment = function(ast, _, parent) + local els = {} + for i = 2, #ast do + table.insert(els, view(ast[i], {["one-line?"] = true})) end - local _0_ - if local_3f then - _0_ = "local function %s(%s)" + return compiler.emit(parent, ("--[[ " .. table.concat(els, " ") .. " ]]--"), ast) + end + doc_special("comment", {"..."}, "Comment which will be emitted in Lua output.", true) + local function hashfn_max_used(f_scope, i, max) + local max0 + if f_scope.symmeta[("$" .. i)].used then + max0 = i else - _0_ = "%s = function(%s)" + max0 = max + end + if (i < 9) then + return hashfn_max_used(f_scope, (i + 1), max0) + else + return max0 end - compiler.emit(parent, string.format(_0_, fn_name, table.concat(arg_name_list, ", ")), ast) - compiler.emit(parent, f_chunk, ast) - compiler.emit(parent, "end", ast) - set_fn_metadata(arg_list, docstring, parent, fn_name) - utils.hook("fn", ast, f_scope) - return utils.expr(fn_name, "sym") - end - local function compile_anonymous_fn(ast, f_scope, f_chunk, parent, index, arg_name_list, arg_list, docstring, scope) - local fn_name = compiler.gensym(scope) - return compile_named_fn(ast, f_scope, f_chunk, parent, index, fn_name, true, arg_name_list, arg_list, docstring) end - SPECIALS.fn = function(ast, scope, parent) - local f_scope = nil + SPECIALS.hashfn = function(ast, scope, parent) + compiler.assert((#ast == 2), "expected one argument", ast) + local f_scope do - local _0_0 = compiler["make-scope"](scope) - _0_0["vararg"] = false - f_scope = _0_0 + local _426_ = compiler["make-scope"](scope) + do end (_426_)["vararg"] = false + _426_["hashfn"] = true + f_scope = _426_ end local f_chunk = {} - local fn_sym = utils["sym?"](ast[2]) - local multi = (fn_sym and utils["multi-sym?"](fn_sym[1])) - local fn_name, local_3f, index = get_fn_name(ast, scope, fn_sym, multi) - local arg_list = compiler.assert(utils["table?"](ast[index]), "expected parameters table", ast) - compiler.assert((not multi or not multi["multi-sym-method-call"]), ("unexpected multi symbol " .. tostring(fn_name)), fn_sym) - local function get_arg_name(arg) - if utils["varg?"](arg) then - compiler.assert((arg == arg_list[#arg_list]), "expected vararg as last parameter", ast) + local name = compiler.gensym(scope) + local symbol = utils.sym(name) + local args = {} + compiler["declare-local"](symbol, {}, scope, ast) + for i = 1, 9 do + args[i] = compiler["declare-local"](utils.sym(("$" .. i)), {}, f_scope, ast) + end + local function walker(idx, node, parent_node) + if (utils["sym?"](node) and (tostring(node) == "$...")) then + parent_node[idx] = utils.varg() f_scope.vararg = true - return "..." - elseif (utils["sym?"](arg) and (utils.deref(arg) ~= "nil") and not utils["multi-sym?"](utils.deref(arg))) then - return compiler["declare-local"](arg, {}, f_scope, ast) - elseif utils["table?"](arg) then - local raw = utils.sym(compiler.gensym(scope)) - local declared = compiler["declare-local"](raw, {}, f_scope, ast) - compiler.destructure(arg, raw, ast, f_scope, f_chunk, {declaration = true, nomulti = true, symtype = "arg"}) - return declared + return nil else - return compiler.assert(false, ("expected symbol for function parameter: %s"):format(tostring(arg)), ast[2]) + return (utils["list?"](node) or utils["table?"](node)) end end - local arg_name_list = utils.map(arg_list, get_arg_name) - local index0, docstring = nil, nil - if ((type(ast[(index + 1)]) == "string") and ((index + 1) < #ast)) then - index0, docstring = (index + 1), ast[(index + 1)] + utils["walk-tree"](ast[2], walker) + compiler.compile1(ast[2], f_scope, f_chunk, {tail = true}) + local max_used = hashfn_max_used(f_scope, 1, 0) + if f_scope.vararg then + compiler.assert((max_used == 0), "$ and $... in hashfn are mutually exclusive", ast) else - index0, docstring = index, nil end - if fn_name then - return compile_named_fn(ast, f_scope, f_chunk, parent, index0, fn_name, local_3f, arg_name_list, arg_list, docstring) + local arg_str + if f_scope.vararg then + arg_str = tostring(utils.varg()) else - return compile_anonymous_fn(ast, f_scope, f_chunk, parent, index0, arg_name_list, arg_list, docstring, scope) + arg_str = table.concat(args, ", ", 1, max_used) end + compiler.emit(parent, string.format("local function %s(%s)", name, arg_str), ast) + compiler.emit(parent, f_chunk, ast) + compiler.emit(parent, "end", ast) + return utils.expr(name, "sym") end - doc_special("fn", {"name?", "args", "docstring?", "..."}, "Function syntax. May optionally include a name and docstring.\nIf a name is provided, the function will be bound in the current scope.\nWhen called with the wrong number of args, excess args will be discarded\nand lacking args will be nil, use lambda for arity-checked functions.", true) - SPECIALS.lua = function(ast, _, parent) - compiler.assert(((#ast == 2) or (#ast == 3)), "expected 1 or 2 arguments", ast) - local _1_ - do - local _0_0 = utils["sym?"](ast[2]) - if _0_0 then - _1_ = utils.deref(_0_0) + doc_special("hashfn", {"..."}, "Function literal shorthand; args are either $... OR $1, $2, etc.") + local function arithmetic_special(name, zero_arity, unary_prefix, ast, scope, parent) + local len = #ast + local operands = {} + local padded_op = (" " .. name .. " ") + for i = 2, len do + local subexprs = compiler.compile1(ast[i], scope, parent) + if (i == len) then + utils.map(subexprs, tostring, operands) else - _1_ = _0_0 + table.insert(operands, tostring(subexprs[1])) end end - if ("nil" ~= _1_) then - table.insert(parent, {ast = ast, leaf = tostring(ast[2])}) - end - local _2_ - do - local _1_0 = utils["sym?"](ast[3]) - if _1_0 then - _2_ = utils.deref(_1_0) + local _431_ = #operands + if (_431_ == 0) then + local _433_ + do + local _432_ = zero_arity + compiler.assert(_432_, "Expected more than 0 arguments", ast) + _433_ = _432_ + end + return utils.expr(_433_, "literal") + elseif (_431_ == 1) then + if unary_prefix then + return ("(" .. unary_prefix .. padded_op .. operands[1] .. ")") else - _2_ = _1_0 + return operands[1] end - end - if ("nil" ~= _2_) then - return tostring(ast[3]) + elseif true then + local _ = _431_ + return ("(" .. table.concat(operands, padded_op) .. ")") + else + return nil end end - SPECIALS.doc = function(ast, scope, parent) - assert(utils.root.options.useMetadata, "can't look up doc with metadata disabled.") - compiler.assert((#ast == 2), "expected one argument", ast) - local target = utils.deref(ast[2]) - local special_or_macro = (scope.specials[target] or scope.macros[target]) - if special_or_macro then - return ("print(%q)"):format(doc_2a(special_or_macro, target)) - else - local _0_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local value = _0_[1] - return ("print(require('%s').doc(%s, '%s'))"):format((utils.root.options.moduleName or "fennel"), tostring(value), tostring(ast[2])) + local function define_arithmetic_special(name, zero_arity, unary_prefix, _3flua_name) + local _439_ + do + local _436_ = (_3flua_name or name) + local _437_ = zero_arity + local _438_ = unary_prefix + local function _440_(...) + return arithmetic_special(_436_, _437_, _438_, ...) + end + _439_ = _440_ end + SPECIALS[name] = _439_ + return doc_special(name, {"a", "b", "..."}, "Arithmetic operator; works the same as Lua but accepts more arguments.") end - doc_special("doc", {"x"}, "Print the docstring and arglist for a function, macro, or special form.") - local function dot(ast, scope, parent) - compiler.assert((1 < #ast), "expected table argument", ast) - local len = #ast - local _0_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local lhs = _0_[1] - if (len == 2) then - return tostring(lhs) + define_arithmetic_special("+", "0") + define_arithmetic_special("..", "''") + define_arithmetic_special("^") + define_arithmetic_special("-", nil, "") + define_arithmetic_special("*", "1") + define_arithmetic_special("%") + define_arithmetic_special("/", nil, "1") + define_arithmetic_special("//", nil, "1") + SPECIALS["or"] = function(ast, scope, parent) + return arithmetic_special("or", "false", nil, ast, scope, parent) + end + SPECIALS["and"] = function(ast, scope, parent) + return arithmetic_special("and", "true", nil, ast, scope, parent) + end + doc_special("and", {"a", "b", "..."}, "Boolean operator; works the same as Lua but accepts more arguments.") + doc_special("or", {"a", "b", "..."}, "Boolean operator; works the same as Lua but accepts more arguments.") + local function bitop_special(native_name, lib_name, zero_arity, unary_prefix, ast, scope, parent) + if (#ast == 1) then + return compiler.assert(zero_arity, "Expected more than 0 arguments.", ast) else - local indices = {} - for i = 3, len do - local index = ast[i] - if ((type(index) == "string") and utils["valid-lua-identifier?"](index)) then - table.insert(indices, ("." .. index)) + local len = #ast + local operands = {} + local padded_native_name = (" " .. native_name .. " ") + local prefixed_lib_name = ("bit." .. lib_name) + for i = 2, len do + local subexprs + local _441_ + if (i ~= len) then + _441_ = 1 else - local _1_ = compiler.compile1(index, scope, parent, {nval = 1}) - local index0 = _1_[1] - table.insert(indices, ("[" .. tostring(index0) .. "]")) + _441_ = nil end + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _441_}) + utils.map(subexprs, tostring, operands) end - if (tostring(lhs):find("[{\"0-9]") or ("nil" == tostring(lhs))) then - return ("(" .. tostring(lhs) .. ")" .. table.concat(indices)) + if (#operands == 1) then + if utils.root.options.useBitLib then + return (prefixed_lib_name .. "(" .. unary_prefix .. ", " .. operands[1] .. ")") + else + return ("(" .. unary_prefix .. padded_native_name .. operands[1] .. ")") + end else - return (tostring(lhs) .. table.concat(indices)) + if utils.root.options.useBitLib then + return (prefixed_lib_name .. "(" .. table.concat(operands, ", ") .. ")") + else + return ("(" .. table.concat(operands, padded_native_name) .. ")") + end end end end - SPECIALS["."] = dot - doc_special(".", {"tbl", "key1", "..."}, "Look up key1 in tbl table. If more args are provided, do a nested lookup.") - SPECIALS.global = function(ast, scope, parent) - compiler.assert((#ast == 3), "expected name and value", ast) - compiler.destructure(ast[2], ast[3], ast, scope, parent, {forceglobal = true, nomulti = true, symtype = "global"}) + local function define_bitop_special(name, zero_arity, unary_prefix, native) + local _451_ + do + local _447_ = native + local _448_ = name + local _449_ = zero_arity + local _450_ = unary_prefix + local function _452_(...) + return bitop_special(_447_, _448_, _449_, _450_, ...) + end + _451_ = _452_ + end + SPECIALS[name] = _451_ return nil end - doc_special("global", {"name", "val"}, "Set name as a global with val.") - SPECIALS.set = function(ast, scope, parent) - compiler.assert((#ast == 3), "expected name and value", ast) - compiler.destructure(ast[2], ast[3], ast, scope, parent, {noundef = true, symtype = "set"}) - return nil + define_bitop_special("lshift", nil, "1", "<<") + define_bitop_special("rshift", nil, "1", ">>") + define_bitop_special("band", "0", "0", "&") + define_bitop_special("bor", "0", "0", "|") + define_bitop_special("bxor", "0", "0", "~") + doc_special("lshift", {"x", "n"}, "Bitwise logical left shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("rshift", {"x", "n"}, "Bitwise logical right shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("band", {"x1", "x2", "..."}, "Bitwise AND of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("bor", {"x1", "x2", "..."}, "Bitwise OR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("bxor", {"x1", "x2", "..."}, "Bitwise XOR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + doc_special("..", {"a", "b", "..."}, "String concatenation operator; works the same as Lua but accepts more arguments.") + local function native_comparator(op, _453_, scope, parent) + local _arg_454_ = _453_ + local _ = _arg_454_[1] + local lhs_ast = _arg_454_[2] + local rhs_ast = _arg_454_[3] + local _let_455_ = compiler.compile1(lhs_ast, scope, parent, {nval = 1}) + local lhs = _let_455_[1] + local _let_456_ = compiler.compile1(rhs_ast, scope, parent, {nval = 1}) + local rhs = _let_456_[1] + return string.format("(%s %s %s)", tostring(lhs), op, tostring(rhs)) end - doc_special("set", {"name", "val"}, "Set a local variable to a new value. Only works on locals using var.") - local function set_forcibly_21_2a(ast, scope, parent) - compiler.assert((#ast == 3), "expected name and value", ast) - compiler.destructure(ast[2], ast[3], ast, scope, parent, {forceset = true, symtype = "set"}) - return nil + local function double_eval_protected_comparator(op, chain_op, ast, scope, parent) + local arglist = {} + local comparisons = {} + local vals = {} + local chain = string.format(" %s ", (chain_op or "and")) + for i = 2, #ast do + table.insert(arglist, tostring(compiler.gensym(scope))) + table.insert(vals, tostring((compiler.compile1(ast[i], scope, parent, {nval = 1}))[1])) + end + for i = 1, (#arglist - 1) do + table.insert(comparisons, string.format("(%s %s %s)", arglist[i], op, arglist[(i + 1)])) + end + return string.format("(function(%s) return %s end)(%s)", table.concat(arglist, ","), table.concat(comparisons, chain), table.concat(vals, ",")) end - SPECIALS["set-forcibly!"] = set_forcibly_21_2a - local function local_2a(ast, scope, parent) - compiler.assert((#ast == 3), "expected name and value", ast) - compiler.destructure(ast[2], ast[3], ast, scope, parent, {declaration = true, nomulti = true, symtype = "local"}) - return nil + local function define_comparator_special(name, _3flua_op, _3fchain_op) + do + local op = (_3flua_op or name) + local function opfn(ast, scope, parent) + compiler.assert((2 < #ast), "expected at least two arguments", ast) + if (3 == #ast) then + return native_comparator(op, ast, scope, parent) + else + return double_eval_protected_comparator(op, _3fchain_op, ast, scope, parent) + end + end + SPECIALS[name] = opfn + end + return doc_special(name, {"a", "b", "..."}, "Comparison operator; works the same as Lua but accepts more arguments.") end - SPECIALS["local"] = local_2a - doc_special("local", {"name", "val"}, "Introduce new top-level immutable local.") - SPECIALS.var = function(ast, scope, parent) - compiler.assert((#ast == 3), "expected name and value", ast) - compiler.destructure(ast[2], ast[3], ast, scope, parent, {declaration = true, isvar = true, nomulti = true, symtype = "var"}) + define_comparator_special(">") + define_comparator_special("<") + define_comparator_special(">=") + define_comparator_special("<=") + define_comparator_special("=", "==") + define_comparator_special("not=", "~=", "or") + local function define_unary_special(op, _3frealop) + local function opfn(ast, scope, parent) + compiler.assert((#ast == 2), "expected one argument", ast) + local tail = compiler.compile1(ast[2], scope, parent, {nval = 1}) + return ((_3frealop or op) .. tostring(tail[1])) + end + SPECIALS[op] = opfn return nil end - doc_special("var", {"name", "val"}, "Introduce new mutable local.") - SPECIALS.let = function(ast, scope, parent, opts) - local bindings = ast[2] - local pre_syms = {} - compiler.assert((utils["list?"](bindings) or utils["table?"](bindings)), "expected binding table", ast) - compiler.assert(((#bindings % 2) == 0), "expected even number of name/value bindings", ast[2]) - compiler.assert((#ast >= 3), "expected body expression", ast[1]) - for _ = 1, (opts.nval or 0) do - table.insert(pre_syms, compiler.gensym(scope)) - end - local sub_scope = compiler["make-scope"](scope) - local sub_chunk = {} - for i = 1, #bindings, 2 do - compiler.destructure(bindings[i], bindings[(i + 1)], ast, sub_scope, sub_chunk, {declaration = true, nomulti = true, symtype = "let"}) + define_unary_special("not", "not ") + doc_special("not", {"x"}, "Logical operator; works the same as Lua.") + define_unary_special("bnot", "~") + doc_special("bnot", {"x"}, "Bitwise negation; only works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") + define_unary_special("length", "#") + doc_special("length", {"x"}, "Returns the length of a table or string.") + do end (SPECIALS)["~="] = SPECIALS["not="] + SPECIALS["#"] = SPECIALS.length + SPECIALS.quote = function(ast, scope, parent) + compiler.assert((#ast == 2), "expected one argument", ast) + local runtime, this_scope = true, scope + while this_scope do + this_scope = this_scope.parent + if (this_scope == compiler.scopes.compiler) then + runtime = false + else + end end - return SPECIALS["do"](ast, scope, parent, opts, 3, sub_chunk, sub_scope, pre_syms) + return compiler["do-quote"](ast[2], scope, parent, runtime) end - doc_special("let", {"[name1 val1 ... nameN valN]", "..."}, "Introduces a new scope in which a given set of local bindings are used.", true) - local function get_prev_line(parent) - if ("table" == type(parent)) then - return get_prev_line((parent.leaf or parent[#parent])) + doc_special("quote", {"x"}, "Quasiquote the following form. Only works in macro/compiler scope.") + local macro_loaded = {} + local function safe_getmetatable(tbl) + local mt = getmetatable(tbl) + assert((mt ~= getmetatable("")), "Illegal metatable access!") + return mt + end + local safe_require = nil + local function safe_compiler_env() + return {table = utils.copy(table), math = utils.copy(math), string = utils.copy(string), pairs = pairs, ipairs = ipairs, select = select, tostring = tostring, tonumber = tonumber, bit = rawget(_G, "bit"), pcall = pcall, xpcall = xpcall, next = next, print = print, type = type, assert = assert, error = error, setmetatable = setmetatable, getmetatable = safe_getmetatable, require = safe_require, rawlen = rawget(_G, "rawlen"), rawget = rawget, rawset = rawset, rawequal = rawequal, _VERSION = _VERSION} + end + local function combined_mt_pairs(env) + local combined = {} + local _let_459_ = getmetatable(env) + local __index = _let_459_["__index"] + if ("table" == type(__index)) then + for k, v in pairs(__index) do + combined[k] = v + end else - return (parent or "") end + for k, v in next, env, nil do + combined[k] = v + end + return next, combined, nil end - local function disambiguate_3f(rootstr, parent) - local function _1_() - local _0_0 = get_prev_line(parent) - if (nil ~= _0_0) then - local prev_line = _0_0 - return prev_line:match("%)$") + local function make_compiler_env(ast, scope, parent, _3fopts) + local provided + do + local _461_ = (_3fopts or utils.root.options) + if ((_G.type(_461_) == "table") and ((_461_)["compiler-env"] == "strict")) then + provided = safe_compiler_env() + elseif ((_G.type(_461_) == "table") and (nil ~= (_461_).compilerEnv)) then + local compilerEnv = (_461_).compilerEnv + provided = compilerEnv + elseif ((_G.type(_461_) == "table") and (nil ~= (_461_)["compiler-env"])) then + local compiler_env = (_461_)["compiler-env"] + provided = compiler_env + elseif true then + local _ = _461_ + provided = safe_compiler_env(false) + else + provided = nil end end - return (rootstr:match("^{") or _1_()) - end - SPECIALS.tset = function(ast, scope, parent) - compiler.assert((#ast > 3), "expected table, key, and value arguments", ast) - local root = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] - local keys = {} - for i = 3, (#ast - 1) do - local _0_ = compiler.compile1(ast[i], scope, parent, {nval = 1}) - local key = _0_[1] - table.insert(keys, tostring(key)) + local env + local function _463_(base) + return utils.sym(compiler.gensym((compiler.scopes.macro or scope), base)) end - local value = compiler.compile1(ast[#ast], scope, parent, {nval = 1})[1] - local rootstr = tostring(root) - local fmtstr = nil - if disambiguate_3f(rootstr, parent) then - fmtstr = "do end (%s)[%s] = %s" - else - fmtstr = "%s[%s] = %s" + local function _464_() + return compiler.scopes.macro end - return compiler.emit(parent, fmtstr:format(rootstr, table.concat(keys, "]["), tostring(value)), ast) + local function _465_(symbol) + compiler.assert(compiler.scopes.macro, "must call from macro", ast) + return compiler.scopes.macro.manglings[tostring(symbol)] + end + local function _466_(form) + compiler.assert(compiler.scopes.macro, "must call from macro", ast) + return compiler.macroexpand(form, compiler.scopes.macro) + end + env = {_AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), ["macro-loaded"] = macro_loaded, unpack = unpack, ["assert-compile"] = compiler.assert, view = view, version = utils.version, metadata = compiler.metadata, list = utils.list, ["list?"] = utils["list?"], ["table?"] = utils["table?"], sequence = utils.sequence, ["sequence?"] = utils["sequence?"], sym = utils.sym, ["sym?"] = utils["sym?"], ["multi-sym?"] = utils["multi-sym?"], comment = utils.comment, ["comment?"] = utils["comment?"], ["varg?"] = utils["varg?"], gensym = _463_, ["get-scope"] = _464_, ["in-scope?"] = _465_, macroexpand = _466_} + env._G = env + return setmetatable(env, {__index = provided, __newindex = provided, __pairs = combined_mt_pairs}) end - doc_special("tset", {"tbl", "key1", "...", "keyN", "val"}, "Set the value of a table field. Can take additional keys to set\nnested values, but all parents must contain an existing table.") - local function calculate_target(scope, opts) - if not (opts.tail or opts.target or opts.nval) then - return "iife", true, nil - elseif (opts.nval and (opts.nval ~= 0) and not opts.target) then - local accum = {} - local target_exprs = {} - for i = 1, opts.nval do - local s = compiler.gensym(scope) - accum[i] = s - target_exprs[i] = utils.expr(s, "sym") + local function _468_(...) + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for c in string.gmatch((package.config or ""), "([^\n]+)") do + local val_16_auto = c + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else end - return "target", opts.tail, table.concat(accum, ", "), target_exprs - else - return "none", opts.tail, opts.target end + return tbl_14_auto end - local function if_2a(ast, scope, parent, opts) - local do_scope = compiler["make-scope"](scope) - local branches = {} - local wrapper, inner_tail, inner_target, target_exprs = calculate_target(scope, opts) - local body_opts = {nval = opts.nval, tail = inner_tail, target = inner_target} - local function compile_body(i) - local chunk = {} - local cscope = compiler["make-scope"](do_scope) - compiler["keep-side-effects"](compiler.compile1(ast[i], cscope, chunk, body_opts), chunk, nil, ast[i]) - return {chunk = chunk, scope = cscope} - end - for i = 2, (#ast - 1), 2 do - local condchunk = {} - local res = compiler.compile1(ast[i], do_scope, condchunk, {nval = 1}) - local cond = res[1] - local branch = compile_body((i + 1)) - branch.cond = cond - branch.condchunk = condchunk - branch.nested = ((i ~= 2) and (next(condchunk, nil) == nil)) - table.insert(branches, branch) - end - local has_else_3f = ((#ast > 3) and ((#ast % 2) == 0)) - local else_branch = (has_else_3f and compile_body(#ast)) - local s = compiler.gensym(scope) - local buffer = {} - local last_buffer = buffer - for i = 1, #branches do - local branch = branches[i] - local fstr = nil - if not branch.nested then - fstr = "if %s then" + local _local_467_ = _468_(...) + local dirsep = _local_467_[1] + local pathsep = _local_467_[2] + local pathmark = _local_467_[3] + local pkg_config = {dirsep = (dirsep or "/"), pathmark = (pathmark or ";"), pathsep = (pathsep or "?")} + local function escapepat(str) + return string.gsub(str, "[^%w]", "%%%1") + end + local function search_module(modulename, _3fpathstring) + local pathsepesc = escapepat(pkg_config.pathsep) + local pattern = ("([^%s]*)%s"):format(pathsepesc, pathsepesc) + local no_dot_module = modulename:gsub("%.", pkg_config.dirsep) + local fullpath = ((_3fpathstring or utils["fennel-module"].path) .. pkg_config.pathsep) + local function try_path(path) + local filename = path:gsub(escapepat(pkg_config.pathmark), no_dot_module) + local filename2 = path:gsub(escapepat(pkg_config.pathmark), modulename) + local _470_ = (io.open(filename) or io.open(filename2)) + if (nil ~= _470_) then + local file = _470_ + file:close() + return filename else - fstr = "elseif %s then" + return nil end - local cond = tostring(branch.cond) - local cond_line = nil - if ((cond == "true") and branch.nested and (i == #branches) and not has_else_3f) then - cond_line = "else" + end + local function find_in_path(start) + local _472_ = fullpath:match(pattern, start) + if (nil ~= _472_) then + local path = _472_ + return (try_path(path) or find_in_path((start + #path + 1))) else - cond_line = fstr:format(cond) + return nil end - if branch.nested then - compiler.emit(last_buffer, branch.condchunk, ast) - else - for _, v in ipairs(branch.condchunk) do - compiler.emit(last_buffer, v, ast) - end + end + return find_in_path(1) + end + local function make_searcher(_3foptions) + local function _474_(module_name) + local opts = utils.copy(utils.root.options) + for k, v in pairs((_3foptions or {})) do + opts[k] = v end - compiler.emit(last_buffer, cond_line, ast) - compiler.emit(last_buffer, branch.chunk, ast) - if (i == #branches) then - if has_else_3f then - compiler.emit(last_buffer, "else", ast) - compiler.emit(last_buffer, else_branch.chunk, ast) - elseif (inner_target and (cond_line ~= "else")) then - compiler.emit(last_buffer, "else", ast) - compiler.emit(last_buffer, ("%s = nil"):format(inner_target), ast) + opts["module-name"] = module_name + local _475_ = search_module(module_name) + if (nil ~= _475_) then + local filename = _475_ + local _478_ + do + local _476_ = filename + local _477_ = opts + local function _479_(...) + return utils["fennel-module"].dofile(_476_, _477_, ...) + end + _478_ = _479_ end - compiler.emit(last_buffer, "end", ast) - elseif not branches[(i + 1)].nested then - local next_buffer = {} - compiler.emit(last_buffer, "else", ast) - compiler.emit(last_buffer, next_buffer, ast) - compiler.emit(last_buffer, "end", ast) - last_buffer = next_buffer + return _478_, filename + else + return nil end end - if (wrapper == "iife") then - local iifeargs = ((scope.vararg and "...") or "") - compiler.emit(parent, ("local function %s(%s)"):format(tostring(s), iifeargs), ast) - compiler.emit(parent, buffer, ast) - compiler.emit(parent, "end", ast) - return utils.expr(("%s(%s)"):format(tostring(s), iifeargs), "statement") - elseif (wrapper == "none") then - for i = 1, #buffer do - compiler.emit(parent, buffer[i], ast) + return _474_ + end + local function fennel_macro_searcher(module_name) + local opts + do + local _481_ = utils.copy(utils.root.options) + do end (_481_)["env"] = "_COMPILER" + _481_["requireAsInclude"] = false + _481_["allowedGlobals"] = nil + opts = _481_ + end + local _482_ = search_module(module_name, utils["fennel-module"]["macro-path"]) + if (nil ~= _482_) then + local filename = _482_ + local _485_ + do + local _483_ = filename + local _484_ = opts + local function _486_(...) + return utils["fennel-module"].dofile(_483_, _484_, ...) + end + _485_ = _486_ end - return {returned = true} + return _485_, filename else - compiler.emit(parent, ("local %s"):format(inner_target), ast) - for i = 1, #buffer do - compiler.emit(parent, buffer[i], ast) - end - return target_exprs - end - end - SPECIALS["if"] = if_2a - doc_special("if", {"cond1", "body1", "...", "condN", "bodyN"}, "Conditional form.\nTakes any number of condition/body pairs and evaluates the first body where\nthe condition evaluates to truthy. Similar to cond in other lisps.") - local function remove_until_condition(bindings) - if ("until" == bindings[(#bindings - 1)]) then - table.remove(bindings, (#bindings - 1)) - return table.remove(bindings) - end - end - local function compile_until(condition, scope, chunk) - if condition then - local _0_ = compiler.compile1(condition, scope, chunk, {nval = 1}) - local condition_lua = _0_[1] - return compiler.emit(chunk, ("if %s then break end"):format(tostring(condition_lua)), utils.expr(condition, "expression")) + return nil end end - SPECIALS.each = function(ast, scope, parent) - compiler.assert((#ast >= 3), "expected body expression", ast[1]) - local binding = compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) - local _ = compiler.assert((2 <= #binding), "expected binding and iterator", binding) - local until_condition = remove_until_condition(binding) - local iter = table.remove(binding, #binding) - local destructures = {} - local new_manglings = {} - local sub_scope = compiler["make-scope"](scope) - local function destructure_binding(v) - compiler.assert(("string" ~= type(v)), ("unexpected iterator clause " .. tostring(v)), binding) - if utils["sym?"](v) then - return compiler["declare-local"](v, {}, sub_scope, ast, new_manglings) - else - local raw = utils.sym(compiler.gensym(sub_scope)) - destructures[raw] = v - return compiler["declare-local"](raw, {}, sub_scope, ast) + local function lua_macro_searcher(module_name) + local _488_ = search_module(module_name, package.path) + if (nil ~= _488_) then + local filename = _488_ + local code + do + local f = io.open(filename) + local function close_handlers_8_auto(ok_9_auto, ...) + f:close() + if ok_9_auto then + return ... + else + return error(..., 0) + end + end + local function _490_() + return assert(f:read("*a")) + end + code = close_handlers_8_auto(_G.xpcall(_490_, (package.loaded.fennel or debug).traceback)) end + local chunk = load_code(code, make_compiler_env(), filename) + return chunk, filename + else + return nil end - local bind_vars = utils.map(binding, destructure_binding) - local vals = compiler.compile1(iter, sub_scope, parent) - local val_names = utils.map(vals, tostring) - local chunk = {} - compiler.emit(parent, ("for %s in %s do"):format(table.concat(bind_vars, ", "), table.concat(val_names, ", ")), ast) - for raw, args in utils.stablepairs(destructures) do - compiler.destructure(args, raw, ast, sub_scope, chunk, {declaration = true, nomulti = true, symtype = "each"}) - end - compiler["apply-manglings"](sub_scope, new_manglings, ast) - compile_until(until_condition, sub_scope, chunk) - compile_do(ast, sub_scope, chunk, 3) - compiler.emit(parent, chunk, ast) - return compiler.emit(parent, "end", ast) end - doc_special("each", {"[key value (iterator)]", "..."}, "Runs the body once for each set of values provided by the given iterator.\nMost commonly used with ipairs for sequential tables or pairs for undefined\norder, but can be used with any iterator.", true) - local function while_2a(ast, scope, parent) - local len1 = #parent - local condition = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] - local len2 = #parent - local sub_chunk = {} - if (len1 ~= len2) then - for i = (len1 + 1), len2 do - table.insert(sub_chunk, parent[i]) - parent[i] = nil + local macro_searchers = {fennel_macro_searcher, lua_macro_searcher} + local function search_macro_module(modname, n) + local _492_ = macro_searchers[n] + if (nil ~= _492_) then + local f = _492_ + local _493_, _494_ = f(modname) + if ((nil ~= _493_) and true) then + local loader = _493_ + local _3ffilename = _494_ + return loader, _3ffilename + elseif true then + local _ = _493_ + return search_macro_module(modname, (n + 1)) + else + return nil end - compiler.emit(parent, "while true do", ast) - compiler.emit(sub_chunk, ("if not %s then break end"):format(condition[1]), ast) else - compiler.emit(parent, ("while " .. tostring(condition) .. " do"), ast) - end - compile_do(ast, compiler["make-scope"](scope), sub_chunk, 3) - compiler.emit(parent, sub_chunk, ast) - return compiler.emit(parent, "end", ast) - end - SPECIALS["while"] = while_2a - doc_special("while", {"condition", "..."}, "The classic while loop. Evaluates body until a condition is non-truthy.", true) - local function for_2a(ast, scope, parent) - local ranges = compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) - local until_condition = remove_until_condition(ast[2]) - local binding_sym = table.remove(ast[2], 1) - local sub_scope = compiler["make-scope"](scope) - local range_args = {} - local chunk = {} - compiler.assert(utils["sym?"](binding_sym), ("unable to bind %s %s"):format(type(binding_sym), tostring(binding_sym)), ast[2]) - compiler.assert((#ast >= 3), "expected body expression", ast[1]) - compiler.assert((#ranges <= 3), "unexpected arguments", ranges[4]) - for i = 1, math.min(#ranges, 3) do - range_args[i] = tostring(compiler.compile1(ranges[i], sub_scope, parent, {nval = 1})[1]) + return nil end - compiler.emit(parent, ("for %s = %s do"):format(compiler["declare-local"](binding_sym, {}, sub_scope, ast), table.concat(range_args, ", ")), ast) - compile_until(until_condition, sub_scope, chunk) - compile_do(ast, sub_scope, chunk, 3) - compiler.emit(parent, chunk, ast) - return compiler.emit(parent, "end", ast) end - SPECIALS["for"] = for_2a - doc_special("for", {"[index start stop step?]", "..."}, "Numeric loop construct.\nEvaluates body once for each value between start and stop (inclusive).", true) - local function native_method_call(ast, _scope, _parent, target, args) - local _0_ = ast - local _ = _0_[1] - local _0 = _0_[2] - local method_string = _0_[3] - local call_string = nil - if ((target.type == "literal") or (target.type == "varg") or (target.type == "expression")) then - call_string = "(%s):%s(%s)" + local function metadata_only_fennel(modname) + if ((modname == "fennel.macros") or (package and package.loaded and ("table" == type(package.loaded[modname])) and (package.loaded[modname].metadata == compiler.metadata))) then + return {metadata = compiler.metadata} else - call_string = "%s:%s(%s)" + return nil end - return utils.expr(string.format(call_string, tostring(target), method_string, table.concat(args, ", ")), "statement") - end - local function nonnative_method_call(ast, scope, parent, target, args) - local method_string = tostring(compiler.compile1(ast[3], scope, parent, {nval = 1})[1]) - local args0 = {tostring(target), unpack(args)} - return utils.expr(string.format("%s[%s](%s)", tostring(target), method_string, table.concat(args0, ", ")), "statement") - end - local function double_eval_protected_method_call(ast, scope, parent, target, args) - local method_string = tostring(compiler.compile1(ast[3], scope, parent, {nval = 1})[1]) - local call = "(function(tgt, m, ...) return tgt[m](tgt, ...) end)(%s, %s)" - table.insert(args, 1, method_string) - return utils.expr(string.format(call, tostring(target), table.concat(args, ", ")), "statement") end - local function method_call(ast, scope, parent) - compiler.assert((2 < #ast), "expected at least 2 arguments", ast) - local _0_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local target = _0_[1] - local args = {} - for i = 4, #ast do - local subexprs = nil - local _1_ - if (i ~= #ast) then - _1_ = 1 - else - _1_ = nil - end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _1_}) - utils.map(subexprs, tostring, args) - end - if ((type(ast[3]) == "string") and utils["valid-lua-identifier?"](ast[3])) then - return native_method_call(ast, scope, parent, target, args) - elseif (target.type == "sym") then - return nonnative_method_call(ast, scope, parent, target, args) - else - return double_eval_protected_method_call(ast, scope, parent, target, args) + local function _498_(modname) + local function _499_() + local loader, filename = search_macro_module(modname, 1) + compiler.assert(loader, (modname .. " module not found.")) + do end (macro_loaded)[modname] = loader(modname, filename) + return macro_loaded[modname] end + return (macro_loaded[modname] or metadata_only_fennel(modname) or _499_()) end - SPECIALS[":"] = method_call - doc_special(":", {"tbl", "method-name", "..."}, "Call the named method on tbl with the provided args.\nMethod name doesn't have to be known at compile-time; if it is, use\n(tbl:method-name ...) instead.") - SPECIALS.comment = function(ast, _, parent) - local els = {} - for i = 2, #ast do - table.insert(els, view(ast[i], {["one-line?"] = true})) + safe_require = _498_ + local function add_macros(macros_2a, ast, scope) + compiler.assert(utils["table?"](macros_2a), "expected macros to be table", ast) + for k, v in pairs(macros_2a) do + compiler.assert((type(v) == "function"), "expected each macro to be function", ast) + do end (scope.macros)[k] = v end - return compiler.emit(parent, ("-- " .. table.concat(els, " ")), ast) + return nil end - doc_special("comment", {"..."}, "Comment which will be emitted in Lua output.", true) - local function hashfn_max_used(f_scope, i, max) - local max0 = nil - if f_scope.symmeta[("$" .. i)].used then - max0 = i + local function resolve_module_name(_500_, _scope, _parent, opts) + local _arg_501_ = _500_ + local filename = _arg_501_["filename"] + local second = _arg_501_[2] + local filename0 = (filename or (utils["table?"](second) and second.filename)) + local module_name = utils.root.options["module-name"] + local modexpr = compiler.compile(second, opts) + local modname_chunk = load_code(modexpr) + return modname_chunk(module_name, filename0) + end + SPECIALS["require-macros"] = function(ast, scope, parent, _3freal_ast) + compiler.assert((#ast == 2), "Expected one module name argument", (_3freal_ast or ast)) + local modname = resolve_module_name(ast, scope, parent, {}) + compiler.assert(("string" == type(modname)), "module name must compile to string", (_3freal_ast or ast)) + if not macro_loaded[modname] then + local loader, filename = search_macro_module(modname, 1) + compiler.assert(loader, (modname .. " module not found."), ast) + do end (macro_loaded)[modname] = loader(modname, filename) else - max0 = max end - if (i < 9) then - return hashfn_max_used(f_scope, (i + 1), max0) + if ("import-macros" == tostring(ast[1])) then + return macro_loaded[modname] else - return max0 + return add_macros(macro_loaded[modname], ast, scope, parent) end end - SPECIALS.hashfn = function(ast, scope, parent) - compiler.assert((#ast == 2), "expected one argument", ast) - local f_scope = nil - do - local _0_0 = compiler["make-scope"](scope) - _0_0["vararg"] = false - _0_0["hashfn"] = true - f_scope = _0_0 + doc_special("require-macros", {"macro-module-name"}, "Load given module and use its contents as macro definitions in current scope.\nMacro module should return a table of macro functions with string keys.\nConsider using import-macros instead as it is more flexible.") + local function emit_included_fennel(src, path, opts, sub_chunk) + local subscope = compiler["make-scope"](utils.root.scope.parent) + local forms = {} + if utils.root.options.requireAsInclude then + subscope.specials.require = compiler["require-include"] + else end - local f_chunk = {} - local name = compiler.gensym(scope) - local symbol = utils.sym(name) - local args = {} - compiler["declare-local"](symbol, {}, scope, ast) - for i = 1, 9 do - args[i] = compiler["declare-local"](utils.sym(("$" .. i)), {}, f_scope, ast) + for _, val in parser.parser(parser["string-stream"](src), path) do + table.insert(forms, val) end - local function walker(idx, node, parent_node) - if (utils["sym?"](node) and (utils.deref(node) == "$...")) then - parent_node[idx] = utils.varg() - f_scope.vararg = true - return nil + for i = 1, #forms do + local subopts + if (i == #forms) then + subopts = {tail = true} else - return (utils["list?"](node) or utils["table?"](node)) + subopts = {nval = 0} end + utils["propagate-options"](opts, subopts) + compiler.compile1(forms[i], subscope, sub_chunk, subopts) end - utils["walk-tree"](ast[2], walker) - compiler.compile1(ast[2], f_scope, f_chunk, {tail = true}) - local max_used = hashfn_max_used(f_scope, 1, 0) - if f_scope.vararg then - compiler.assert((max_used == 0), "$ and $... in hashfn are mutually exclusive", ast) - end - local arg_str = nil - if f_scope.vararg then - arg_str = utils.deref(utils.varg()) - else - arg_str = table.concat(args, ", ", 1, max_used) - end - compiler.emit(parent, string.format("local function %s(%s)", name, arg_str), ast) - compiler.emit(parent, f_chunk, ast) - compiler.emit(parent, "end", ast) - return utils.expr(name, "sym") + return nil end - doc_special("hashfn", {"..."}, "Function literal shorthand; args are either $... OR $1, $2, etc.") - local function arithmetic_special(name, zero_arity, unary_prefix, nval, ast, scope, parent) - local _0_0 = #ast - if (_0_0 == 1) then - compiler.assert(zero_arity, "Expected more than 0 arguments", ast) - return utils.expr(zero_arity, "literal") - elseif (nil ~= _0_0) then - local len = _0_0 - local operands = {} - local padded_op = (" " .. name .. " ") - for i = 2, len do - local subexprs = compiler.compile1(ast[i], scope, parent, {nval = nval}) - utils.map(subexprs, tostring, operands) - end - if (#operands == 1) then - if unary_prefix then - return ("(" .. unary_prefix .. padded_op .. operands[1] .. ")") + local function include_path(ast, opts, path, mod, fennel_3f) + utils.root.scope.includes[mod] = "fnl/loading" + local src + do + local f = assert(io.open(path)) + local function close_handlers_8_auto(ok_9_auto, ...) + f:close() + if ok_9_auto then + return ... else - return operands[1] + return error(..., 0) end - else - return ("(" .. table.concat(operands, padded_op) .. ")") end + local function _507_() + return f:read("*all"):gsub("[\13\n]*$", "") + end + src = close_handlers_8_auto(_G.xpcall(_507_, (package.loaded.fennel or debug).traceback)) + end + local ret = utils.expr(("require(\"" .. mod .. "\")"), "statement") + local target = ("package.preload[%q]"):format(mod) + local preload_str = (target .. " = " .. target .. " or function(...)") + local temp_chunk, sub_chunk = {}, {} + compiler.emit(temp_chunk, preload_str, ast) + compiler.emit(temp_chunk, sub_chunk) + compiler.emit(temp_chunk, "end", ast) + for i, v in ipairs(temp_chunk) do + table.insert(utils.root.chunk, i, v) + end + if fennel_3f then + emit_included_fennel(src, path, opts, sub_chunk) + else + compiler.emit(sub_chunk, src, ast) end + utils.root.scope.includes[mod] = ret + return ret end - local function define_arithmetic_special(name, zero_arity, unary_prefix, lua_name) - local function _0_(...) - return arithmetic_special((lua_name or name), zero_arity, unary_prefix, 1, ...) + local function include_circular_fallback(mod, modexpr, fallback, ast) + if (utils.root.scope.includes[mod] == "fnl/loading") then + compiler.assert(fallback, "circular include detected", ast) + return fallback(modexpr) + else + return nil end - SPECIALS[name] = _0_ - return doc_special(name, {"a", "b", "..."}, "Arithmetic operator; works the same as Lua but accepts more arguments.") end - define_arithmetic_special("+", "0") - define_arithmetic_special("..", "''") - define_arithmetic_special("^") - define_arithmetic_special("-", nil, "") - define_arithmetic_special("*", "1") - define_arithmetic_special("%") - define_arithmetic_special("/", nil, "1") - define_arithmetic_special("//", nil, "1") - SPECIALS["or"] = function(ast, scope, parent) - return arithmetic_special("or", "false", nil, nil, ast, scope, parent) - end - SPECIALS["and"] = function(ast, scope, parent) - return arithmetic_special("and", "true", nil, nil, ast, scope, parent) - end - doc_special("and", {"a", "b", "..."}, "Boolean operator; works the same as Lua but accepts more arguments.") - doc_special("or", {"a", "b", "..."}, "Boolean operator; works the same as Lua but accepts more arguments.") - local function bitop_special(native_name, lib_name, zero_arity, unary_prefix, ast, scope, parent) - if (#ast == 1) then - return compiler.assert(zero_arity, "Expected more than 0 arguments.", ast) - else - local len = #ast - local operands = {} - local padded_native_name = (" " .. native_name .. " ") - local prefixed_lib_name = ("bit." .. lib_name) - for i = 2, len do - local subexprs = nil - local _0_ - if (i ~= len) then - _0_ = 1 - else - _0_ = nil - end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _0_}) - utils.map(subexprs, tostring, operands) + SPECIALS.include = function(ast, scope, parent, opts) + compiler.assert((#ast == 2), "expected one argument", ast) + local modexpr + do + local _510_, _511_ = pcall(resolve_module_name, ast, scope, parent, opts) + if ((_510_ == true) and (nil ~= _511_)) then + local modname = _511_ + modexpr = utils.expr(string.format("%q", modname), "literal") + elseif true then + local _ = _510_ + modexpr = (compiler.compile1(ast[2], scope, parent, {nval = 1}))[1] + else + modexpr = nil end - if (#operands == 1) then - if utils.root.options.useBitLib then - return (prefixed_lib_name .. "(" .. unary_prefix .. ", " .. operands[1] .. ")") - else - return ("(" .. unary_prefix .. padded_native_name .. operands[1] .. ")") - end + end + if ((modexpr.type ~= "literal") or ((modexpr[1]):byte() ~= 34)) then + if opts.fallback then + return opts.fallback(modexpr) else - if utils.root.options.useBitLib then - return (prefixed_lib_name .. "(" .. table.concat(operands, ", ") .. ")") + return compiler.assert(false, "module name must be string literal", ast) + end + else + local mod = load_code(("return " .. modexpr[1]))() + local oldmod = utils.root.options["module-name"] + local _ + utils.root.options["module-name"] = mod + _ = nil + local res + local function _515_() + local _514_ = search_module(mod) + if (nil ~= _514_) then + local fennel_path = _514_ + return include_path(ast, opts, fennel_path, mod, true) + elseif true then + local _0 = _514_ + local lua_path = search_module(mod, package.path) + if lua_path then + return include_path(ast, opts, lua_path, mod, false) + elseif opts.fallback then + return opts.fallback(modexpr) + else + return compiler.assert(false, ("module not found " .. mod), ast) + end else - return ("(" .. table.concat(operands, padded_native_name) .. ")") + return nil end end + res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and utils.expr("nil --[[SKIPPED INCLUDE]]--", "literal")) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _515_()) + utils.root.options["module-name"] = oldmod + return res end end - local function define_bitop_special(name, zero_arity, unary_prefix, native) - local function _0_(...) - return bitop_special(native, name, zero_arity, unary_prefix, ...) - end - SPECIALS[name] = _0_ - return nil + doc_special("include", {"module-name-literal"}, "Like require but load the target module during compilation and embed it in the\nLua output. The module must be a string literal and resolvable at compile time.") + local function eval_compiler_2a(ast, scope, parent) + local env = make_compiler_env(ast, scope, parent) + local opts = utils.copy(utils.root.options) + opts.scope = compiler["make-scope"](compiler.scopes.compiler) + opts.allowedGlobals = current_global_names(env) + return load_code(compiler.compile(ast, opts), wrap_env(env))(opts["module-name"], ast.filename) end - define_bitop_special("lshift", nil, "1", "<<") - define_bitop_special("rshift", nil, "1", ">>") - define_bitop_special("band", "0", "0", "&") - define_bitop_special("bor", "0", "0", "|") - define_bitop_special("bxor", "0", "0", "~") - doc_special("lshift", {"x", "n"}, "Bitwise logical left shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") - doc_special("rshift", {"x", "n"}, "Bitwise logical right shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") - doc_special("band", {"x1", "x2", "..."}, "Bitwise AND of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") - doc_special("bor", {"x1", "x2", "..."}, "Bitwise OR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") - doc_special("bxor", {"x1", "x2", "..."}, "Bitwise XOR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") - doc_special("..", {"a", "b", "..."}, "String concatenation operator; works the same as Lua but accepts more arguments.") - local function native_comparator(op, _0_0, scope, parent) - local _1_ = _0_0 - local _ = _1_[1] - local lhs_ast = _1_[2] - local rhs_ast = _1_[3] - local _2_ = compiler.compile1(lhs_ast, scope, parent, {nval = 1}) - local lhs = _2_[1] - local _3_ = compiler.compile1(rhs_ast, scope, parent, {nval = 1}) - local rhs = _3_[1] - return string.format("(%s %s %s)", tostring(lhs), op, tostring(rhs)) + SPECIALS.macros = function(ast, scope, parent) + compiler.assert((#ast == 2), "Expected one table argument", ast) + return add_macros(eval_compiler_2a(ast[2], scope, parent), ast, scope, parent) end - local function double_eval_protected_comparator(op, chain_op, ast, scope, parent) - local arglist = {} - local comparisons = {} - local vals = {} - local chain = string.format(" %s ", (chain_op or "and")) - for i = 2, #ast do - table.insert(arglist, tostring(compiler.gensym(scope))) - table.insert(vals, tostring(compiler.compile1(ast[i], scope, parent, {nval = 1})[1])) + doc_special("macros", {"{:macro-name-1 (fn [...] ...) ... :macro-name-N macro-body-N}"}, "Define all functions in the given table as macros local to the current scope.") + SPECIALS["eval-compiler"] = function(ast, scope, parent) + local old_first = ast[1] + ast[1] = utils.sym("do") + local val = eval_compiler_2a(ast, scope, parent) + do end (ast)[1] = old_first + return val + end + doc_special("eval-compiler", {"..."}, "Evaluate the body at compile-time. Use the macro system instead if possible.", true) + return {doc = doc_2a, ["current-global-names"] = current_global_names, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["search-module"] = search_module, ["make-searcher"] = make_searcher, ["wrap-env"] = wrap_env} +end +package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or function(...) + local utils = require("fennel.utils") + local parser = require("fennel.parser") + local friend = require("fennel.friend") + local unpack = (table.unpack or _G.unpack) + local scopes = {} + local function make_scope(_3fparent) + local parent = (_3fparent or scopes.global) + local _203_ + if parent then + _203_ = ((parent.depth or 0) + 1) + else + _203_ = 0 end - for i = 1, (#arglist - 1) do - table.insert(comparisons, string.format("(%s %s %s)", arglist[i], op, arglist[(i + 1)])) + return {includes = setmetatable({}, {__index = (parent and parent.includes)}), macros = setmetatable({}, {__index = (parent and parent.macros)}), manglings = setmetatable({}, {__index = (parent and parent.manglings)}), specials = setmetatable({}, {__index = (parent and parent.specials)}), symmeta = setmetatable({}, {__index = (parent and parent.symmeta)}), unmanglings = setmetatable({}, {__index = (parent and parent.unmanglings)}), gensyms = setmetatable({}, {__index = (parent and parent.gensyms)}), autogensyms = setmetatable({}, {__index = (parent and parent.autogensyms)}), vararg = (parent and parent.vararg), depth = _203_, hashfn = (parent and parent.hashfn), refedglobals = {}, parent = parent} + end + local function assert_msg(ast, msg) + local ast_tbl + if ("table" == type(ast)) then + ast_tbl = ast + else + ast_tbl = {} end - return string.format("(function(%s) return %s end)(%s)", table.concat(arglist, ","), table.concat(comparisons, chain), table.concat(vals, ",")) + local m = getmetatable(ast) + local filename = ((m and m.filename) or ast_tbl.filename or "unknown") + local line = ((m and m.line) or ast_tbl.line or "?") + local target = tostring((utils["sym?"](ast_tbl[1]) or ast_tbl[1] or "()")) + return string.format("%s:%s: Compile error in '%s': %s", filename, line, target, msg) end - local function define_comparator_special(name, lua_op, chain_op) - do - local op = (lua_op or name) - local function opfn(ast, scope, parent) - compiler.assert((2 < #ast), "expected at least two arguments", ast) - if (3 == #ast) then - return native_comparator(op, ast, scope, parent) + local function assert_compile(condition, msg, ast) + if not condition then + local _let_206_ = (utils.root.options or {}) + local source = _let_206_["source"] + local unfriendly = _let_206_["unfriendly"] + if (nil == utils.hook("assert-compile", condition, msg, ast, utils.root.reset)) then + utils.root.reset() + if (unfriendly or not friend or not _G.io or not _G.io.read) then + error(assert_msg(ast, msg), 0) else - return double_eval_protected_comparator(op, chain_op, ast, scope, parent) + friend["assert-compile"](condition, msg, ast, source) end + else end - SPECIALS[name] = opfn + else end - return doc_special(name, {"a", "b", "..."}, "Comparison operator; works the same as Lua but accepts more arguments.") + return condition end - define_comparator_special(">") - define_comparator_special("<") - define_comparator_special(">=") - define_comparator_special("<=") - define_comparator_special("=", "==") - define_comparator_special("not=", "~=", "or") - local function define_unary_special(op, realop) - local function opfn(ast, scope, parent) - compiler.assert((#ast == 2), "expected one argument", ast) - local tail = compiler.compile1(ast[2], scope, parent, {nval = 1}) - return ((realop or op) .. tostring(tail[1])) + scopes.global = make_scope() + scopes.global.vararg = true + scopes.compiler = make_scope(scopes.global) + scopes.macro = scopes.global + local serialize_subst = {["\7"] = "\\a", ["\8"] = "\\b", ["\9"] = "\\t", ["\n"] = "n", ["\11"] = "\\v", ["\12"] = "\\f"} + local function serialize_string(str) + local function _210_(_241) + return ("\\" .. _241:byte()) end - SPECIALS[op] = opfn - return nil + return string.gsub(string.gsub(string.format("%q", str), ".", serialize_subst), "[\128-\255]", _210_) end - define_unary_special("not", "not ") - doc_special("not", {"x"}, "Logical operator; works the same as Lua.") - define_unary_special("bnot", "~") - doc_special("bnot", {"x"}, "Bitwise negation; only works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") - define_unary_special("length", "#") - doc_special("length", {"x"}, "Returns the length of a table or string.") - SPECIALS["~="] = SPECIALS["not="] - SPECIALS["#"] = SPECIALS.length - SPECIALS.quote = function(ast, scope, parent) - compiler.assert((#ast == 2), "expected one argument") - local runtime, this_scope = true, scope - while this_scope do - this_scope = this_scope.parent - if (this_scope == compiler.scopes.compiler) then - runtime = false + local function global_mangling(str) + if utils["valid-lua-identifier?"](str) then + return str + else + local function _211_(_241) + return string.format("_%02x", _241:byte()) end + return ("__fnl_global__" .. str:gsub("[^%w]", _211_)) end - return compiler["do-quote"](ast[2], scope, parent, runtime) end - doc_special("quote", {"x"}, "Quasiquote the following form. Only works in macro/compiler scope.") - local macro_loaded = {} - local already_warned_3f = {_G = true} - local compile_env_warning = table.concat({"WARNING: Attempting to %s %s in compile scope.", "In future versions of Fennel this will not be allowed without the", "--no-compiler-sandbox flag or passing a :compilerEnv globals table", "in the options.\n"}, "\n") - local function compiler_env_warn(_, key) - local v = _G[key] - if (v and io and io.stderr and not already_warned_3f[key]) then - already_warned_3f[key] = true - do end (io.stderr):write(compile_env_warning:format("use global", key)) + local function global_unmangling(identifier) + local _213_ = string.match(identifier, "^__fnl_global__(.*)$") + if (nil ~= _213_) then + local rest = _213_ + local _214_ + local function _215_(_241) + return string.char(tonumber(_241:sub(2), 16)) + end + _214_ = string.gsub(rest, "_[%da-f][%da-f]", _215_) + return _214_ + elseif true then + local _ = _213_ + return identifier + else + return nil end - return v end - local function safe_getmetatable(tbl) - local mt = getmetatable(tbl) - assert((mt ~= getmetatable("")), "Illegal metatable access!") - return mt + local allowed_globals = nil + local function global_allowed_3f(name) + return (not allowed_globals or utils["member?"](name, allowed_globals)) end - local safe_require = nil - local function safe_compiler_env(strict_3f) - local _1_ - if strict_3f then - _1_ = nil + local function unique_mangling(original, mangling, scope, append) + if (scope.unmanglings[mangling] and not scope.gensyms[mangling]) then + return unique_mangling(original, (original .. append), scope, (append + 1)) else - _1_ = compiler_env_warn + return mangling end - return setmetatable({assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = pairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, require = safe_require, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, xpcall = xpcall}, {__index = _1_}) end - local function combined_mt_pairs(env) - local combined = {} - local _1_ = getmetatable(env) - local __index = _1_["__index"] - if ("table" == type(__index)) then - for k, v in pairs(__index) do - combined[k] = v - end + local function local_mangling(str, scope, ast, _3ftemp_manglings) + assert_compile(not utils["multi-sym?"](str), ("unexpected multi symbol " .. str), ast) + local raw + if ((utils["lua-keywords"])[str] or str:match("^%d")) then + raw = ("_" .. str) + else + raw = str end - for k, v in next, env, nil do - combined[k] = v + local mangling + local function _219_(_241) + return string.format("_%02x", _241:byte()) end - return next, combined, nil - end - local function make_compiler_env(ast, scope, parent, strict_3f) - local provided = nil + mangling = string.gsub(string.gsub(raw, "-", "_"), "[^%w_]", _219_) + local unique = unique_mangling(mangling, mangling, scope, 0) + do end (scope.unmanglings)[unique] = str do - local _1_0 = utils.root.options - if ((type(_1_0) == "table") and (_1_0["compiler-env"] == "strict")) then - provided = safe_compiler_env(true) - elseif ((type(_1_0) == "table") and (nil ~= _1_0.compilerEnv)) then - local compilerEnv = _1_0.compilerEnv - provided = compilerEnv - elseif ((type(_1_0) == "table") and (nil ~= _1_0["compiler-env"])) then - local compiler_env = _1_0["compiler-env"] - provided = compiler_env - else - local _ = _1_0 - provided = safe_compiler_env(strict_3f) - end + local manglings = (_3ftemp_manglings or scope.manglings) + do end (manglings)[str] = unique end - local env = nil - local function _2_() - return compiler.scopes.macro - end - local function _3_(symbol) - compiler.assert(compiler.scopes.macro, "must call from macro", ast) - return compiler.scopes.macro.manglings[tostring(symbol)] - end - local function _4_(base) - return utils.sym(compiler.gensym((compiler.scopes.macro or scope), base)) - end - local function _5_(form) - compiler.assert(compiler.scopes.macro, "must call from macro", ast) - return compiler.macroexpand(form, compiler.scopes.macro) - end - env = {["assert-compile"] = compiler.assert, ["get-scope"] = _2_, ["in-scope?"] = _3_, ["list?"] = utils["list?"], ["macro-loaded"] = macro_loaded, ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), gensym = _4_, list = utils.list, macroexpand = _5_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, view = view} - env._G = env - return setmetatable(env, {__index = provided, __newindex = provided, __pairs = combined_mt_pairs}) - end - local cfg = string.gmatch(package.config, "([^\n]+)") - local dirsep, pathsep, pathmark = (cfg() or "/"), (cfg() or ";"), (cfg() or "?") - local pkg_config = {dirsep = dirsep, pathmark = pathmark, pathsep = pathsep} - local function escapepat(str) - return string.gsub(str, "[^%w]", "%%%1") + return unique end - local function search_module(modulename, pathstring) - local pathsepesc = escapepat(pkg_config.pathsep) - local pattern = ("([^%s]*)%s"):format(pathsepesc, pathsepesc) - local no_dot_module = modulename:gsub("%.", pkg_config.dirsep) - local fullpath = ((pathstring or utils["fennel-module"].path) .. pkg_config.pathsep) - local function try_path(path) - local filename = path:gsub(escapepat(pkg_config.pathmark), no_dot_module) - local filename2 = path:gsub(escapepat(pkg_config.pathmark), modulename) - local _1_0 = (io.open(filename) or io.open(filename2)) - if (nil ~= _1_0) then - local file = _1_0 - file:close() - return filename - end - end - local function find_in_path(start) - local _1_0 = fullpath:match(pattern, start) - if (nil ~= _1_0) then - local path = _1_0 - return (try_path(path) or find_in_path((start + #path + 1))) - end + local function apply_manglings(scope, new_manglings, ast) + for raw, mangled in pairs(new_manglings) do + assert_compile(not scope.refedglobals[mangled], ("use of global " .. raw .. " is aliased by a local"), ast) + do end (scope.manglings)[raw] = mangled end - return find_in_path(1) + return nil end - local function make_searcher(options) - local function _1_(module_name) - local opts = utils.copy(utils.root.options) - for k, v in pairs((options or {})) do - opts[k] = v - end - opts["module-name"] = module_name - local _2_0 = search_module(module_name) - if (nil ~= _2_0) then - local filename = _2_0 - local function _3_(...) - return utils["fennel-module"].dofile(filename, opts, ...) + local function combine_parts(parts, scope) + local ret = (scope.manglings[parts[1]] or global_mangling(parts[1])) + for i = 2, #parts do + if utils["valid-lua-identifier?"](parts[i]) then + if (parts["multi-sym-method-call"] and (i == #parts)) then + ret = (ret .. ":" .. parts[i]) + else + ret = (ret .. "." .. parts[i]) end - return _3_, filename + else + ret = (ret .. "[" .. serialize_string(parts[i]) .. "]") end end - return _1_ + return ret end - local function macro_globals(env, globals) - local allowed = current_global_names(env) - for _, k in pairs((globals or {})) do - table.insert(allowed, k) - end - return allowed + local function next_append() + utils.root.scope["gensym-append"] = ((utils.root.scope["gensym-append"] or 0) + 1) + return ("_" .. utils.root.scope["gensym-append"] .. "_") end - local function fennel_macro_searcher(module_name) - local _1_0 = search_module(module_name, utils["fennel-module"]["macro-path"]) - if (nil ~= _1_0) then - local filename = _1_0 - local function _2_(...) - return utils["fennel-module"].dofile(filename, {env = "_COMPILER"}, ...) - end - return _2_, filename + local function gensym(scope, _3fbase, _3fsuffix) + local mangling = ((_3fbase or "") .. next_append() .. (_3fsuffix or "")) + while scope.unmanglings[mangling] do + mangling = ((_3fbase or "") .. next_append() .. (_3fsuffix or "")) end + scope.unmanglings[mangling] = (_3fbase or true) + do end (scope.gensyms)[mangling] = true + return mangling end - local function lua_macro_searcher(module_name) - local _1_0 = search_module(module_name, package.path) - if (nil ~= _1_0) then - local filename = _1_0 - local code = nil - do - local f = io.open(filename) - local function close_handlers_0_(ok_0_, ...) - f:close() - if ok_0_ then - return ... - else - return error(..., 0) - end - end - local function _2_() - return assert(f:read("*a")) - end - code = close_handlers_0_(xpcall(_2_, (package.loaded.fennel or debug).traceback)) + local function autogensym(base, scope) + local _222_ = utils["multi-sym?"](base) + if (nil ~= _222_) then + local parts = _222_ + parts[1] = autogensym(parts[1], scope) + return table.concat(parts, ((parts["multi-sym-method-call"] and ":") or ".")) + elseif true then + local _ = _222_ + local function _223_() + local mangling = gensym(scope, base:sub(1, ( - 2)), "auto") + do end (scope.autogensyms)[base] = mangling + return mangling end - local chunk = load_code(code, make_compiler_env(), filename) - return chunk, filename + return (scope.autogensyms[base] or _223_()) + else + return nil end end - local macro_searchers = {lua_macro_searcher, fennel_macro_searcher} - local function search_macro_module(modname, n) - local _1_0 = macro_searchers[n] - if (nil ~= _1_0) then - local f = _1_0 - local _2_0, _3_0 = f(modname) - if ((nil ~= _2_0) and true) then - local loader = _2_0 - local _3ffilename = _3_0 - return loader, _3ffilename - else - local _ = _2_0 - return search_macro_module(modname, (n + 1)) - end - end + local function check_binding_valid(symbol, scope, ast) + local name = tostring(symbol) + assert_compile(not name:find("&"), "illegal character &") + assert_compile(not (scope.specials[name] or scope.macros[name]), ("local %s was overshadowed by a special form or macro"):format(name), ast) + return assert_compile(not utils["quoted?"](symbol), string.format("macro tried to bind %s without gensym", name), symbol) end - local function metadata_only_fennel(modname) - if ((modname == "fennel.macros") or (package and package.loaded and ("table" == type(package.loaded[modname])) and (package.loaded[modname].metadata == compiler.metadata))) then - return {metadata = compiler.metadata} - end + local function declare_local(symbol, meta, scope, ast, _3ftemp_manglings) + check_binding_valid(symbol, scope, ast) + local name = tostring(symbol) + assert_compile(not utils["multi-sym?"](name), ("unexpected multi symbol " .. name), ast) + do end (scope.symmeta)[name] = meta + return local_mangling(name, scope, ast, _3ftemp_manglings) end - local function _1_(modname) - local function _2_() - local loader, filename = search_macro_module(modname, 1) - compiler.assert(loader, (modname .. " module not found.")) - macro_loaded[modname] = loader(modname, filename) - return macro_loaded[modname] + local function hashfn_arg_name(name, multi_sym_parts, scope) + if not scope.hashfn then + return nil + elseif (name == "$") then + return "$1" + elseif multi_sym_parts then + if (multi_sym_parts and (multi_sym_parts[1] == "$")) then + multi_sym_parts[1] = "$1" + else + end + return table.concat(multi_sym_parts, ".") + else + return nil end - return (macro_loaded[modname] or metadata_only_fennel(modname) or _2_()) end - safe_require = _1_ - local function add_macros(macros_2a, ast, scope) - compiler.assert(utils["table?"](macros_2a), "expected macros to be table", ast) - for k, v in pairs(macros_2a) do - compiler.assert((type(v) == "function"), "expected each macro to be function", ast) - scope.macros[k] = v + local function symbol_to_expression(symbol, scope, _3freference_3f) + utils.hook("symbol-to-expression", symbol, scope, _3freference_3f) + local name = symbol[1] + local multi_sym_parts = utils["multi-sym?"](name) + local name0 = (hashfn_arg_name(name, multi_sym_parts, scope) or name) + local parts = (multi_sym_parts or {name0}) + local etype = (((#parts > 1) and "expression") or "sym") + local local_3f = scope.manglings[parts[1]] + if (local_3f and scope.symmeta[parts[1]]) then + scope.symmeta[parts[1]]["used"] = true + else end - return nil - end - local function resolve_module_name(ast, scope, parent, opts) - local filename = (ast.filename or ast[2].filename) - local module_name = utils.root.options["module-name"] - local modexpr = compiler.compile(ast[2], opts) - local modname_chunk = load_code(modexpr) - local _2_0, _3_0 = pcall(modname_chunk, module_name, filename) - if ((_2_0 == true) and (nil ~= _3_0)) then - local modname = _3_0 - return utils.expr(string.format("%q", modname), "literal") + assert_compile(not scope.macros[parts[1]], "tried to reference a macro at runtime", symbol) + assert_compile((not _3freference_3f or local_3f or ("_ENV" == parts[1]) or global_allowed_3f(parts[1])), ("unknown identifier in strict mode: " .. tostring(parts[1])), symbol) + if (allowed_globals and not local_3f and scope.parent) then + scope.parent.refedglobals[parts[1]] = true else - local _ = _2_0 - return compiler.compile1(ast[2], scope, parent, {nval = 1})[1] end + return utils.expr(combine_parts(parts, scope), etype) end - SPECIALS["require-macros"] = function(ast, scope, parent, real_ast) - compiler.assert((#ast == 2), "Expected one module name argument", (real_ast or ast)) - local modexpr = resolve_module_name(ast, scope, parent, {}) - local _ = compiler.assert((modexpr.type == "literal"), "module name must compile to string", (real_ast or ast)) - local modname = load_code(("return " .. modexpr[1]))() - if not macro_loaded[modname] then - local env = make_compiler_env(ast, scope, parent) - local loader, filename = search_macro_module(modname, 1) - compiler.assert(loader, (modname .. " module not found."), ast) - macro_loaded[modname] = loader(modname, filename) + local function emit(chunk, out, _3fast) + if (type(out) == "table") then + return table.insert(chunk, out) + else + return table.insert(chunk, {ast = _3fast, leaf = out}) end - return add_macros(macro_loaded[modname], ast, scope, parent) end - doc_special("require-macros", {"macro-module-name"}, "Load given module and use its contents as macro definitions in current scope.\nMacro module should return a table of macro functions with string keys.\nConsider using import-macros instead as it is more flexible.") - local function emit_included_fennel(src, path, opts, sub_chunk) - local subscope = compiler["make-scope"](utils.root.scope.parent) - local forms = {} - if utils.root.options.requireAsInclude then - subscope.specials.require = compiler["require-include"] - end - for _, val in parser.parser(parser["string-stream"](src), path) do - table.insert(forms, val) - end - for i = 1, #forms do - local subopts = nil - if (i == #forms) then - subopts = {tail = true} - else - subopts = {nval = 0} + local function peephole(chunk) + if chunk.leaf then + return chunk + elseif ((#chunk >= 3) and ((chunk[(#chunk - 2)]).leaf == "do") and not (chunk[(#chunk - 1)]).leaf and (chunk[#chunk].leaf == "end")) then + local kid = peephole(chunk[(#chunk - 1)]) + local new_chunk = {ast = chunk.ast} + for i = 1, (#chunk - 3) do + table.insert(new_chunk, peephole(chunk[i])) end - utils["propagate-options"](opts, subopts) - compiler.compile1(forms[i], subscope, sub_chunk, subopts) + for i = 1, #kid do + table.insert(new_chunk, kid[i]) + end + return new_chunk + else + return utils.map(chunk, peephole) end - return nil end - local function include_path(ast, opts, path, mod, fennel_3f) - utils.root.scope.includes[mod] = "fnl/loading" - local src = nil - do - local f = assert(io.open(path)) - local function close_handlers_0_(ok_0_, ...) - f:close() - if ok_0_ then - return ... - else - return error(..., 0) + local function flatten_chunk_correlated(main_chunk, options) + local function flatten(chunk, out, last_line, file) + local last_line0 = last_line + if chunk.leaf then + out[last_line0] = ((out[last_line0] or "") .. " " .. chunk.leaf) + else + for _, subchunk in ipairs(chunk) do + if (subchunk.leaf or (#subchunk > 0)) then + local source = utils["ast-source"](subchunk.ast) + if (file == source.filename) then + last_line0 = math.max(last_line0, (source.line or 0)) + else + end + last_line0 = flatten(subchunk, out, last_line0, file) + else + end end end - local function _2_() - return f:read("*all"):gsub("[\13\n]*$", "") - end - src = close_handlers_0_(xpcall(_2_, (package.loaded.fennel or debug).traceback)) - end - local ret = utils.expr(("require(\"" .. mod .. "\")"), "statement") - local target = ("package.preload[%q]"):format(mod) - local preload_str = (target .. " = " .. target .. " or function(...)") - local temp_chunk, sub_chunk = {}, {} - compiler.emit(temp_chunk, preload_str, ast) - compiler.emit(temp_chunk, sub_chunk) - compiler.emit(temp_chunk, "end", ast) - for i, v in ipairs(temp_chunk) do - table.insert(utils.root.chunk, i, v) - end - if fennel_3f then - emit_included_fennel(src, path, opts, sub_chunk) - else - compiler.emit(sub_chunk, src, ast) + return last_line0 end - utils.root.scope.includes[mod] = ret - return ret - end - local function include_circular_fallback(mod, modexpr, fallback, ast) - if (utils.root.scope.includes[mod] == "fnl/loading") then - compiler.assert(fallback, "circular include detected", ast) - return fallback(modexpr) + local out = {} + local last = flatten(main_chunk, out, 1, options.filename) + for i = 1, last do + if (out[i] == nil) then + out[i] = "" + else + end end + return table.concat(out, "\n") end - SPECIALS.include = function(ast, scope, parent, opts) - compiler.assert((#ast == 2), "expected one argument", ast) - local modexpr = resolve_module_name(ast, scope, parent, opts) - if ((modexpr.type ~= "literal") or ((modexpr[1]):byte() ~= 34)) then - if opts.fallback then - return opts.fallback(modexpr) + local function flatten_chunk(sm, chunk, tab, depth) + if chunk.leaf then + local code = chunk.leaf + local info = chunk.ast + if sm then + table.insert(sm, {(info and info.filename), (info and info.line)}) else - return compiler.assert(false, "module name must be string literal", ast) end + return code else - local mod = load_code(("return " .. modexpr[1]))() - local oldmod = utils.root.options["module-name"] - local _ = nil - utils.root.options["module-name"] = mod - _ = nil - local res = nil - local function _3_() - local _2_0 = search_module(mod) - if (nil ~= _2_0) then - local fennel_path = _2_0 - return include_path(ast, opts, fennel_path, mod, true) + local tab0 + do + local _236_ = tab + if (_236_ == true) then + tab0 = " " + elseif (_236_ == false) then + tab0 = "" + elseif (_236_ == tab) then + tab0 = tab + elseif (_236_ == nil) then + tab0 = "" else - local _0 = _2_0 - local lua_path = search_module(mod, package.path) - if lua_path then - return include_path(ast, opts, lua_path, mod, false) - elseif opts.fallback then - return opts.fallback(modexpr) + tab0 = nil + end + end + local function parter(c) + if (c.leaf or (#c > 0)) then + local sub = flatten_chunk(sm, c, tab0, (depth + 1)) + if (depth > 0) then + return (tab0 .. sub:gsub("\n", ("\n" .. tab0))) else - return compiler.assert(false, ("module not found " .. mod), ast) + return sub end + else + return nil end end - res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and utils.expr("nil --[[SKIPPED INCLUDE]]--", "literal")) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _3_()) - utils.root.options["module-name"] = oldmod - return res + return table.concat(utils.map(chunk, parter), "\n") end end - doc_special("include", {"module-name-literal"}, "Like require but load the target module during compilation and embed it in the\nLua output. The module must be a string literal and resolvable at compile time.") - local function eval_compiler_2a(ast, scope, parent) - local env = make_compiler_env(ast, scope, parent) - local opts = utils.copy(utils.root.options) - opts.scope = compiler["make-scope"](compiler.scopes.compiler) - opts.allowedGlobals = macro_globals(env, current_global_names()) - return load_code(compiler.compile(ast, opts), wrap_env(env))(opts["module-name"], ast.filename) - end - SPECIALS.macros = function(ast, scope, parent) - compiler.assert((#ast == 2), "Expected one table argument", ast) - return add_macros(eval_compiler_2a(ast[2], scope, parent), ast, scope, parent) - end - doc_special("macros", {"{:macro-name-1 (fn [...] ...) ... :macro-name-N macro-body-N}"}, "Define all functions in the given table as macros local to the current scope.") - SPECIALS["eval-compiler"] = function(ast, scope, parent) - local old_first = ast[1] - ast[1] = utils.sym("do") - local val = eval_compiler_2a(ast, scope, parent) - ast[1] = old_first - return val - end - doc_special("eval-compiler", {"..."}, "Evaluate the body at compile-time. Use the macro system instead if possible.", true) - return {["current-global-names"] = current_global_names, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} -end -package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or function(...) - local utils = require("fennel.utils") - local parser = require("fennel.parser") - local friend = require("fennel.friend") - local unpack = (table.unpack or _G.unpack) - local scopes = {} - local function make_scope(parent) - local parent0 = (parent or scopes.global) - local _0_ - if parent0 then - _0_ = ((parent0.depth or 0) + 1) + local sourcemap = {} + local function make_short_src(source) + local source0 = source:gsub("\n", " ") + if (#source0 <= 49) then + return ("[fennel \"" .. source0 .. "\"]") else - _0_ = 0 + return ("[fennel \"" .. source0:sub(1, 46) .. "...\"]") end - return {autogensyms = setmetatable({}, {__index = (parent0 and parent0.autogensyms)}), depth = _0_, gensyms = setmetatable({}, {__index = (parent0 and parent0.gensyms)}), hashfn = (parent0 and parent0.hashfn), includes = setmetatable({}, {__index = (parent0 and parent0.includes)}), macros = setmetatable({}, {__index = (parent0 and parent0.macros)}), manglings = setmetatable({}, {__index = (parent0 and parent0.manglings)}), parent = parent0, refedglobals = setmetatable({}, {__index = (parent0 and parent0.refedglobals)}), specials = setmetatable({}, {__index = (parent0 and parent0.specials)}), symmeta = setmetatable({}, {__index = (parent0 and parent0.symmeta)}), unmanglings = setmetatable({}, {__index = (parent0 and parent0.unmanglings)}), vararg = (parent0 and parent0.vararg)} end - local function assert_msg(ast, msg) - local ast_tbl = nil - if ("table" == type(ast)) then - ast_tbl = ast - else - ast_tbl = {} - end - local m = getmetatable(ast) - local filename = ((m and m.filename) or ast_tbl.filename or "unknown") - local line = ((m and m.line) or ast_tbl.line or "?") - local target = tostring((utils["sym?"](ast_tbl[1]) or ast_tbl[1] or "()")) - return string.format("%s:%s: Compile error in '%s': %s", filename, line, target, msg) - end - local function assert_compile(condition, msg, ast) - if not condition then - local _0_ = (utils.root.options or {}) - local source = _0_["source"] - local unfriendly = _0_["unfriendly"] - utils.root.reset() - if (unfriendly or not friend or not _G.io or not _G.io.read) then - error(assert_msg(ast, msg), 0) - else - friend["assert-compile"](condition, msg, ast, source) - end - end - return condition - end - scopes.global = make_scope() - scopes.global.vararg = true - scopes.compiler = make_scope(scopes.global) - scopes.macro = scopes.global - local serialize_subst = {["\11"] = "\\v", ["\12"] = "\\f", ["\7"] = "\\a", ["\8"] = "\\b", ["\9"] = "\\t", ["\n"] = "n"} - local function serialize_string(str) - local function _0_(_241) - return ("\\" .. _241:byte()) - end - return string.gsub(string.gsub(string.format("%q", str), ".", serialize_subst), "[\128-\255]", _0_) - end - local function global_mangling(str) - if utils["valid-lua-identifier?"](str) then - return str - else - local function _0_(_241) - return string.format("_%02x", _241:byte()) - end - return ("__fnl_global__" .. str:gsub("[^%w]", _0_)) - end - end - local function global_unmangling(identifier) - local _0_0 = string.match(identifier, "^__fnl_global__(.*)$") - if (nil ~= _0_0) then - local rest = _0_0 - local _1_0 = nil - local function _2_(_241) - return string.char(tonumber(_241:sub(2), 16)) - end - _1_0 = string.gsub(rest, "_[%da-f][%da-f]", _2_) - return _1_0 - else - local _ = _0_0 - return identifier - end - end - local allowed_globals = nil - local function global_allowed_3f(name) - return (not allowed_globals or utils["member?"](name, allowed_globals)) - end - local function unique_mangling(original, mangling, scope, append) - if (scope.unmanglings[mangling] and not scope.gensyms[mangling]) then - return unique_mangling(original, (original .. append), scope, (append + 1)) - else - return mangling - end - end - local function local_mangling(str, scope, ast, temp_manglings) - assert_compile(not utils["multi-sym?"](str), ("unexpected multi symbol " .. str), ast) - local raw = nil - if (utils["lua-keywords"][str] or str:match("^%d")) then - raw = ("_" .. str) - else - raw = str - end - local mangling = nil - local function _1_(_241) - return string.format("_%02x", _241:byte()) - end - mangling = string.gsub(string.gsub(raw, "-", "_"), "[^%w_]", _1_) - local unique = unique_mangling(mangling, mangling, scope, 0) - scope.unmanglings[unique] = str - do - local manglings = (temp_manglings or scope.manglings) - manglings[str] = unique - end - return unique - end - local function apply_manglings(scope, new_manglings, ast) - for raw, mangled in pairs(new_manglings) do - assert_compile(not scope.refedglobals[mangled], ("use of global " .. raw .. " is aliased by a local"), ast) - scope.manglings[raw] = mangled - end - return nil - end - local function combine_parts(parts, scope) - local ret = (scope.manglings[parts[1]] or global_mangling(parts[1])) - for i = 2, #parts do - if utils["valid-lua-identifier?"](parts[i]) then - if (parts["multi-sym-method-call"] and (i == #parts)) then - ret = (ret .. ":" .. parts[i]) - else - ret = (ret .. "." .. parts[i]) - end - else - ret = (ret .. "[" .. serialize_string(parts[i]) .. "]") - end - end - return ret - end - local function next_append() - utils.root.scope["gensym-append"] = ((utils.root.scope["gensym-append"] or 0) + 1) - return ("_" .. utils.root.scope["gensym-append"] .. "_") - end - local function gensym(scope, base, _3fsuffix) - local mangling = ((base or "") .. next_append() .. (_3fsuffix or "")) - while scope.unmanglings[mangling] do - mangling = ((base or "") .. next_append() .. (_3fsuffix or "")) - end - scope.unmanglings[mangling] = (base or true) - scope.gensyms[mangling] = true - return mangling - end - local function autogensym(base, scope) - local _0_0 = utils["multi-sym?"](base) - if (nil ~= _0_0) then - local parts = _0_0 - parts[1] = autogensym(parts[1], scope) - return table.concat(parts, ((parts["multi-sym-method-call"] and ":") or ".")) - else - local _ = _0_0 - local function _1_() - local mangling = gensym(scope, base:sub(1, ( - 2)), "auto") - scope.autogensyms[base] = mangling - return mangling - end - return (scope.autogensyms[base] or _1_()) - end - end - local already_warned = {} - local function check_binding_valid(symbol, scope, ast) - local name = utils.deref(symbol) - if (io and io.stderr and name:find("&") and not already_warned[symbol]) then - already_warned[symbol] = true - do end (io.stderr):write(("-- Warning: & will not be allowed in identifier names in " .. "future versions: " .. (symbol.filename or "unknown") .. ":" .. (symbol.line or "?") .. "\n")) - end - assert_compile(not (scope.specials[name] or scope.macros[name]), ("local %s was overshadowed by a special form or macro"):format(name), ast) - return assert_compile(not utils["quoted?"](symbol), string.format("macro tried to bind %s without gensym", name), symbol) - end - local function declare_local(symbol, meta, scope, ast, temp_manglings) - check_binding_valid(symbol, scope, ast) - local name = utils.deref(symbol) - assert_compile(not utils["multi-sym?"](name), ("unexpected multi symbol " .. name), ast) - scope.symmeta[name] = meta - return local_mangling(name, scope, ast, temp_manglings) - end - local function hashfn_arg_name(name, multi_sym_parts, scope) - if not scope.hashfn then - return nil - elseif (name == "$") then - return "$1" - elseif multi_sym_parts then - if (multi_sym_parts and (multi_sym_parts[1] == "$")) then - multi_sym_parts[1] = "$1" - end - return table.concat(multi_sym_parts, ".") - end - end - local function symbol_to_expression(symbol, scope, reference_3f) - utils.hook("symbol-to-expression", symbol, scope, reference_3f) - local name = symbol[1] - local multi_sym_parts = utils["multi-sym?"](name) - local name0 = (hashfn_arg_name(name, multi_sym_parts, scope) or name) - local parts = (multi_sym_parts or {name0}) - local etype = (((#parts > 1) and "expression") or "sym") - local local_3f = scope.manglings[parts[1]] - if (local_3f and scope.symmeta[parts[1]]) then - scope.symmeta[parts[1]]["used"] = true - end - assert_compile(not scope.macros[parts[1]], "tried to reference a macro at runtime", symbol) - assert_compile((not reference_3f or local_3f or ("_ENV" == parts[1]) or global_allowed_3f(parts[1])), ("unknown global in strict mode: " .. tostring(parts[1])), symbol) - if (allowed_globals and not local_3f) then - utils.root.scope.refedglobals[parts[1]] = true - end - return utils.expr(combine_parts(parts, scope), etype) - end - local function emit(chunk, out, ast) - if (type(out) == "table") then - return table.insert(chunk, out) - else - return table.insert(chunk, {ast = ast, leaf = out}) - end - end - local function peephole(chunk) - if chunk.leaf then - return chunk - elseif ((#chunk >= 3) and (chunk[(#chunk - 2)].leaf == "do") and not chunk[(#chunk - 1)].leaf and (chunk[#chunk].leaf == "end")) then - local kid = peephole(chunk[(#chunk - 1)]) - local new_chunk = {ast = chunk.ast} - for i = 1, (#chunk - 3) do - table.insert(new_chunk, peephole(chunk[i])) - end - for i = 1, #kid do - table.insert(new_chunk, kid[i]) - end - return new_chunk - else - return utils.map(chunk, peephole) - end - end - local function ast_source(ast) - local m = getmetatable(ast) - return ((m and m.line and m) or (("table" == type(ast)) and ast) or {}) - end - local function flatten_chunk_correlated(main_chunk, options) - local function flatten(chunk, out, last_line, file) - local last_line0 = last_line - if chunk.leaf then - out[last_line0] = ((out[last_line0] or "") .. " " .. chunk.leaf) - else - for _, subchunk in ipairs(chunk) do - if (subchunk.leaf or (#subchunk > 0)) then - local source = ast_source(subchunk.ast) - if (file == source.filename) then - last_line0 = math.max(last_line0, (source.line or 0)) - end - last_line0 = flatten(subchunk, out, last_line0, file) - end - end - end - return last_line0 - end - local out = {} - local last = flatten(main_chunk, out, 1, options.filename) - for i = 1, last do - if (out[i] == nil) then - out[i] = "" - end - end - return table.concat(out, "\n") - end - local function flatten_chunk(sm, chunk, tab, depth) - if chunk.leaf then - local code = chunk.leaf - local info = chunk.ast - if sm then - table.insert(sm, {(info and info.filename), (info and info.line)}) - end - return code - else - local tab0 = nil - do - local _0_0 = tab - if (_0_0 == true) then - tab0 = " " - elseif (_0_0 == false) then - tab0 = "" - elseif (_0_0 == tab) then - tab0 = tab - elseif (_0_0 == nil) then - tab0 = "" - else - tab0 = nil - end - end - local function parter(c) - if (c.leaf or (#c > 0)) then - local sub = flatten_chunk(sm, c, tab0, (depth + 1)) - if (depth > 0) then - return (tab0 .. sub:gsub("\n", ("\n" .. tab0))) - else - return sub - end - end - end - return table.concat(utils.map(chunk, parter), "\n") - end - end - local fennel_sourcemap = {} - local function make_short_src(source) - local source0 = source:gsub("\n", " ") - if (#source0 <= 49) then - return ("[fennel \"" .. source0 .. "\"]") - else - return ("[fennel \"" .. source0:sub(1, 46) .. "...\"]") - end - end - local function flatten(chunk, options) - local chunk0 = peephole(chunk) - if options.correlate then - return flatten_chunk_correlated(chunk0, options), {} + local function flatten(chunk, options) + local chunk0 = peephole(chunk) + if options.correlate then + return flatten_chunk_correlated(chunk0, options), {} else local sm = {} local ret = flatten_chunk(sm, chunk0, options.indent, 0) @@ -2491,27 +2292,31 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else sm.key = ret end - fennel_sourcemap[sm.key] = sm + sourcemap[sm.key] = sm + else end return ret, sm end end local function make_metadata() - local function _0_(self, tgt, key) + local function _245_(self, tgt, key) if self[tgt] then return self[tgt][key] + else + return nil end end - local function _1_(self, tgt, key, value) + local function _247_(self, tgt, key, value) self[tgt] = (self[tgt] or {}) - self[tgt][key] = value + do end (self[tgt])[key] = value return tgt end - local function _2_(self, tgt, ...) + local function _248_(self, tgt, ...) local kv_len = select("#", ...) local kvs = {...} if ((kv_len % 2) ~= 0) then error("metadata:setall() expected even number of k/v pairs") + else end self[tgt] = (self[tgt] or {}) for i = 1, kv_len, 2 do @@ -2519,10 +2324,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end return tgt end - return setmetatable({}, {__index = {get = _0_, set = _1_, setall = _2_}, __mode = "k"}) + return setmetatable({}, {__index = {get = _245_, set = _247_, setall = _248_}, __mode = "k"}) end local function exprs1(exprs) - return table.concat(utils.map(exprs, 1), ", ") + return table.concat(utils.map(exprs, tostring), ", ") end local function keep_side_effects(exprs, chunk, start, ast) local start0 = (start or 1) @@ -2532,13 +2337,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct emit(chunk, string.format("do local _ = %s end", tostring(se)), ast) elseif (se.type == "statement") then local code = tostring(se) - local disambiguated = nil + local disambiguated if (code:byte() == 40) then disambiguated = ("do end " .. code) else disambiguated = code end emit(chunk, disambiguated, ast) + else end end return nil @@ -2558,28 +2364,32 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct exprs[i] = utils.expr("nil", "literal") end end + else end + else end if opts.tail then emit(parent, string.format("return %s", exprs1(exprs)), ast) + else end if opts.target then local result = exprs1(exprs) - local function _2_() + local function _256_() if (result == "") then return "nil" else return result end end - emit(parent, string.format("%s = %s", opts.target, _2_()), ast) + emit(parent, string.format("%s = %s", opts.target, _256_()), ast) + else end if (opts.tail or opts.target) then return {returned = true} else - local _3_0 = exprs - _3_0["returned"] = true - return _3_0 + local _258_ = exprs + _258_["returned"] = true + return _258_ end end local function find_macro(ast, scope, multi_sym_parts) @@ -2590,7 +2400,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return t end end - local macro_2a = (utils["sym?"](ast[1]) and scope.macros[utils.deref(ast[1])]) + local macro_2a = (utils["sym?"](ast[1]) and scope.macros[tostring(ast[1])]) if (not macro_2a and multi_sym_parts) then local nested_macro = find_in_table(scope.macros, 1) assert_compile((not scope.macros[multi_sym_parts[1]] or (type(nested_macro) == "function")), "macro not found in imported macro module", ast) @@ -2599,47 +2409,71 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return macro_2a end end - local function macroexpand_2a(ast, scope, once) - local _0_0 = nil + local function propagate_trace_info(_262_, _index, node) + local _arg_263_ = _262_ + local filename = _arg_263_["filename"] + local line = _arg_263_["line"] + local bytestart = _arg_263_["bytestart"] + local byteend = _arg_263_["byteend"] + if (("table" == type(node)) and (filename ~= node.filename)) then + local src = utils["ast-source"](node) + src.filename, src.line = filename, line + src.bytestart, src.byteend = bytestart, byteend + else + end + return ("table" == type(node)) + end + local function macroexpand_2a(ast, scope, _3fonce) + local _265_ if utils["list?"](ast) then - _0_0 = find_macro(ast, scope, utils["multi-sym?"](ast[1])) + _265_ = find_macro(ast, scope, utils["multi-sym?"](ast[1])) else - _0_0 = nil + _265_ = nil end - if (_0_0 == false) then + if (_265_ == false) then return ast - elseif (nil ~= _0_0) then - local macro_2a = _0_0 + elseif (nil ~= _265_) then + local macro_2a = _265_ local old_scope = scopes.macro - local _ = nil + local _ scopes.macro = scope _ = nil local ok, transformed = nil, nil - local function _2_() + local function _267_() return macro_2a(unpack(ast, 2)) end - ok, transformed = xpcall(_2_, debug.traceback) + ok, transformed = xpcall(_267_, debug.traceback) + local function _269_() + local _268_ = ast + local function _270_(...) + return propagate_trace_info(_268_, ...) + end + return _270_ + end + utils["walk-tree"](transformed, _269_()) scopes.macro = old_scope assert_compile(ok, transformed, ast) - if (once or not transformed) then + if (_3fonce or not transformed) then return transformed else return macroexpand_2a(transformed, scope) end - else - local _ = _0_0 + elseif true then + local _ = _265_ return ast + else + return nil end end local function compile_special(ast, scope, parent, opts, special) local exprs = (special(ast, scope, parent, opts) or utils.expr("nil", "literal")) - local exprs0 = nil - if (type(exprs) == "string") then + local exprs0 + if ("table" ~= type(exprs)) then exprs0 = utils.expr(exprs, "expression") else exprs0 = exprs end - local exprs2 = nil + local exprs2 if utils["expr?"](exprs0) then exprs2 = {exprs0} else @@ -2655,17 +2489,17 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function compile_function_call(ast, scope, parent, opts, compile1, len) local fargs = {} - local fcallee = compile1(ast[1], scope, parent, {nval = 1})[1] + local fcallee = (compile1(ast[1], scope, parent, {nval = 1}))[1] assert_compile((("string" == type(ast[1])) or (fcallee.type ~= "literal")), ("cannot call literal value " .. tostring(ast[1])), ast) for i = 2, len do - local subexprs = nil - local _0_ + local subexprs + local _276_ if (i ~= len) then - _0_ = 1 + _276_ = 1 else - _0_ = nil + _276_ = nil end - subexprs = compile1(ast[i], scope, parent, {nval = _0_}) + subexprs = compile1(ast[i], scope, parent, {nval = _276_}) table.insert(fargs, (subexprs[1] or utils.expr("nil", "literal"))) if (i == len) then for j = 2, #subexprs do @@ -2675,7 +2509,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct keep_side_effects(subexprs, parent, 2, ast[i]) end end - local pat = nil + local pat if ("string" == type(ast[1])) then pat = "(%s)(%s)" else @@ -2689,7 +2523,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local len = #ast local first = ast[1] local multi_sym_parts = utils["multi-sym?"](first) - local special = (utils["sym?"](first) and scope.specials[utils.deref(first)]) + local special = (utils["sym?"](first) and scope.specials[tostring(first)]) assert_compile((len > 0), "expected a function, macro, or special to call", ast) if special then return compile_special(ast, scope, parent, opts, special) @@ -2709,7 +2543,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function compile_sym(ast, scope, parent, opts) local multi_sym_parts = utils["multi-sym?"](ast) assert_compile(not (multi_sym_parts and multi_sym_parts["multi-sym-method-call"]), "multisym method calls may only be in call position", ast) - local e = nil + local e if (ast[1] == "nil") then e = utils.expr("nil", "literal") else @@ -2718,94 +2552,101 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return handle_compile_opts({e}, parent, opts, ast) end local function serialize_number(n) - local _0_0 = string.gsub(tostring(n), ",", ".") - return _0_0 + local _282_ = string.gsub(tostring(n), ",", ".") + return _282_ end local function compile_scalar(ast, _scope, parent, opts) - local serialize = nil + local serialize do - local _0_0 = type(ast) - if (_0_0 == "nil") then + local _283_ = type(ast) + if (_283_ == "nil") then serialize = tostring - elseif (_0_0 == "boolean") then + elseif (_283_ == "boolean") then serialize = tostring - elseif (_0_0 == "string") then + elseif (_283_ == "string") then serialize = serialize_string - elseif (_0_0 == "number") then + elseif (_283_ == "number") then serialize = serialize_number else - serialize = nil + serialize = nil end end return handle_compile_opts({utils.expr(serialize(ast), "literal")}, parent, opts) end local function compile_table(ast, scope, parent, opts, compile1) local buffer = {} - for i = 1, #ast do - local nval = ((i ~= #ast) and 1) - table.insert(buffer, exprs1(compile1(ast[i], scope, parent, {nval = nval}))) - end local function write_other_values(k) if ((type(k) ~= "number") or (math.floor(k) ~= k) or (k < 1) or (k > #ast)) then if ((type(k) == "string") and utils["valid-lua-identifier?"](k)) then return {k, k} else - local _0_ = compile1(k, scope, parent, {nval = 1}) - local compiled = _0_[1] + local _let_285_ = compile1(k, scope, parent, {nval = 1}) + local compiled = _let_285_[1] local kstr = ("[" .. tostring(compiled) .. "]") return {kstr, k} end + else + return nil end end do - local keys = nil + local keys do - local _0_0 = utils.kvmap(ast, write_other_values) - local function _1_(a, b) - return (a[1] < b[1]) + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for k, v in utils.stablepairs(ast) do + local val_16_auto = write_other_values(k, v) + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else + end end - table.sort(_0_0, _1_) - keys = _0_0 - end - local function _1_(_2_0) - local _3_ = _2_0 - local k1 = _3_[1] - local k2 = _3_[2] - local _4_ = compile1(ast[k2], scope, parent, {nval = 1}) - local v = _4_[1] + keys = tbl_14_auto + end + local function _291_(_289_) + local _arg_290_ = _289_ + local k1 = _arg_290_[1] + local k2 = _arg_290_[2] + local _let_292_ = compile1(ast[k2], scope, parent, {nval = 1}) + local v = _let_292_[1] return string.format("%s = %s", k1, tostring(v)) end - utils.map(keys, _1_, buffer) + utils.map(keys, _291_, buffer) + end + for i = 1, #ast do + local nval = ((i ~= #ast) and 1) + table.insert(buffer, exprs1(compile1(ast[i], scope, parent, {nval = nval}))) end return handle_compile_opts({utils.expr(("{" .. table.concat(buffer, ", ") .. "}"), "expression")}, parent, opts, ast) end - local function compile1(ast, scope, parent, opts) - local opts0 = (opts or {}) + local function compile1(ast, scope, parent, _3fopts) + local opts = (_3fopts or {}) local ast0 = macroexpand_2a(ast, scope) if utils["list?"](ast0) then - return compile_call(ast0, scope, parent, opts0, compile1) + return compile_call(ast0, scope, parent, opts, compile1) elseif utils["varg?"](ast0) then - return compile_varg(ast0, scope, parent, opts0) + return compile_varg(ast0, scope, parent, opts) elseif utils["sym?"](ast0) then - return compile_sym(ast0, scope, parent, opts0) + return compile_sym(ast0, scope, parent, opts) elseif (type(ast0) == "table") then - return compile_table(ast0, scope, parent, opts0, compile1) + return compile_table(ast0, scope, parent, opts, compile1) elseif ((type(ast0) == "nil") or (type(ast0) == "boolean") or (type(ast0) == "number") or (type(ast0) == "string")) then - return compile_scalar(ast0, scope, parent, opts0) + return compile_scalar(ast0, scope, parent, opts) else return assert_compile(false, ("could not compile value of type " .. type(ast0)), ast0) end end local function destructure(to, from, ast, scope, parent, opts) local opts0 = (opts or {}) - local _0_ = opts0 - local declaration = _0_["declaration"] - local forceglobal = _0_["forceglobal"] - local forceset = _0_["forceset"] - local isvar = _0_["isvar"] - local symtype = _0_["symtype"] + local _let_294_ = opts0 + local isvar = _let_294_["isvar"] + local declaration = _let_294_["declaration"] + local forceglobal = _let_294_["forceglobal"] + local forceset = _let_294_["forceset"] + local symtype = _let_294_["symtype"] local symtype0 = ("_" .. (symtype or "dst")) - local setter = nil + local setter if declaration then setter = "local %s = %s" else @@ -2820,32 +2661,36 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else local parts = (utils["multi-sym?"](raw) or {raw}) local meta = scope.symmeta[parts[1]] + assert_compile(not raw:find(":"), "cannot set method sym", symbol) if ((#parts == 1) and not forceset) then assert_compile(not (forceglobal and meta), string.format("global %s conflicts with local", tostring(symbol)), symbol) assert_compile(not (meta and not meta.var), ("expected var " .. raw), symbol) assert_compile((meta or not opts0.noundef), ("expected local " .. parts[1]), symbol) + else end if forceglobal then assert_compile(not scope.symmeta[scope.unmanglings[raw]], ("global " .. raw .. " conflicts with local"), symbol) - scope.manglings[raw] = global_mangling(raw) - scope.unmanglings[global_mangling(raw)] = raw + do end (scope.manglings)[raw] = global_mangling(raw) + do end (scope.unmanglings)[global_mangling(raw)] = raw if allowed_globals then table.insert(allowed_globals, raw) + else end + else end return symbol_to_expression(symbol, scope)[1] end end local function compile_top_target(lvalues) - local inits = nil - local function _2_(_241) + local inits + local function _300_(_241) if scope.manglings[_241] then return _241 else return "nil" end end - inits = utils.map(lvalues, _2_) + inits = utils.map(lvalues, _300_) local init = table.concat(inits, ", ") local lvalue = table.concat(lvalues, ", ") local plen, plast = #parent, parent[#parent] @@ -2854,6 +2699,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct for pi = plen, #parent do if (parent[pi] == plast) then plen = pi + else end end if ((#parent == (plen + 1)) and parent[#parent].leaf) then @@ -2863,6 +2709,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else table.insert(parent, (plen + 1), {ast = ast, leaf = ("local " .. lvalue .. " = " .. init)}) end + else end return ret end @@ -2875,46 +2722,48 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct emit(parent, setter:format(lname, exprs1(rightexprs)), left) end if declaration then - scope.symmeta[utils.deref(left)] = {var = isvar} + scope.symmeta[tostring(left)] = {var = isvar} + return nil + else return nil end end local function destructure_table(left, rightexprs, top_3f, destructure1) local s = gensym(scope, symtype0) - local right = nil + local right do - local _2_0 = nil + local _307_ if top_3f then - _2_0 = exprs1(compile1(from, scope, parent)) + _307_ = exprs1(compile1(from, scope, parent)) else - _2_0 = exprs1(rightexprs) + _307_ = exprs1(rightexprs) end - if (_2_0 == "") then + if (_307_ == "") then right = "nil" - elseif (nil ~= _2_0) then - local right0 = _2_0 + elseif (nil ~= _307_) then + local right0 = _307_ right = right0 else - right = nil + right = nil end end emit(parent, string.format("local %s = %s", s, right), left) for k, v in utils.stablepairs(left) do if not (("number" == type(k)) and tostring(left[(k - 1)]):find("^&")) then - if (utils["sym?"](v) and (utils.deref(v) == "&")) then - local unpack_str = "{(table.unpack or unpack)(%s, %s)}" - local formatted = string.format(unpack_str, s, k) + if (utils["sym?"](v) and (tostring(v) == "&")) then + local unpack_str = "(function (t, k)\n local mt = getmetatable(t)\n if \"table\" == type(mt) and mt.__fennelrest then\n return mt.__fennelrest(t, k)\n else\n return {(table.unpack or unpack)(t, k)}\n end\n end)(%s, %s)" + local formatted = string.format(string.gsub(unpack_str, "\n%s*", " "), s, k) local subexpr = utils.expr(formatted, "expression") assert_compile((utils["sequence?"](left) and (nil == left[(k + 2)])), "expected rest argument before last parameter", left) destructure1(left[(k + 1)], {subexpr}, left) - elseif (utils["sym?"](k) and (utils.deref(k) == "&as")) then + elseif (utils["sym?"](k) and (tostring(k) == "&as")) then destructure_sym(v, {utils.expr(tostring(s))}, left) - elseif (utils["sequence?"](left) and (utils.deref(v) == "&as")) then + elseif (utils["sequence?"](left) and (tostring(v) == "&as")) then local _, next_sym, trailing = select(k, unpack(left)) assert_compile((nil == trailing), "expected &as argument before last parameter", left) destructure_sym(next_sym, {utils.expr(tostring(s))}, left) else - local key = nil + local key if (type(k) == "string") then key = serialize_string(k) else @@ -2923,6 +2772,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local subexpr = utils.expr(string.format("%s[%s]", s, key), "expression") destructure1(v, {subexpr}, left) end + else end end return nil @@ -2935,7 +2785,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else local symname = gensym(scope, symtype0) table.insert(left_names, symname) - tables[i] = {name, utils.expr(symname, "sym")} + do end (tables)[i] = {name, utils.expr(symname, "sym")} end end assert_compile(top_3f, "can't nest multi-value destructuring", left) @@ -2943,9 +2793,11 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if declaration then for _, sym in ipairs(left) do if utils["sym?"](sym) then - scope.symmeta[utils.deref(sym)] = {var = isvar} + scope.symmeta[tostring(sym)] = {var = isvar} + else end end + else end for _, pair in utils.stablepairs(tables) do destructure1(pair[1], {pair[2]}, left) @@ -2960,10 +2812,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct elseif utils["list?"](left) then destructure_values(left, up1, top_3f, destructure1) else - assert_compile(false, string.format("unable to bind %s %s", type(left), tostring(left)), (((type(up1[2]) == "table") and up1[2]) or up1)) + assert_compile(false, string.format("unable to bind %s %s", type(left), tostring(left)), (((type((up1)[2]) == "table") and (up1)[2]) or up1)) end if top_3f then return {returned = true} + else + return nil end end local ret = destructure1(to, nil, ast, true) @@ -2973,6 +2827,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function require_include(ast, scope, parent, opts) opts.fallback = function(e) + utils.warn(("include module not found, falling back to require: %s"):format(tostring(e))) return utils.expr(string.format("require(%s)", tostring(e)), "statement") end return scopes.global.specials.include(ast, scope, parent, opts) @@ -2983,14 +2838,15 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local scope = (opts.scope or make_scope(scopes.global)) local vals = {} local chunk = {} - local _0_ = utils.root - _0_["set-reset"](_0_) + do end (function(tgt, m, ...) return tgt[m](tgt, ...) end)(utils.root, "set-reset") allowed_globals = opts.allowedGlobals if (opts.indent == nil) then opts.indent = " " + else end if opts.requireAsInclude then scope.specials.require = require_include + else end utils.root.chunk, utils.root.scope, utils.root.options = chunk, scope, opts for _, val in parser.parser(strm, opts.filename, opts) do @@ -2999,6 +2855,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct for i = 1, #vals do local exprs = compile1(vals[i], scope, chunk, {nval = (((i < #vals) and 0) or nil), tail = (i == #vals)}) keep_side_effects(exprs, chunk, nil, vals[i]) + if (i == #vals) then + utils.hook("chunk", vals[i], scope) + else + end end allowed_globals = old_globals utils.root.reset() @@ -3012,18 +2872,20 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local old_globals = allowed_globals local chunk = {} local scope = (opts0.scope or make_scope(scopes.global)) - local _0_ = utils.root - _0_["set-reset"](_0_) + do end (function(tgt, m, ...) return tgt[m](tgt, ...) end)(utils.root, "set-reset") allowed_globals = opts0.allowedGlobals if (opts0.indent == nil) then opts0.indent = " " + else end if opts0.requireAsInclude then scope.specials.require = require_include + else end utils.root.chunk, utils.root.scope, utils.root.options = chunk, scope, opts0 local exprs = compile1(ast, scope, chunk, {tail = true}) keep_side_effects(exprs, chunk, nil, ast) + utils.hook("chunk", ast, scope) allowed_globals = old_globals utils.root.reset() return flatten(chunk, opts0) @@ -3034,24 +2896,25 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct elseif (info.what == "C") then return " [C]: in ?" else - local remap = fennel_sourcemap[info.source] + local remap = sourcemap[info.source] if (remap and remap[info.currentline]) then if remap[info.currentline][1] then - info.short_src = fennel_sourcemap[("@" .. remap[info.currentline][1])].short_src + info.short_src = sourcemap[("@" .. remap[info.currentline][1])].short_src else info.short_src = remap.short_src end info.currentline = (remap[info.currentline][2] or -1) + else end if (info.what == "Lua") then - local function _1_() + local function _325_() if info.name then return ("'" .. info.name .. "'") else return "?" end end - return string.format(" %s:%d: in function %s", info.short_src, info.currentline, _1_()) + return string.format(" %s:%d: in function %s", info.short_src, info.currentline, _325_()) elseif (info.short_src == "(tail call)") then return " (tail call)" else @@ -3065,7 +2928,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return msg0 else local lines = {} - if (msg0:find("^Compile error") or msg0:find("^Parse error")) then + if (msg0:find(":%d+: Compile error") or msg0:find(":%d+: Parse error")) then table.insert(lines, msg0) else local newmsg = msg0:gsub("^[^:]*:%d+:%s+", "runtime error: ") @@ -3075,12 +2938,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local done_3f, level = false, (start or 2) while not done_3f do do - local _1_0 = debug.getinfo(level, "Sln") - if (_1_0 == nil) then + local _329_ = debug.getinfo(level, "Sln") + if (_329_ == nil) then done_3f = true - elseif (nil ~= _1_0) then - local info = _1_0 + elseif (nil ~= _329_) then + local info = _329_ table.insert(lines, traceback_frame(info)) + else end end level = (level + 1) @@ -3089,14 +2953,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function entry_transform(fk, fv) - local function _0_(k, v) + local function _332_(k, v) if (type(k) == "number") then return k, fv(v) else return fk(k), fv(v) end end - return _0_ + return _332_ end local function mixed_concat(t, joiner) local seen = {} @@ -3110,6 +2974,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if not seen[k] then ret = (ret .. s .. "[" .. k .. "]" .. "=" .. v) s = joiner + else end end return ret @@ -3122,30 +2987,30 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct assert_compile(not runtime_3f, "quoted ... may only be used at compile time", form) return "_VARARG" elseif utils["sym?"](form) then - local filename = nil + local filename if form.filename then filename = string.format("%q", form.filename) else filename = "nil" end - local symstr = utils.deref(form) + local symstr = tostring(form) assert_compile(not runtime_3f, "symbols may only be used at compile time", form) if (symstr:find("#$") or symstr:find("#[:.]")) then return string.format("sym('%s', {filename=%s, line=%s})", autogensym(symstr, scope), filename, (form.line or "nil")) else return string.format("sym('%s', {quoted=true, filename=%s, line=%s})", symstr, filename, (form.line or "nil")) end - elseif (utils["list?"](form) and utils["sym?"](form[1]) and (utils.deref(form[1]) == "unquote")) then + elseif (utils["list?"](form) and utils["sym?"](form[1]) and (tostring(form[1]) == "unquote")) then local payload = form[2] local res = unpack(compile1(payload, scope, parent)) return res[1] elseif utils["list?"](form) then - local mapped = nil - local function _0_() + local mapped + local function _337_() return nil end - mapped = utils.kvmap(form, entry_transform(_0_, q)) - local filename = nil + mapped = utils.kvmap(form, entry_transform(_337_, q)) + local filename if form.filename then filename = string.format("%q", form.filename) else @@ -3156,50 +3021,47 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct elseif utils["sequence?"](form) then local mapped = utils.kvmap(form, entry_transform(q, q)) local source = getmetatable(form) - local filename = nil + local filename if source.filename then filename = string.format("%q", source.filename) else filename = "nil" end - local _1_ + local _340_ if source then - _1_ = source.line + _340_ = source.line else - _1_ = "nil" + _340_ = "nil" end - return string.format("setmetatable({%s}, {filename=%s, line=%s, sequence=%s})", mixed_concat(mapped, ", "), filename, _1_, "(getmetatable(sequence()))['sequence']") + return string.format("setmetatable({%s}, {filename=%s, line=%s, sequence=%s})", mixed_concat(mapped, ", "), filename, _340_, "(getmetatable(sequence()))['sequence']") elseif (type(form) == "table") then local mapped = utils.kvmap(form, entry_transform(q, q)) local source = getmetatable(form) - local filename = nil + local filename if source.filename then filename = string.format("%q", source.filename) else filename = "nil" end - local function _1_() + local function _343_() if source then return source.line else return "nil" end end - return string.format("setmetatable({%s}, {filename=%s, line=%s})", mixed_concat(mapped, ", "), filename, _1_()) + return string.format("setmetatable({%s}, {filename=%s, line=%s})", mixed_concat(mapped, ", "), filename, _343_()) elseif (type(form) == "string") then return serialize_string(form) else return tostring(form) end end - return {["apply-manglings"] = apply_manglings, ["compile-stream"] = compile_stream, ["compile-string"] = compile_string, ["declare-local"] = declare_local, ["do-quote"] = do_quote, ["global-mangling"] = global_mangling, ["global-unmangling"] = global_unmangling, ["keep-side-effects"] = keep_side_effects, ["make-scope"] = make_scope, ["require-include"] = require_include, ["symbol-to-expression"] = symbol_to_expression, assert = assert_compile, autogensym = autogensym, compile = compile, compile1 = compile1, destructure = destructure, emit = emit, gensym = gensym, macroexpand = macroexpand_2a, metadata = make_metadata(), scopes = scopes, traceback = traceback} + return {compile = compile, compile1 = compile1, ["compile-stream"] = compile_stream, ["compile-string"] = compile_string, emit = emit, destructure = destructure, ["require-include"] = require_include, autogensym = autogensym, gensym = gensym, ["do-quote"] = do_quote, ["global-mangling"] = global_mangling, ["global-unmangling"] = global_unmangling, ["apply-manglings"] = apply_manglings, macroexpand = macroexpand_2a, ["declare-local"] = declare_local, ["make-scope"] = make_scope, ["keep-side-effects"] = keep_side_effects, ["symbol-to-expression"] = symbol_to_expression, assert = assert_compile, scopes = scopes, traceback = traceback, metadata = make_metadata(), sourcemap = sourcemap} end package.preload["fennel.friend"] = package.preload["fennel.friend"] or function(...) - local function ast_source(ast) - local m = getmetatable(ast) - return ((m and m.line and m) or (("table" == type(ast)) and ast) or {}) - end - local suggestions = {["$ and $... in hashfn are mutually exclusive"] = {"modifying the hashfn so it only contains $... or $, $1, $2, $3, etc"}, ["can't start multisym segment with a digit"] = {"removing the digit", "adding a non-digit before the digit"}, ["cannot call literal value"] = {"checking for typos", "checking for a missing function name"}, ["could not compile value of type "] = {"debugging the macro you're calling to return a list or table"}, ["could not read number (.*)"] = {"removing the non-digit character", "beginning the identifier with a non-digit if it is not meant to be a number"}, ["expected a function.* to call"] = {"removing the empty parentheses", "using square brackets if you want an empty table"}, ["expected binding and iterator"] = {"making sure you haven't omitted a local name or iterator"}, ["expected binding table"] = {"placing a table here in square brackets containing identifiers to bind"}, ["expected body expression"] = {"putting some code in the body of this form after the bindings"}, ["expected each macro to be function"] = {"ensuring that the value for each key in your macros table contains a function", "avoid defining nested macro tables"}, ["expected even number of name/value bindings"] = {"finding where the identifier or value is missing"}, ["expected even number of pattern/body pairs"] = {"checking that every pattern has a body to go with it", "adding _ before the final body"}, ["expected even number of values in table literal"] = {"removing a key", "adding a value"}, ["expected local"] = {"looking for a typo", "looking for a local which is used out of its scope"}, ["expected macros to be table"] = {"ensuring your macro definitions return a table"}, ["expected parameters"] = {"adding function parameters as a list of identifiers in brackets"}, ["expected rest argument before last parameter"] = {"moving & to right before the final identifier when destructuring"}, ["expected symbol for function parameter: (.*)"] = {"changing %s to an identifier instead of a literal value"}, ["expected var (.*)"] = {"declaring %s using var instead of let/local", "introducing a new local instead of changing the value of %s"}, ["expected vararg as last parameter"] = {"moving the \"...\" to the end of the parameter list"}, ["expected whitespace before opening delimiter"] = {"adding whitespace"}, ["global (.*) conflicts with local"] = {"renaming local %s"}, ["illegal character: (.)"] = {"deleting or replacing %s", "avoiding reserved characters like \", \\, ', ~, ;, @, `, and comma"}, ["local (.*) was overshadowed by a special form or macro"] = {"renaming local %s"}, ["macro not found in macro module"] = {"checking the keys of the imported macro module's returned table"}, ["macro tried to bind (.*) without gensym"] = {"changing to %s# when introducing identifiers inside macros"}, ["malformed multisym"] = {"ensuring each period or colon is not followed by another period or colon"}, ["may only be used at compile time"] = {"moving this to inside a macro if you need to manipulate symbols/lists", "using square brackets instead of parens to construct a table"}, ["method must be last component"] = {"using a period instead of a colon for field access", "removing segments after the colon", "making the method call, then looking up the field on the result"}, ["mismatched closing delimiter (.), expected (.)"] = {"replacing %s with %s", "deleting %s", "adding matching opening delimiter earlier"}, ["multisym method calls may only be in call position"] = {"using a period instead of a colon to reference a table's fields", "putting parens around this"}, ["tried to reference a macro at runtime"] = {"renaming the macro so as not to conflict with locals"}, ["unable to bind (.*)"] = {"replacing the %s with an identifier"}, ["unexpected arguments"] = {"removing an argument", "checking for typos"}, ["unexpected closing delimiter (.)"] = {"deleting %s", "adding matching opening delimiter earlier"}, ["unexpected iterator clause"] = {"removing an argument", "checking for typos"}, ["unexpected multi symbol (.*)"] = {"removing periods or colons from %s"}, ["unexpected vararg"] = {"putting \"...\" at the end of the fn parameters if the vararg was intended"}, ["unknown global in strict mode: (.*)"] = {"looking to see if there's a typo", "using the _G table instead, eg. _G.%s if you really want a global", "moving this code to somewhere that %s is in scope", "binding %s as a local in the scope of this code"}, ["unused local (.*)"] = {"fixing a typo so %s is used", "renaming the local to _%s"}, ["use of global (.*) is aliased by a local"] = {"renaming local %s", "refer to the global using _G.%s instead of directly"}} + local utils = require("fennel.utils") + local suggestions = {["unexpected multi symbol (.*)"] = {"removing periods or colons from %s"}, ["use of global (.*) is aliased by a local"] = {"renaming local %s", "refer to the global using _G.%s instead of directly"}, ["local (.*) was overshadowed by a special form or macro"] = {"renaming local %s"}, ["global (.*) conflicts with local"] = {"renaming local %s"}, ["expected var (.*)"] = {"declaring %s using var instead of let/local", "introducing a new local instead of changing the value of %s"}, ["expected macros to be table"] = {"ensuring your macro definitions return a table"}, ["expected each macro to be function"] = {"ensuring that the value for each key in your macros table contains a function", "avoid defining nested macro tables"}, ["macro not found in macro module"] = {"checking the keys of the imported macro module's returned table"}, ["macro tried to bind (.*) without gensym"] = {"changing to %s# when introducing identifiers inside macros"}, ["unknown identifier in strict mode: (.*)"] = {"looking to see if there's a typo", "using the _G table instead, eg. _G.%s if you really want a global", "moving this code to somewhere that %s is in scope", "binding %s as a local in the scope of this code"}, ["expected a function.* to call"] = {"removing the empty parentheses", "using square brackets if you want an empty table"}, ["cannot call literal value"] = {"checking for typos", "checking for a missing function name"}, ["unexpected vararg"] = {"putting \"...\" at the end of the fn parameters if the vararg was intended"}, ["multisym method calls may only be in call position"] = {"using a period instead of a colon to reference a table's fields", "putting parens around this"}, ["unused local (.*)"] = {"renaming the local to _%s if it is meant to be unused", "fixing a typo so %s is used", "disabling the linter which checks for unused locals"}, ["expected parameters"] = {"adding function parameters as a list of identifiers in brackets"}, ["unable to bind (.*)"] = {"replacing the %s with an identifier"}, ["expected rest argument before last parameter"] = {"moving & to right before the final identifier when destructuring"}, ["expected vararg as last parameter"] = {"moving the \"...\" to the end of the parameter list"}, ["expected symbol for function parameter: (.*)"] = {"changing %s to an identifier instead of a literal value"}, ["could not compile value of type "] = {"debugging the macro you're calling to return a list or table"}, ["expected local"] = {"looking for a typo", "looking for a local which is used out of its scope"}, ["expected body expression"] = {"putting some code in the body of this form after the bindings"}, ["expected binding and iterator"] = {"making sure you haven't omitted a local name or iterator"}, ["expected binding sequence"] = {"placing a table here in square brackets containing identifiers to bind"}, ["expected even number of name/value bindings"] = {"finding where the identifier or value is missing"}, ["may only be used at compile time"] = {"moving this to inside a macro if you need to manipulate symbols/lists", "using square brackets instead of parens to construct a table"}, ["unexpected closing delimiter (.)"] = {"deleting %s", "adding matching opening delimiter earlier"}, ["mismatched closing delimiter (.), expected (.)"] = {"replacing %s with %s", "deleting %s", "adding matching opening delimiter earlier"}, ["expected even number of values in table literal"] = {"removing a key", "adding a value"}, ["expected whitespace before opening delimiter"] = {"adding whitespace"}, ["illegal character: (.)"] = {"deleting or replacing %s", "avoiding reserved characters like \", \\, ', ~, ;, @, `, and comma"}, ["could not read number (.*)"] = {"removing the non-digit character", "beginning the identifier with a non-digit if it is not meant to be a number"}, ["can't start multisym segment with a digit"] = {"removing the digit", "adding a non-digit before the digit"}, ["malformed multisym"] = {"ensuring each period or colon is not followed by another period or colon"}, ["method must be last component"] = {"using a period instead of a colon for field access", "removing segments after the colon", "making the method call, then looking up the field on the result"}, ["$ and $... in hashfn are mutually exclusive"] = {"modifying the hashfn so it only contains $... or $, $1, $2, $3, etc"}, ["tried to reference a macro at runtime"] = {"renaming the macro so as not to conflict with locals"}, ["expected even number of pattern/body pairs"] = {"checking that every pattern has a body to go with it", "adding _ before the final body"}, ["unexpected arguments"] = {"removing an argument", "checking for typos"}, ["unexpected iterator clause"] = {"removing an argument", "checking for typos"}} local unpack = (table.unpack or _G.unpack) local function suggest(msg) local suggestion = nil @@ -3215,6 +3077,7 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( else suggestion = sug(matches) end + else end end return suggestion @@ -3222,7 +3085,7 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( local function read_line_from_file(filename, line) local bytes = 0 local f = assert(io.open(filename)) - local _ = nil + local _ for _0 = 1, (line - 1) do bytes = (bytes + 1 + #f:read()) end @@ -3236,9 +3099,11 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( local current_line = (_3fcurrent_line or 1) local bytes = ((_3fbytes or 0) + #this_line + #newline) if (target_line == current_line) then - return this_line, bytes + return this_line, (bytes - #this_line - 1) elseif this_line then return read_line_from_string(matcher, target_line, (current_line + 1), bytes) + else + return nil end end local function read_line(filename, line, source) @@ -3248,43 +3113,48 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( return read_line_from_file(filename, line) end end - local function friendly_msg(msg, _0_0, source) - local _1_ = _0_0 - local byteend = _1_["byteend"] - local bytestart = _1_["bytestart"] - local filename = _1_["filename"] - local line = _1_["line"] + local function friendly_msg(msg, _142_, source) + local _arg_143_ = _142_ + local filename = _arg_143_["filename"] + local line = _arg_143_["line"] + local bytestart = _arg_143_["bytestart"] + local byteend = _arg_143_["byteend"] local ok, codeline, bol = pcall(read_line, filename, line, source) local suggestions0 = suggest(msg) local out = {msg, ""} if (ok and codeline) then table.insert(out, codeline) + else end if (ok and codeline and bytestart and byteend) then table.insert(out, (string.rep(" ", (bytestart - bol - 1)) .. "^" .. string.rep("^", math.min((byteend - bytestart), ((bol + #codeline) - bytestart))))) + else end if (ok and codeline and bytestart and not byteend) then table.insert(out, (string.rep("-", (bytestart - bol - 1)) .. "^")) table.insert(out, "") + else end if suggestions0 then for _, suggestion in ipairs(suggestions0) do table.insert(out, ("* Try %s."):format(suggestion)) end + else end return table.concat(out, "\n") end local function assert_compile(condition, msg, ast, source) if not condition then - local _1_ = ast_source(ast) - local filename = _1_["filename"] - local line = _1_["line"] - error(friendly_msg(("Compile error in %s:%s\n %s"):format((filename or "unknown"), (line or "?"), msg), ast_source(ast), source), 0) + local _let_148_ = utils["ast-source"](ast) + local filename = _let_148_["filename"] + local line = _let_148_["line"] + error(friendly_msg(("Compile error in %s:%s\n %s"):format((filename or "unknown"), (line or "?"), msg), utils["ast-source"](ast), source), 0) + else end return condition end local function parse_error(msg, filename, line, bytestart, source) - return error(friendly_msg(("Parse error in %s:%s\n %s"):format(filename, line, msg), {bytestart = bytestart, filename = filename, line = line}, source), 0) + return error(friendly_msg(("Parse error in %s:%s\n %s"):format(filename, line, msg), {filename = filename, line = line, bytestart = bytestart}, source), 0) end return {["assert-compile"] = assert_compile, ["parse-error"] = parse_error} end @@ -3294,54 +3164,57 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local unpack = (table.unpack or _G.unpack) local function granulate(getchunk) local c, index, done_3f = "", 1, false - local function _0_(parser_state) + local function _150_(parser_state) if not done_3f then if (index <= #c) then local b = c:byte(index) index = (index + 1) return b else - local _1_0, _2_0, _3_0 = getchunk(parser_state) - local _4_ - do - local char = _1_0 - _4_ = ((nil ~= _1_0) and (char ~= "")) + local _151_ = getchunk(parser_state) + local function _152_() + local char = _151_ + return (char ~= "") end - if _4_ then - local char = _1_0 + if ((nil ~= _151_) and _152_()) then + local char = _151_ c = char index = 2 return c:byte() - else - local _ = _1_0 + elseif true then + local _ = _151_ done_3f = true return nil + else + return nil end end + else + return nil end end - local function _1_() + local function _156_() c = "" return nil end - return _0_, _1_ + return _150_, _156_ end local function string_stream(str) local str0 = str:gsub("^#!", ";;") local index = 1 - local function _0_() + local function _157_() local r = str0:byte(index) index = (index + 1) return r end - return _0_ + return _157_ end - local delims = {[123] = 125, [125] = true, [40] = 41, [41] = true, [91] = 93, [93] = true} + local delims = {[40] = 41, [41] = true, [91] = 93, [93] = true, [123] = 125, [125] = true} local function whitespace_3f(b) return ((b == 32) or ((b >= 9) and (b <= 13))) end local function sym_char_3f(b) - local b0 = nil + local b0 if ("number" == type(b)) then b0 = b else @@ -3350,7 +3223,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return ((b0 > 32) and not delims[b0] and (b0 ~= 127) and (b0 ~= 34) and (b0 ~= 39) and (b0 ~= 126) and (b0 ~= 59) and (b0 ~= 44) and (b0 ~= 64) and (b0 ~= 96)) end local prefixes = {[35] = "hashfn", [39] = "quote", [44] = "unquote", [96] = "quote"} - local function parser(getbyte, filename, options) + local function parser(getbyte, _3ffilename, _3foptions) local stack = {} local line = 1 local byteindex = 0 @@ -3358,6 +3231,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local function ungetb(ub) if (ub == 10) then line = (line - 1) + else end byteindex = (byteindex - 1) lastb = ub @@ -3373,56 +3247,63 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( byteindex = (byteindex + 1) if (r == 10) then line = (line + 1) + else end return r end - assert(((nil == filename) or ("string" == type(filename))), "expected filename as second argument to parser") + assert(((nil == _3ffilename) or ("string" == type(_3ffilename))), "expected filename as second argument to parser") local function parse_error(msg, byteindex_override) - local _0_ = (options or utils.root.options or {}) - local source = _0_["source"] - local unfriendly = _0_["unfriendly"] - utils.root.reset() - if (unfriendly or not friend or not _G.io or not _G.io.read) then - return error(string.format("%s:%s: Parse error: %s", (filename or "unknown"), (line or "?"), msg), 0) + local _let_162_ = (_3foptions or utils.root.options or {}) + local source = _let_162_["source"] + local unfriendly = _let_162_["unfriendly"] + if (nil == utils.hook("parse-error", msg, (_3ffilename or "unknown"), (line or "?"), (byteindex_override or byteindex), source, utils.root.reset)) then + utils.root.reset() + if (unfriendly or not friend or not _G.io or not _G.io.read) then + return error(string.format("%s:%s: Parse error: %s", (_3ffilename or "unknown"), (line or "?"), msg), 0) + else + return friend["parse-error"](msg, (_3ffilename or "unknown"), (line or "?"), (byteindex_override or byteindex), source) + end else - return friend["parse-error"](msg, (filename or "unknown"), (line or "?"), (byteindex_override or byteindex), source) + return nil end end local function parse_stream() local whitespace_since_dispatch, done_3f, retval = true local function dispatch(v) - local _0_0 = stack[#stack] - if (_0_0 == nil) then + local _165_ = stack[#stack] + if (_165_ == nil) then retval, done_3f, whitespace_since_dispatch = v, true, false return nil - elseif ((type(_0_0) == "table") and (nil ~= _0_0.prefix)) then - local prefix = _0_0.prefix - local source = nil + elseif ((_G.type(_165_) == "table") and (nil ~= (_165_).prefix)) then + local prefix = (_165_).prefix + local source do - local _1_0 = table.remove(stack) - _1_0["byteend"] = byteindex - source = _1_0 + local _166_ = table.remove(stack) + do end (_166_)["byteend"] = byteindex + source = _166_ end local list = utils.list(utils.sym(prefix, source), v) for k, v0 in pairs(source) do list[k] = v0 end return dispatch(list) - elseif (nil ~= _0_0) then - local top = _0_0 + elseif (nil ~= _165_) then + local top = _165_ whitespace_since_dispatch = false return table.insert(top, v) + else + return nil end end local function badend() local accum = utils.map(stack, "closer") - local _0_ + local _168_ if (#stack == 1) then - _0_ = "" + _168_ = "" else - _0_ = "s" + _168_ = "s" end - return parse_error(string.format("expected closing delimiter%s %s", _0_, string.char(unpack(accum)))) + return parse_error(string.format("expected closing delimiter%s %s", _168_, string.char(unpack(accum)))) end local function skip_whitespace(b) if (b and whitespace_3f(b)) then @@ -3436,14 +3317,14 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end local function parse_comment(b, contents) if (b and (10 ~= b)) then - local function _1_() - local _0_0 = contents - table.insert(_0_0, string.char(b)) - return _0_0 + local function _172_() + local _171_ = contents + table.insert(_171_, string.char(b)) + return _171_ end - return parse_comment(getb(), _1_()) - elseif (options and options.comments) then - return dispatch(utils.comment(table.concat(contents), {filename = filename, line = (line - 1)})) + return parse_comment(getb(), _172_()) + elseif (_3foptions and _3foptions.comments) then + return dispatch(utils.comment(table.concat(contents), {line = (line - 1), filename = _3ffilename})) else return b end @@ -3451,8 +3332,9 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local function open_table(b) if not whitespace_since_dispatch then parse_error(("expected whitespace before opening delimiter " .. string.char(b))) + else end - return table.insert(stack, {bytestart = byteindex, closer = delims[b], filename = filename, line = line}) + return table.insert(stack, {bytestart = byteindex, closer = delims[b], filename = _3ffilename, line = line}) end local function close_list(list) return dispatch(setmetatable(list, getmetatable(utils.list()))) @@ -3465,14 +3347,16 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return dispatch(val) end local function add_comment_at(comments, index, node) - local _0_0 = comments[index] - if (nil ~= _0_0) then - local existing = _0_0 + local _175_ = comments[index] + if (nil ~= _175_) then + local existing = _175_ return table.insert(existing, node) - else - local _ = _0_0 + elseif true then + local _ = _175_ comments[index] = {node} return nil + else + return nil end end local function next_noncomment(tbl, i) @@ -3483,7 +3367,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end end local function extract_comments(tbl) - local comments = {keys = {}, last = {}, values = {}} + local comments = {keys = {}, values = {}, last = {}} while utils["comment?"](tbl[#tbl]) do table.insert(comments.last, 1, table.remove(tbl)) end @@ -3500,6 +3384,7 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( for i = #tbl, 1, -1 do if utils["comment?"](tbl[i]) then table.remove(tbl, i) + else end end return comments @@ -3511,11 +3396,13 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( if ((#tbl % 2) ~= 0) then byteindex = (byteindex - 1) parse_error("expected even number of values in table literal") + else end setmetatable(val, tbl) for i = 1, #tbl, 2 do if ((tostring(tbl[i]) == ":") and utils["sym?"](tbl[(i + 1)]) and utils["sym?"](tbl[i])) then tbl[i] = tostring(tbl[(i + 1)]) + else end val[tbl[i]] = tbl[(i + 1)] table.insert(keys, tbl[i]) @@ -3528,9 +3415,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local top = table.remove(stack) if (top == nil) then parse_error(("unexpected closing delimiter " .. string.char(b))) + else end if (top.closer and (top.closer ~= b)) then parse_error(("mismatched closing delimiter " .. string.char(b) .. ", expected " .. string.char(top.closer))) + else end top.byteend = byteindex if (b == 41) then @@ -3543,16 +3432,21 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end local function parse_string_loop(chars, b, state) table.insert(chars, b) - local state0 = nil + local state0 do - local _0_0 = {state, b} - if ((type(_0_0) == "table") and (_0_0[1] == "base") and (_0_0[2] == 92)) then + local _185_ = {state, b} + if ((_G.type(_185_) == "table") and ((_185_)[1] == "base") and ((_185_)[2] == 92)) then state0 = "backslash" - elseif ((type(_0_0) == "table") and (_0_0[1] == "base") and (_0_0[2] == 34)) then + elseif ((_G.type(_185_) == "table") and ((_185_)[1] == "base") and ((_185_)[2] == 34)) then state0 = "done" - else - local _ = _0_0 + elseif ((_G.type(_185_) == "table") and ((_185_)[1] == "backslash") and ((_185_)[2] == 10)) then + table.remove(chars, (#chars - 1)) + state0 = "base" + elseif true then + local _ = _185_ state0 = "base" + else + state0 = nil end end if (b and (state0 ~= "done")) then @@ -3562,151 +3456,746 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end end local function escape_char(c) - return ({[10] = "\\n", [11] = "\\v", [12] = "\\f", [13] = "\\r", [7] = "\\a", [8] = "\\b", [9] = "\\t"})[c:byte()] + return ({[7] = "\\a", [8] = "\\b", [9] = "\\t", [10] = "\\n", [11] = "\\v", [12] = "\\f", [13] = "\\r"})[c:byte()] end local function parse_string() table.insert(stack, {closer = 34}) local chars = {34} if not parse_string_loop(chars, getb(), "base") then badend() + else end table.remove(stack) local raw = string.char(unpack(chars)) local formatted = raw:gsub("[\7-\13]", escape_char) - local _1_0 = (rawget(_G, "loadstring") or load)(("return " .. formatted)) - if (nil ~= _1_0) then - local load_fn = _1_0 + local _189_ = (rawget(_G, "loadstring") or load)(("return " .. formatted)) + if (nil ~= _189_) then + local load_fn = _189_ return dispatch(load_fn()) - elseif (_1_0 == nil) then + elseif (_189_ == nil) then return parse_error(("Invalid string: " .. raw)) + else + return nil end end local function parse_prefix(b) - table.insert(stack, {bytestart = byteindex, filename = filename, line = line, prefix = prefixes[b]}) + table.insert(stack, {prefix = prefixes[b], filename = _3ffilename, line = line, bytestart = byteindex}) local nextb = getb() if (whitespace_3f(nextb) or (true == delims[nextb])) then if (b ~= 35) then parse_error("invalid whitespace after quoting prefix") + else + end + table.remove(stack) + dispatch(utils.sym("#")) + else + end + return ungetb(nextb) + end + local function parse_sym_loop(chars, b) + if (b and sym_char_3f(b)) then + table.insert(chars, b) + return parse_sym_loop(chars, getb()) + else + if b then + ungetb(b) + else + end + return chars + end + end + local function parse_number(rawstr) + local number_with_stripped_underscores = (not rawstr:find("^_") and rawstr:gsub("_", "")) + if rawstr:match("^%d") then + dispatch((tonumber(number_with_stripped_underscores) or parse_error(("could not read number \"" .. rawstr .. "\"")))) + return true + else + local _195_ = tonumber(number_with_stripped_underscores) + if (nil ~= _195_) then + local x = _195_ + dispatch(x) + return true + elseif true then + local _ = _195_ + return false + else + return nil + end + end + end + local function check_malformed_sym(rawstr) + if (rawstr:match("^~") and (rawstr ~= "~=")) then + return parse_error("illegal character: ~") + elseif rawstr:match("%.[0-9]") then + return parse_error(("can't start multisym segment with a digit: " .. rawstr), (((byteindex - #rawstr) + rawstr:find("%.[0-9]")) + 1)) + elseif (rawstr:match("[%.:][%.:]") and (rawstr ~= "..") and (rawstr ~= "$...")) then + return parse_error(("malformed multisym: " .. rawstr), ((byteindex - #rawstr) + 1 + rawstr:find("[%.:][%.:]"))) + elseif ((rawstr ~= ":") and rawstr:match(":$")) then + return parse_error(("malformed multisym: " .. rawstr), ((byteindex - #rawstr) + 1 + rawstr:find(":$"))) + elseif rawstr:match(":.+[%.:]") then + return parse_error(("method must be last component of multisym: " .. rawstr), ((byteindex - #rawstr) + rawstr:find(":.+[%.:]"))) + else + return rawstr + end + end + local function parse_sym(b) + local bytestart = byteindex + local rawstr = string.char(unpack(parse_sym_loop({b}, getb()))) + if (rawstr == "true") then + return dispatch(true) + elseif (rawstr == "false") then + return dispatch(false) + elseif (rawstr == "...") then + return dispatch(utils.varg()) + elseif rawstr:match("^:.+$") then + return dispatch(rawstr:sub(2)) + elseif not parse_number(rawstr) then + return dispatch(utils.sym(check_malformed_sym(rawstr), {byteend = byteindex, bytestart = bytestart, filename = _3ffilename, line = line})) + else + return nil + end + end + local function parse_loop(b) + if not b then + elseif (b == 59) then + parse_comment(getb(), {";"}) + elseif (type(delims[b]) == "number") then + open_table(b) + elseif delims[b] then + close_table(b) + elseif (b == 34) then + parse_string(b) + elseif prefixes[b] then + parse_prefix(b) + elseif (sym_char_3f(b) or (b == string.byte("~"))) then + parse_sym(b) + elseif not utils.hook("illegal-char", b, getb, ungetb, dispatch) then + parse_error(("illegal character: " .. string.char(b))) + else + end + if not b then + return nil + elseif done_3f then + return true, retval + else + return parse_loop(skip_whitespace(getb())) + end + end + return parse_loop(skip_whitespace(getb())) + end + local function _202_() + stack, line, byteindex, lastb = {}, 1, 0, nil + return nil + end + return parse_stream, _202_ + end + return {granulate = granulate, parser = parser, ["string-stream"] = string_stream, ["sym-char?"] = sym_char_3f} +end +local utils +package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) + local type_order = {number = 1, boolean = 2, string = 3, table = 4, ["function"] = 5, userdata = 6, thread = 7} + local lua_pairs = pairs + local lua_ipairs = ipairs + local function pairs(t) + local _1_ = getmetatable(t) + if ((_G.type(_1_) == "table") and (nil ~= (_1_).__pairs)) then + local p = (_1_).__pairs + return p(t) + elseif true then + local _ = _1_ + return lua_pairs(t) + else + return nil + end + end + local function ipairs(t) + local _3_ = getmetatable(t) + if ((_G.type(_3_) == "table") and (nil ~= (_3_).__ipairs)) then + local i = (_3_).__ipairs + return i(t) + elseif true then + local _ = _3_ + return lua_ipairs(t) + else + return nil + end + end + local function length_2a(t) + local _5_ = getmetatable(t) + if ((_G.type(_5_) == "table") and (nil ~= (_5_).__len)) then + local l = (_5_).__len + return l(t) + elseif true then + local _ = _5_ + return #t + else + return nil + end + end + local function sort_keys(_7_, _9_) + local _arg_8_ = _7_ + local a = _arg_8_[1] + local _arg_10_ = _9_ + local b = _arg_10_[1] + local ta = type(a) + local tb = type(b) + if ((ta == tb) and ((ta == "string") or (ta == "number"))) then + return (a < b) + else + local dta = type_order[ta] + local dtb = type_order[tb] + if (dta and dtb) then + return (dta < dtb) + elseif dta then + return true + elseif dtb then + return false + else + return (ta < tb) + end + end + end + local function max_index_gap(kv) + local gap = 0 + if (length_2a(kv) > 0) then + local i = 0 + for _, _13_ in ipairs(kv) do + local _each_14_ = _13_ + local k = _each_14_[1] + if ((k - i) > gap) then + gap = (k - i) + else + end + i = k + end + else + end + return gap + end + local function fill_gaps(kv) + local missing_indexes = {} + local i = 0 + for _, _17_ in ipairs(kv) do + local _each_18_ = _17_ + local j = _each_18_[1] + i = (i + 1) + while (i < j) do + table.insert(missing_indexes, i) + i = (i + 1) + end + end + for _, k in ipairs(missing_indexes) do + table.insert(kv, k, {k}) + end + return nil + end + local function table_kv_pairs(t, options) + local assoc_3f = false + local kv = {} + local insert = table.insert + for k, v in pairs(t) do + if ((type(k) ~= "number") or (k < 1)) then + assoc_3f = true + else + end + insert(kv, {k, v}) + end + table.sort(kv, sort_keys) + if not assoc_3f then + if (max_index_gap(kv) > options["max-sparse-gap"]) then + assoc_3f = true + else + fill_gaps(kv) + end + else + end + if (length_2a(kv) == 0) then + return kv, "empty" + else + local function _22_() + if assoc_3f then + return "table" + else + return "seq" + end + end + return kv, _22_() + end + end + local function count_table_appearances(t, appearances) + if (type(t) == "table") then + if not appearances[t] then + appearances[t] = 1 + for k, v in pairs(t) do + count_table_appearances(k, appearances) + count_table_appearances(v, appearances) + end + else + appearances[t] = ((appearances[t] or 0) + 1) + end + else + end + return appearances + end + local function save_table(t, seen) + local seen0 = (seen or {len = 0}) + local id = (seen0.len + 1) + if not (seen0)[t] then + seen0[t] = id + seen0.len = id + else + end + return seen0 + end + local function detect_cycle(t, seen, _3fk) + if ("table" == type(t)) then + seen[t] = true + local _27_, _28_ = next(t, _3fk) + if ((nil ~= _27_) and (nil ~= _28_)) then + local k = _27_ + local v = _28_ + return (seen[k] or detect_cycle(k, seen) or seen[v] or detect_cycle(v, seen) or detect_cycle(t, seen, k)) + else + return nil + end + else + return nil + end + end + local function visible_cycle_3f(t, options) + return (options["detect-cycles?"] and detect_cycle(t, {}) and save_table(t, options.seen) and (1 < (options.appearances[t] or 0))) + end + local function table_indent(indent, id) + local opener_length + if id then + opener_length = (length_2a(tostring(id)) + 2) + else + opener_length = 1 + end + return (indent + opener_length) + end + local pp = nil + local function concat_table_lines(elements, options, multiline_3f, indent, table_type, prefix) + local indent_str = ("\n" .. string.rep(" ", indent)) + local open + local function _32_() + if ("seq" == table_type) then + return "[" + else + return "{" + end + end + open = ((prefix or "") .. _32_()) + local close + if ("seq" == table_type) then + close = "]" + else + close = "}" + end + local oneline = (open .. table.concat(elements, " ") .. close) + if (not options["one-line?"] and (multiline_3f or ((indent + length_2a(oneline)) > options["line-length"]))) then + return (open .. table.concat(elements, indent_str) .. close) + else + return oneline + end + end + local function utf8_len(x) + local n = 0 + for _ in string.gmatch(x, "[%z\1-\127\192-\247]") do + n = (n + 1) + end + return n + end + local function pp_associative(t, kv, options, indent) + local multiline_3f = false + local id = options.seen[t] + if (options.level >= options.depth) then + return "{...}" + elseif (id and options["detect-cycles?"]) then + return ("@" .. id .. "{...}") + else + local visible_cycle_3f0 = visible_cycle_3f(t, options) + local id0 = (visible_cycle_3f0 and options.seen[t]) + local indent0 = table_indent(indent, id0) + local slength + if options["utf8?"] then + slength = utf8_len + else + local function _35_(_241) + return #_241 + end + slength = _35_ + end + local prefix + if visible_cycle_3f0 then + prefix = ("@" .. id0) + else + prefix = "" + end + local items + do + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for _, _38_ in pairs(kv) do + local _each_39_ = _38_ + local k = _each_39_[1] + local v = _each_39_[2] + local val_16_auto + do + local k0 = pp(k, options, (indent0 + 1), true) + local v0 = pp(v, options, (indent0 + slength(k0) + 1)) + multiline_3f = (multiline_3f or k0:find("\n") or v0:find("\n")) + val_16_auto = (k0 .. " " .. v0) + end + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else + end + end + items = tbl_14_auto + end + return concat_table_lines(items, options, multiline_3f, indent0, "table", prefix) + end + end + local function pp_sequence(t, kv, options, indent) + local multiline_3f = false + local id = options.seen[t] + if (options.level >= options.depth) then + return "[...]" + elseif (id and options["detect-cycles?"]) then + return ("@" .. id .. "[...]") + else + local visible_cycle_3f0 = visible_cycle_3f(t, options) + local id0 = (visible_cycle_3f0 and options.seen[t]) + local indent0 = table_indent(indent, id0) + local prefix + if visible_cycle_3f0 then + prefix = ("@" .. id0) + else + prefix = "" + end + local items + do + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for _, _43_ in pairs(kv) do + local _each_44_ = _43_ + local _0 = _each_44_[1] + local v = _each_44_[2] + local val_16_auto + do + local v0 = pp(v, options, indent0) + multiline_3f = (multiline_3f or v0:find("\n")) + val_16_auto = v0 + end + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else end - table.remove(stack) - dispatch(utils.sym("#")) end - return ungetb(nextb) + items = tbl_14_auto end - local function parse_sym_loop(chars, b) - if (b and sym_char_3f(b)) then - table.insert(chars, b) - return parse_sym_loop(chars, getb()) - else - if b then - ungetb(b) + return concat_table_lines(items, options, multiline_3f, indent0, "seq", prefix) + end + end + local function concat_lines(lines, options, indent, force_multi_line_3f) + if (length_2a(lines) == 0) then + if options["empty-as-sequence?"] then + return "[]" + else + return "{}" + end + else + local oneline + local _48_ + do + local tbl_14_auto = {} + local i_15_auto = #tbl_14_auto + for _, line in ipairs(lines) do + local val_16_auto = line:gsub("^%s+", "") + if (nil ~= val_16_auto) then + i_15_auto = (i_15_auto + 1) + do end (tbl_14_auto)[i_15_auto] = val_16_auto + else end - return chars end + _48_ = tbl_14_auto end - local function parse_number(rawstr) - local number_with_stripped_underscores = (not rawstr:find("^_") and rawstr:gsub("_", "")) - if rawstr:match("^%d") then - dispatch((tonumber(number_with_stripped_underscores) or parse_error(("could not read number \"" .. rawstr .. "\"")))) - return true - else - local _0_0 = tonumber(number_with_stripped_underscores) - if (nil ~= _0_0) then - local x = _0_0 - dispatch(x) - return true + oneline = table.concat(_48_, " ") + if (not options["one-line?"] and (force_multi_line_3f or oneline:find("\n") or ((indent + length_2a(oneline)) > options["line-length"]))) then + return table.concat(lines, ("\n" .. string.rep(" ", indent))) + else + return oneline + end + end + end + local function pp_metamethod(t, metamethod, options, indent) + if (options.level >= options.depth) then + if options["empty-as-sequence?"] then + return "[...]" + else + return "{...}" + end + else + local _ + local function _53_(_241) + return visible_cycle_3f(_241, options) + end + options["visible-cycle?"] = _53_ + _ = nil + local lines, force_multi_line_3f = metamethod(t, pp, options, indent) + options["visible-cycle?"] = nil + local _54_ = type(lines) + if (_54_ == "string") then + return lines + elseif (_54_ == "table") then + return concat_lines(lines, options, indent, force_multi_line_3f) + elseif true then + local _0 = _54_ + return error("__fennelview metamethod must return a table of lines") + else + return nil + end + end + end + local function pp_table(x, options, indent) + options.level = (options.level + 1) + local x0 + do + local _57_ + if options["metamethod?"] then + local _58_ = x + if (nil ~= _58_) then + local _59_ = getmetatable(_58_) + if (nil ~= _59_) then + _57_ = (_59_).__fennelview else - local _ = _0_0 - return false + _57_ = _59_ end + else + _57_ = _58_ end + else + _57_ = nil end - local function check_malformed_sym(rawstr) - if (rawstr:match("^~") and (rawstr ~= "~=")) then - return parse_error("illegal character: ~") - elseif rawstr:match("%.[0-9]") then - return parse_error(("can't start multisym segment with a digit: " .. rawstr), (((byteindex - #rawstr) + rawstr:find("%.[0-9]")) + 1)) - elseif (rawstr:match("[%.:][%.:]") and (rawstr ~= "..") and (rawstr ~= "$...")) then - return parse_error(("malformed multisym: " .. rawstr), ((byteindex - #rawstr) + 1 + rawstr:find("[%.:][%.:]"))) - elseif rawstr:match(":.+[%.:]") then - return parse_error(("method must be last component of multisym: " .. rawstr), ((byteindex - #rawstr) + rawstr:find(":.+[%.:]"))) + if (nil ~= _57_) then + local metamethod = _57_ + x0 = pp_metamethod(x, metamethod, options, indent) + elseif true then + local _ = _57_ + local _63_, _64_ = table_kv_pairs(x, options) + if (true and (_64_ == "empty")) then + local _0 = _63_ + if options["empty-as-sequence?"] then + x0 = "[]" + else + x0 = "{}" + end + elseif ((nil ~= _63_) and (_64_ == "table")) then + local kv = _63_ + x0 = pp_associative(x, kv, options, indent) + elseif ((nil ~= _63_) and (_64_ == "seq")) then + local kv = _63_ + x0 = pp_sequence(x, kv, options, indent) else - return rawstr + x0 = nil end + else + x0 = nil end - local function parse_sym(b) - local bytestart = byteindex - local rawstr = string.char(unpack(parse_sym_loop({b}, getb()))) - if (rawstr == "true") then - return dispatch(true) - elseif (rawstr == "false") then - return dispatch(false) - elseif (rawstr == "...") then - return dispatch(utils.varg()) - elseif rawstr:match("^:.+$") then - return dispatch(rawstr:sub(2)) - elseif not parse_number(rawstr) then - return dispatch(utils.sym(check_malformed_sym(rawstr), {byteend = byteindex, bytestart = bytestart, filename = filename, line = line})) + end + options.level = (options.level - 1) + return x0 + end + local function number__3estring(n) + local _68_ = string.gsub(tostring(n), ",", ".") + return _68_ + end + local function colon_string_3f(s) + return s:find("^[-%w?^_!$%&*+./@|<=>]+$") + end + local utf8_inits = {{["min-byte"] = 0, ["max-byte"] = 127, ["min-code"] = 0, ["max-code"] = 127, len = 1}, {["min-byte"] = 192, ["max-byte"] = 223, ["min-code"] = 128, ["max-code"] = 2047, len = 2}, {["min-byte"] = 224, ["max-byte"] = 239, ["min-code"] = 2048, ["max-code"] = 65535, len = 3}, {["min-byte"] = 240, ["max-byte"] = 247, ["min-code"] = 65536, ["max-code"] = 1114111, len = 4}} + local function utf8_escape(str) + local function validate_utf8(str0, index) + local inits = utf8_inits + local byte = string.byte(str0, index) + local init + do + local ret = nil + for _, init0 in ipairs(inits) do + if ret then break end + ret = (byte and (function(_69_,_70_,_71_) return (_69_ >= _70_) and (_70_ >= _71_) end)(init0["max-byte"],byte,init0["min-byte"]) and init0) end + init = ret end - local function parse_loop(b) - if not b then - elseif (b == 59) then - parse_comment(getb(), {";"}) - elseif (type(delims[b]) == "number") then - open_table(b) - elseif delims[b] then - close_table(b) - elseif (b == 34) then - parse_string(b) - elseif prefixes[b] then - parse_prefix(b) - elseif (sym_char_3f(b) or (b == string.byte("~"))) then - parse_sym(b) - elseif not utils.hook("illegal-char", b, getb, ungetb, dispatch) then - parse_error(("illegal character: " .. string.char(b))) - end - if not b then - return nil - elseif done_3f then - return true, retval + local code + local function _72_() + local code0 + if init then + code0 = (byte - init["min-byte"]) else - return parse_loop(skip_whitespace(getb())) + code0 = nil end + for i = (index + 1), (index + init.len + -1) do + local byte0 = string.byte(str0, i) + code0 = (byte0 and code0 and (function(_74_,_75_,_76_) return (_74_ >= _75_) and (_75_ >= _76_) end)(191,byte0,128) and ((code0 * 64) + (byte0 - 128))) + end + return code0 + end + code = (init and _72_()) + if (code and (function(_77_,_78_,_79_) return (_77_ >= _78_) and (_78_ >= _79_) end)(init["max-code"],code,init["min-code"]) and not (function(_80_,_81_,_82_) return (_80_ >= _81_) and (_81_ >= _82_) end)(57343,code,55296)) then + return init.len + else + return nil end - return parse_loop(skip_whitespace(getb())) end - local function _0_() - stack = {} - return nil + local index = 1 + local output = {} + while (index <= #str) do + local nexti = (string.find(str, "[\128-\255]", index) or (#str + 1)) + local len = validate_utf8(str, nexti) + table.insert(output, string.sub(str, index, (nexti + (len or 0) + -1))) + if (not len and (nexti <= #str)) then + table.insert(output, string.format("\\%03d", string.byte(str, nexti))) + else + end + if len then + index = (nexti + len) + else + index = (nexti + 1) + end + end + return table.concat(output) + end + local function pp_string(str, options, indent) + local escs + local _86_ + if (options["escape-newlines?"] and (length_2a(str) < (options["line-length"] - indent))) then + _86_ = "\\n" + else + _86_ = "\n" + end + local function _88_(_241, _242) + return ("\\%03d"):format(_242:byte()) + end + escs = setmetatable({["\7"] = "\\a", ["\8"] = "\\b", ["\12"] = "\\f", ["\11"] = "\\v", ["\13"] = "\\r", ["\9"] = "\\t", ["\\"] = "\\\\", ["\""] = "\\\"", ["\n"] = _86_}, {__index = _88_}) + local str0 = ("\"" .. str:gsub("[%c\\\"]", escs) .. "\"") + if options["utf8?"] then + return utf8_escape(str0) + else + return str0 + end + end + local function make_options(t, options) + local defaults = {["line-length"] = 80, ["one-line?"] = false, depth = 128, ["detect-cycles?"] = true, ["empty-as-sequence?"] = false, ["metamethod?"] = true, ["prefer-colon?"] = false, ["escape-newlines?"] = false, ["utf8?"] = true, ["max-sparse-gap"] = 10} + local overrides = {level = 0, appearances = count_table_appearances(t, {}), seen = {len = 0}} + for k, v in pairs((options or {})) do + defaults[k] = v + end + for k, v in pairs(overrides) do + defaults[k] = v + end + return defaults + end + local function _90_(x, options, indent, colon_3f) + local indent0 = (indent or 0) + local options0 = (options or make_options(x)) + local x0 + if options0.preprocess then + x0 = options0.preprocess(x, options0) + else + x0 = x + end + local tv = type(x0) + local function _93_() + local _92_ = getmetatable(x0) + if (nil ~= _92_) then + return (_92_).__fennelview + else + return _92_ + end + end + if ((tv == "table") or ((tv == "userdata") and _93_())) then + return pp_table(x0, options0, indent0) + elseif (tv == "number") then + return number__3estring(x0) + else + local function _95_() + if (colon_3f ~= nil) then + return colon_3f + elseif ("function" == type(options0["prefer-colon?"])) then + return options0["prefer-colon?"](x0) + else + return options0["prefer-colon?"] + end + end + if ((tv == "string") and colon_string_3f(x0) and _95_()) then + return (":" .. x0) + elseif (tv == "string") then + return pp_string(x0, options0, indent0) + elseif ((tv == "boolean") or (tv == "nil")) then + return tostring(x0) + else + return ("#<" .. tostring(x0) .. ">") + end end - return parse_stream, _0_ end - return {["string-stream"] = string_stream, ["sym-char?"] = sym_char_3f, granulate = granulate, parser = parser} + pp = _90_ + local function view(x, _3foptions) + return pp(x, make_options(x, _3foptions), 0) + end + return view end -local utils = nil package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(...) + local view = require("fennel.view") + local version = "1.0.0" + local function warn(message) + if (_G.io and _G.io.stderr) then + return (_G.io.stderr):write(("--WARNING: %s\n"):format(tostring(message))) + else + return nil + end + end local function stablepairs(t) local keys = {} + local used_keys = {} local succ = {} - for k in pairs(t) do - table.insert(keys, k) - end - local function _0_(_241, _242) - return (tostring(_241) < tostring(_242)) + if (getmetatable(t) and getmetatable(t).keys) then + for _, k in ipairs(getmetatable(t).keys) do + if used_keys[k] then + for i = #keys, 1, -1 do + if (keys[i] == k) then + table.remove(keys, i) + else + end + end + else + end + used_keys[k] = true + table.insert(keys, k) + end + else + for k in pairs(t) do + table.insert(keys, k) + end + local function _100_(_241, _242) + return (tostring(_241) < tostring(_242)) + end + table.sort(keys, _100_) end - table.sort(keys, _0_) for i, k in ipairs(keys) do succ[k] = keys[(i + 1)] end local function stablenext(tbl, idx) - local key = nil + local key if (idx == nil) then key = keys[1] else key = succ[idx] end - local value = nil + local value if (key == nil) then value = nil else @@ -3716,66 +4205,70 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end return stablenext, t, nil end - local function map(t, f, out) - local out0 = (out or {}) - local f0 = nil + local function map(t, f, _3fout) + local out = (_3fout or {}) + local f0 if (type(f) == "function") then f0 = f else - local function _0_(_241) - return _241[f] + local function _104_(_241) + return (_241)[f] end - f0 = _0_ + f0 = _104_ end for _, x in ipairs(t) do - local _1_0 = f0(x) - if (nil ~= _1_0) then - local v = _1_0 - table.insert(out0, v) + local _106_ = f0(x) + if (nil ~= _106_) then + local v = _106_ + table.insert(out, v) + else end end - return out0 + return out end - local function kvmap(t, f, out) - local out0 = (out or {}) - local f0 = nil + local function kvmap(t, f, _3fout) + local out = (_3fout or {}) + local f0 if (type(f) == "function") then f0 = f else - local function _0_(_241) - return _241[f] + local function _108_(_241) + return (_241)[f] end - f0 = _0_ + f0 = _108_ end for k, x in stablepairs(t) do - local _1_0, _2_0 = f0(k, x) - if ((nil ~= _1_0) and (nil ~= _2_0)) then - local key = _1_0 - local value = _2_0 - out0[key] = value - elseif (nil ~= _1_0) then - local value = _1_0 - table.insert(out0, value) + local _110_, _111_ = f0(k, x) + if ((nil ~= _110_) and (nil ~= _111_)) then + local key = _110_ + local value = _111_ + out[key] = value + elseif (nil ~= _110_) then + local value = _110_ + table.insert(out, value) + else end end - return out0 + return out end - local function copy(from, to) - local to0 = (to or {}) + local function copy(from, _3fto) + local to = (_3fto or {}) for k, v in pairs((from or {})) do - to0[k] = v + to[k] = v end - return to0 + return to end - local function member_3f(x, tbl, n) - local _0_0 = tbl[(n or 1)] - if (_0_0 == x) then + local function member_3f(x, tbl, _3fn) + local _113_ = tbl[(_3fn or 1)] + if (_113_ == x) then return true - elseif (_0_0 == nil) then + elseif (_113_ == nil) then return nil + elseif true then + local _ = _113_ + return member_3f(x, tbl, ((_3fn or 1) + 1)) else - local _ = _0_0 - return member_3f(x, tbl, ((n or 1) + 1)) + return nil end end local function allpairs(tbl) @@ -3790,13 +4283,17 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. seen[next_state] = true return next_state, value else - local _0_0 = getmetatable(t) - if ((type(_0_0) == "table") and (nil ~= _0_0.__index)) then - local __index = _0_0.__index + local _115_ = getmetatable(t) + if ((_G.type(_115_) == "table") and true) then + local __index = (_115_).__index if ("table" == type(__index)) then t = __index return allpairs_next(t) + else + return nil end + else + return nil end end end @@ -3806,17 +4303,18 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return self[1] end local nil_sym = nil - local function list__3estring(self, tostring2) + local function list__3estring(self, _3ftostring2) local safe, max = {}, 0 for k in pairs(self) do if ((type(k) == "number") and (k > max)) then max = k + else end end for i = 1, max do safe[i] = (((self[i] == nil) and nil_sym) or self[i]) end - return ("(" .. table.concat(map(safe, (tostring2 or tostring)), " ", 1, max) .. ")") + return ("(" .. table.concat(map(safe, (_3ftostring2 or view)), " ", 1, max) .. ")") end local function comment_view(c) return c, true @@ -3827,17 +4325,21 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function sym_3c(a, b) return (a[1] < tostring(b)) end - local symbol_mt = {"SYMBOL", __eq = sym_3d, __fennelview = deref, __lt = sym_3c, __tostring = deref} - local expr_mt = {"EXPR", __tostring = deref} - local list_mt = {"LIST", __fennelview = list__3estring, __tostring = list__3estring} - local comment_mt = {"COMMENT", __eq = sym_3d, __fennelview = comment_view, __lt = sym_3c, __tostring = deref} + local symbol_mt = {__fennelview = deref, __tostring = deref, __eq = sym_3d, __lt = sym_3c, "SYMBOL"} + local expr_mt + local function _120_(x) + return tostring(deref(x)) + end + expr_mt = {__tostring = _120_, "EXPR"} + local list_mt = {__fennelview = list__3estring, __tostring = list__3estring, "LIST"} + local comment_mt = {__fennelview = comment_view, __tostring = deref, __eq = sym_3d, __lt = sym_3c, "COMMENT"} local sequence_marker = {"SEQUENCE"} - local vararg = setmetatable({"..."}, {"VARARG", __fennelview = deref, __tostring = deref}) - local getenv = nil - local function _0_() + local vararg = setmetatable({"..."}, {__fennelview = deref, __tostring = deref, "VARARG"}) + local getenv + local function _121_() return nil end - getenv = ((os and os.getenv) or _0_) + getenv = ((os and os.getenv) or _121_) local function debug_on_3f(flag) local level = (getenv("FENNEL_DEBUG") or "") return ((level == "all") or level:find(flag)) @@ -3846,10 +4348,11 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return setmetatable({...}, list_mt) end local function sym(str, _3fsource, _3fscope) - local s = {str, ["?scope"] = _3fscope} + local s = {["?scope"] = _3fscope, str} for k, v in pairs((_3fsource or {})) do if (type(k) == "string") then s[k] = v + else end end return setmetatable(s, symbol_mt) @@ -3859,13 +4362,13 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return setmetatable({...}, {sequence = sequence_marker}) end local function expr(strcode, etype) - return setmetatable({strcode, type = etype}, expr_mt) + return setmetatable({type = etype, strcode}, expr_mt) end local function comment_2a(contents, _3fsource) - local _1_ = (_3fsource or {}) - local filename = _1_["filename"] - local line = _1_["line"] - return setmetatable({contents, filename = filename, line = line}, comment_mt) + local _let_123_ = (_3fsource or {}) + local filename = _let_123_["filename"] + local line = _let_123_["line"] + return setmetatable({filename = filename, line = line, contents}, comment_mt) end local function varg() return vararg @@ -3903,6 +4406,7 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local last_char = part:sub(( - 1)) if (last_char == ":") then parts["multi-sym-method-call"] = true + else end if ((last_char == ":") or (last_char == ".")) then parts[(#parts + 1)] = part:sub(1, ( - 2)) @@ -3916,16 +4420,27 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function quoted_3f(symbol) return symbol.quoted end - local function walk_tree(root, f, custom_iterator) + local function ast_source(ast) + if table_3f(ast) then + return (getmetatable(ast) or {}) + elseif ("table" == type(ast)) then + return ast + else + return {} + end + end + local function walk_tree(root, f, _3fcustom_iterator) local function walk(iterfn, parent, idx, node) if f(idx, node, parent) then for k, v in iterfn(node) do walk(iterfn, node, k, v) end return nil + else + return nil end end - walk((custom_iterator or pairs), nil, nil, root) + walk((_3fcustom_iterator or pairs), nil, nil, root) return root end local lua_keywords = {"and", "break", "do", "else", "elseif", "end", "false", "for", "function", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while", "goto"} @@ -3942,41 +4457,53 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end return subopts end - local root = nil - local function _1_() + local root + local function _129_() end - root = {chunk = nil, options = nil, reset = _1_, scope = nil} - root["set-reset"] = function(_2_0) - local _3_ = _2_0 - local chunk = _3_["chunk"] - local options = _3_["options"] - local reset = _3_["reset"] - local scope = _3_["scope"] + root = {chunk = nil, scope = nil, options = nil, reset = _129_} + root["set-reset"] = function(_130_) + local _arg_131_ = _130_ + local chunk = _arg_131_["chunk"] + local scope = _arg_131_["scope"] + local options = _arg_131_["options"] + local reset = _arg_131_["reset"] root.reset = function() root.chunk, root.scope, root.options, root.reset = chunk, scope, options, reset return nil end return root.reset end + local warned = {} + local function check_plugin_version(_132_) + local _arg_133_ = _132_ + local name = _arg_133_["name"] + local versions = _arg_133_["versions"] + local plugin = _arg_133_ + if (not member_3f(version:gsub("-dev", ""), (versions or {})) and not warned[plugin]) then + warned[plugin] = true + return warn(string.format("plugin %s does not support Fennel version %s", (name or "unknown"), version)) + else + return nil + end + end local function hook(event, ...) local result = nil if (root.options and root.options.plugins) then for _, plugin in ipairs(root.options.plugins) do - do - local _3_0 = plugin[event] - if (nil ~= _3_0) then - local f = _3_0 - result = f(...) - end - end - if (nil ~= result) then - return result + if result then break end + check_plugin_version(plugin) + local _135_ = plugin[event] + if (nil ~= _135_) then + local f = _135_ + result = f(...) + else end end - return nil + else end + return result end - return {["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["expr?"] = expr_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";"), ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["sequence?"] = sequence_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, deref = deref, expr = expr, hook = hook, kvmap = kvmap, list = list, map = map, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg} + return {warn = warn, allpairs = allpairs, stablepairs = stablepairs, copy = copy, kvmap = kvmap, map = map, ["walk-tree"] = walk_tree, ["member?"] = member_3f, list = list, sequence = sequence, sym = sym, varg = varg, expr = expr, comment = comment_2a, ["comment?"] = comment_3f, ["expr?"] = expr_3f, ["list?"] = list_3f, ["multi-sym?"] = multi_sym_3f, ["sequence?"] = sequence_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["varg?"] = varg_3f, ["quoted?"] = quoted_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["lua-keywords"] = lua_keywords, hook = hook, ["propagate-options"] = propagate_options, root = root, ["debug-on?"] = debug_on_3f, ["ast-source"] = ast_source, version = version, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";")} end utils = require("fennel.utils") local parser = require("fennel.parser") @@ -3986,9 +4513,10 @@ local repl = require("fennel.repl") local view = require("fennel.view") local function eval_env(env, opts) if (env == "_COMPILER") then - local env0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) + local env0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}, opts) if (opts.allowedGlobals == nil) then opts.allowedGlobals = specials["current-global-names"](env0) + else end return specials["wrap-env"](env0) else @@ -3999,12 +4527,15 @@ local function eval_opts(options, str) local opts = utils.copy(options) if (opts.allowedGlobals == nil) then opts.allowedGlobals = specials["current-global-names"](opts.env) + else end if (not opts.filename and not opts.source) then opts.source = str + else end if (opts.env == "_COMPILER") then opts.scope = compiler["make-scope"](compiler.scopes.compiler) + else end return opts end @@ -4012,15 +4543,15 @@ local function eval(str, options, ...) local opts = eval_opts(options, str) local env = eval_env(opts.env, opts) local lua_source = compiler["compile-string"](str, opts) - local loader = nil - local function _0_(...) + local loader + local function _616_(...) if opts.filename then return ("@" .. opts.filename) else return str end end - loader = specials["load-code"](lua_source, env, _0_(...)) + loader = specials["load-code"](lua_source, env, _616_(...)) opts.filename = nil return loader(...) end @@ -4039,27 +4570,29 @@ local function syntax() local out = {} for k, v in pairs(compiler.scopes.global.specials) do local metadata = (compiler.metadata[v] or {}) - out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = metadata["fnl/body-form?"], ["define?"] = utils["member?"](k, define_3f), ["special?"] = true} + do end (out)[k] = {["special?"] = true, ["body-form?"] = metadata["fnl/body-form?"], ["binding-form?"] = utils["member?"](k, binding_3f), ["define?"] = utils["member?"](k, define_3f)} end for k, v in pairs(compiler.scopes.global.macros) do - out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = utils["member?"](k, body_3f), ["define?"] = utils["member?"](k, define_3f), ["macro?"] = true} + out[k] = {["macro?"] = true, ["body-form?"] = utils["member?"](k, body_3f), ["binding-form?"] = utils["member?"](k, binding_3f), ["define?"] = utils["member?"](k, define_3f)} end for k, v in pairs(_G) do - local _0_0 = type(v) - if (_0_0 == "function") then - out[k] = {["function?"] = true, ["global?"] = true} - elseif (_0_0 == "table") then + local _617_ = type(v) + if (_617_ == "function") then + out[k] = {["global?"] = true, ["function?"] = true} + elseif (_617_ == "table") then for k2, v2 in pairs(v) do if (("function" == type(v2)) and (k ~= "_G")) then out[(k .. "." .. k2)] = {["function?"] = true, ["global?"] = true} + else end end out[k] = {["global?"] = true} + else end end return out end -local mod = {["comment?"] = utils["comment?"], ["compile-stream"] = compiler["compile-stream"], ["compile-string"] = compiler["compile-string"], ["list?"] = utils["list?"], ["load-code"] = specials["load-code"], ["macro-loaded"] = specials["macro-loaded"], ["macro-path"] = utils["macro-path"], ["macro-searchers"] = specials["macro-searchers"], ["make-searcher"] = specials["make-searcher"], ["search-module"] = specials["search-module"], ["sequence?"] = utils["sequence?"], ["string-stream"] = parser["string-stream"], ["sym-char?"] = parser["sym-char?"], ["sym?"] = utils["sym?"], comment = utils.comment, compile = compiler.compile, compile1 = compiler.compile1, compileStream = compiler["compile-stream"], compileString = compiler["compile-string"], doc = specials.doc, dofile = dofile_2a, eval = eval, gensym = compiler.gensym, granulate = parser.granulate, list = utils.list, loadCode = specials["load-code"], macroLoaded = specials["macro-loaded"], makeSearcher = specials["make-searcher"], make_searcher = specials["make-searcher"], mangle = compiler["global-mangling"], metadata = compiler.metadata, parser = parser.parser, path = utils.path, repl = repl, scope = compiler["make-scope"], searchModule = specials["search-module"], searcher = specials["make-searcher"](), sequence = utils.sequence, stringStream = parser["string-stream"], sym = utils.sym, syntax = syntax, traceback = compiler.traceback, unmangle = compiler["global-unmangling"], varg = utils.varg, version = "0.10.0", view = view} +local mod = {list = utils.list, ["list?"] = utils["list?"], sym = utils.sym, ["sym?"] = utils["sym?"], sequence = utils.sequence, ["sequence?"] = utils["sequence?"], comment = utils.comment, ["comment?"] = utils["comment?"], varg = utils.varg, path = utils.path, ["macro-path"] = utils["macro-path"], ["sym-char?"] = parser["sym-char?"], parser = parser.parser, granulate = parser.granulate, ["string-stream"] = parser["string-stream"], compile = compiler.compile, ["compile-string"] = compiler["compile-string"], ["compile-stream"] = compiler["compile-stream"], compile1 = compiler.compile1, traceback = compiler.traceback, mangle = compiler["global-mangling"], unmangle = compiler["global-unmangling"], metadata = compiler.metadata, scope = compiler["make-scope"], gensym = compiler.gensym, ["load-code"] = specials["load-code"], ["macro-loaded"] = specials["macro-loaded"], ["macro-searchers"] = specials["macro-searchers"], ["search-module"] = specials["search-module"], ["make-searcher"] = specials["make-searcher"], makeSearcher = specials["make-searcher"], searcher = specials["make-searcher"](), doc = specials.doc, view = view, eval = eval, dofile = dofile_2a, version = utils.version, repl = repl, syntax = syntax, loadCode = specials["load-code"], make_searcher = specials["make-searcher"], searchModule = specials["search-module"], macroLoaded = specials["macro-loaded"], compileStream = compiler["compile-stream"], compileString = compiler["compile-string"], stringStream = parser["string-stream"]} utils["fennel-module"] = mod do local builtin_macros = [===[;; This module contains all the built-in Fennel macros. Unlike all the other @@ -4088,7 +4621,7 @@ do Same as ->, except splices the value into the last position of each form rather than the first." (var x val) - (each [_ e (pairs [...])] + (each [_ e (ipairs [...])] (let [elt (if (list? e) e (list e))] (table.insert elt x) (set x elt))) @@ -4105,7 +4638,7 @@ do tmp (gensym)] (table.insert el 2 tmp) `(let [,tmp ,val] - (if ,tmp + (if (not= nil ,tmp) (-?> ,el ,(unpack els)) ,tmp))))) @@ -4120,7 +4653,7 @@ do tmp (gensym)] (table.insert el tmp) `(let [,tmp ,val] - (if ,tmp + (if (not= ,tmp nil) (-?>> ,el ,(unpack els)) ,tmp))))) @@ -4141,9 +4674,10 @@ do "Evaluates val and splices it into the first argument of subsequent forms." (let [name (gensym) form `(let [,name ,val])] - (each [_ elt (pairs [...])] - (table.insert elt 2 name) - (table.insert form elt)) + (each [_ elt (ipairs [...])] + (let [elt (if (list? elt) elt (list elt))] + (table.insert elt 2 name) + (table.insert form elt))) (table.insert form name) form)) @@ -4170,47 +4704,76 @@ do (table.insert closer 4 `(: ,(. closable-bindings i) :close))) `(let ,closable-bindings ,closer - (close-handlers# (xpcall ,bodyfn ,traceback))))) + (close-handlers# (_G.xpcall ,bodyfn ,traceback))))) - (fn collect* [iter-tbl key-value-expr ...] - "Returns a table made by running an iterator and evaluating an expression - that returns key-value pairs to be inserted sequentially into the table. - This can be thought of as a \"table comprehension\". The provided key-value - expression must return either 2 values, or nil. + (fn into-val [iter-tbl] + (var into nil) + (for [i (length iter-tbl) 2 -1] + (if (= :into (. iter-tbl i)) + (do (assert (not into) "expected only one :into clause") + (set into (table.remove iter-tbl (+ i 1))) + (table.remove iter-tbl i)))) + (assert (or (not into) + (sym? into) + (table? into) + (list? into)) + "expected table, function call, or symbol in :into clause") + (or into [])) + + (fn collect* [iter-tbl key-expr value-expr ...] + "Returns a table made by running an iterator and evaluating an expression that + returns key-value pairs to be inserted sequentially into the table. This can + be thought of as a table comprehension. The body should provide two + expressions (used as key and value) or nil, which causes it to be omitted from + the resulting table. For example, (collect [k v (pairs {:apple \"red\" :orange \"orange\"})] - (values v k)) + v k) returns - {:red \"apple\" :orange \"orange\"}" + {:red \"apple\" :orange \"orange\"} + + Supports an :into clause after the iterator to put results in an existing table. + Supports early termination with an :until clause." (assert (and (sequence? iter-tbl) (>= (length iter-tbl) 2)) "expected iterator binding table") - (assert (not= nil key-value-expr) "expected key-value expression") + (assert (not= nil key-expr) "expected key and value expression") (assert (= nil ...) - "expected exactly one body expression. Wrap multiple expressions with do") - `(let [tbl# {}] - (each ,iter-tbl - (match ,key-value-expr - (k# v#) (tset tbl# k# v#))) - tbl#)) + "expected 1 or 2 body expressions; wrap multiple expressions with do") + (let [kv-expr (if (= nil value-expr) key-expr `(values ,key-expr ,value-expr))] + `(let [tbl# ,(into-val iter-tbl)] + (each ,iter-tbl + (match ,kv-expr + (k# v#) (tset tbl# k# v#))) + tbl#))) (fn icollect* [iter-tbl value-expr ...] "Returns a sequential table made by running an iterator and evaluating an expression that returns values to be inserted sequentially into the table. - This can be thought of as a \"list comprehension\". + This can be thought of as a \"list comprehension\". If the body returns nil + that element is omitted from the resulting table. For example, - (icollect [_ v (ipairs [1 2 3 4 5])] (when (> v 2) (* v v))) + (icollect [_ v (ipairs [1 2 3 4 5])] (when (not= v 3) (* v v))) returns - [9 16 25]" + [1 4 16 25] + + Supports an :into clause after the iterator to put results in an existing table. + Supports early termination with an :until clause." (assert (and (sequence? iter-tbl) (>= (length iter-tbl) 2)) "expected iterator binding table") (assert (not= nil value-expr) "expected table value expression") (assert (= nil ...) "expected exactly one body expression. Wrap multiple expressions with do") - `(let [tbl# []] + `(let [tbl# ,(into-val iter-tbl)] + ;; believe it or not, using a var here has a pretty good performance boost: + ;; https://p.hagelb.org/icollect-performance.html + (var i# (length tbl#)) (each ,iter-tbl - (tset tbl# (+ (length tbl#) 1) ,value-expr)) + (let [val# ,value-expr] + (when (not= nil val#) + (set i# (+ i# 1)) + (tset tbl# i# val#)))) tbl#)) (fn accumulate* [iter-tbl accum-expr ...] @@ -4299,9 +4862,9 @@ do (values ,(unpack let-syms)))))) (fn lambda* [...] - "Function literal with arity checking. - Will throw an exception if a declared argument is passed in as nil, unless - that argument name begins with ?." + "Function literal with nil-checked arguments. + Like `fn`, but will throw an exception if a declared argument is passed in as + nil, unless that argument's name begins with a question mark." (let [args [...] has-internal-name? (sym? (. args 1)) arglist (if has-internal-name? (. args 2) (. args 1)) @@ -4317,13 +4880,13 @@ do (check! a)) (let [as (tostring a)] (and (not (as:match "^?")) (not= as "&") (not= as "_") - (not= as "..."))) + (not= as "...") (not= as "&as"))) (table.insert args arity-check-position - `(assert (not= nil ,a) - (string.format "Missing argument %s on %s:%s" - ,(tostring a) - ,(or a.filename :unknown) - ,(or a.line "?")))))) + `(_G.assert (not= nil ,a) + ,(: "Missing argument %s on %s:%s" :format + (tostring a) + (or a.filename :unknown) + (or a.line "?")))))) (assert (= :table (type arglist)) "expected arg list") (each [_ a (ipairs arglist)] @@ -4353,23 +4916,23 @@ do (assert (and binding1 module-name1 (= 0 (% (select "#" ...) 2))) "expected even number of binding/modulename pairs") (for [i 1 (select "#" binding1 module-name1 ...) 2] + ;; delegate the actual loading of the macros to the require-macros + ;; special which already knows how to set up the compiler env and stuff. + ;; this is weird because require-macros is deprecated but it works. (let [(binding modname) (select i binding1 module-name1 ...) - ;; generate a subscope of current scope, use require-macros - ;; to bring in macro module. after that, we just copy the - ;; macros from subscope to scope. scope (get-scope) - subscope (fennel.scope scope)] - (_SPECIALS.require-macros `(require-macros ,modname) subscope {} ast) + macros* (_SPECIALS.require-macros `(import-macros ,modname) + scope {} binding1)] (if (sym? binding) ;; bind whole table of macros to table bound to symbol - (tset scope.macros (. binding 1) (. macro-loaded modname)) + (tset scope.macros (. binding 1) macros*) ;; 1-level table destructuring for importing individual macros (table? binding) (each [macro-name [import-key] (pairs binding)] - (assert (= :function (type (. subscope.macros macro-name))) + (assert (= :function (type (. macros* macro-name))) (.. "macro " macro-name " not found in module " (tostring modname))) - (tset scope.macros import-key (. subscope.macros macro-name)))))) + (tset scope.macros import-key (. macros* macro-name)))))) nil) ;;; Pattern matching @@ -4386,16 +4949,20 @@ do (values condition bindings))) (fn match-table [val pattern unifications match-pattern] - (let [condition `(and (= (type ,val) :table)) + (let [condition `(and (= (_G.type ,val) :table)) bindings []] (each [k pat (pairs pattern)] (if (= pat `&) - (do + (let [rest-pat (. pattern (+ k 1)) + rest-val `(select ,k ((or table.unpack _G.unpack) ,val)) + subcondition (match-table `(pick-values 1 ,rest-val) + rest-pat unifications match-pattern)] + (if (not (sym? rest-pat)) + (table.insert condition subcondition)) (assert (= nil (. pattern (+ k 2))) "expected & rest argument before last parameter") - (table.insert bindings (. pattern (+ k 1))) - (table.insert bindings - [`(select ,k ((or table.unpack _G.unpack) ,val))])) + (table.insert bindings rest-pat) + (table.insert bindings [rest-val])) (= k `&as) (do (table.insert bindings pat) @@ -4583,20 +5150,20 @@ do :match match-where} ]===] local module_name = "fennel.macros" - local _ = nil - local function _0_() + local _ + local function _620_() return mod end - package.preload[module_name] = _0_ + package.preload[module_name] = _620_ _ = nil - local env = nil + local env do - local _1_0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) - _1_0["utils"] = utils - _1_0["fennel"] = mod - env = _1_0 + local _621_ = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) + do end (_621_)["utils"] = utils + _621_["fennel"] = mod + env = _621_ end - local built_ins = eval(builtin_macros, {allowedGlobals = false, env = env, filename = "src/fennel/macros.fnl", moduleName = module_name, scope = compiler.scopes.compiler, useMetadata = true}) + local built_ins = eval(builtin_macros, {env = env, scope = compiler.scopes.compiler, allowedGlobals = false, useMetadata = true, filename = "src/fennel/macros.fnl", moduleName = module_name}) for k, v in pairs(built_ins) do compiler.scopes.global.macros[k] = v end From 8ba1ae484fed6904a76894804a99f4ea1e0af754 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 23 Nov 2021 16:38:21 +0300 Subject: [PATCH 100/379] compilation warnings fixes --- src/core/core.h | 2 +- src/studio/screens/console.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/core/core.h b/src/core/core.h index c2981773a..5742369f9 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -163,7 +163,7 @@ typedef struct tic_mem memory; // it should be first void* currentVM; - tic_script_config* currentScript; + const tic_script_config* currentScript; struct { diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 6859a2c02..596e0fb6a 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -210,14 +210,14 @@ static const char* PngExt = PNG_EXT; // You must free the result if result is non-NULL. TODO: find a better place for this function? -char *str_replace(char *orig, char *rep, char *with) { +char *str_replace(const char *orig, char *rep, char *with) { char *result; // the return string - char *ins; // the next insert point + const char *ins; // the next insert point char *tmp; // varies - int len_rep; // length of rep (the string to remove) - int len_with; // length of with (the string to replace rep with) - int len_front; // distance between rep and end of last rep - int count; // number of replacements + s32 len_rep; // length of rep (the string to remove) + s32 len_with; // length of with (the string to replace rep with) + s32 len_front; // distance between rep and end of last rep + s32 count; // number of replacements // sanity checks and initialization if (!orig || !rep) From a6b4b7eec35796fa7e65154483aa7fb288599359 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 30 Nov 2021 14:46:58 +0300 Subject: [PATCH 101/379] Added vbank() api #1660 + removed CLIP area from VRAM #1508 --- build/assets/bpp.tic.dat | 2 +- demos/bpp.lua | 12 +- src/api.h | 32 +++-- src/api/js.c | 16 +++ src/api/lua.c | 17 ++- src/api/squirrel.c | 15 +++ src/api/wren.c | 17 +++ src/core/core.c | 230 ++++++++++++++++++++--------------- src/core/core.h | 16 ++- src/core/draw.c | 98 ++++++++------- src/defines.h | 1 - src/studio/editors/map.c | 92 +++++++------- src/studio/editors/map.h | 1 - src/studio/editors/sprite.c | 161 ++++++++++++------------ src/studio/editors/sprite.h | 1 - src/studio/editors/world.c | 20 ++- src/studio/editors/world.h | 1 - src/studio/screens/console.c | 5 +- src/studio/screens/dialog.c | 16 +-- src/studio/screens/dialog.h | 1 - src/studio/screens/menu.c | 33 +++-- src/studio/screens/menu.h | 1 - src/studio/screens/surf.c | 41 +++---- src/studio/screens/surf.h | 1 - src/studio/studio.c | 27 ++-- src/system/sdl/main.c | 14 ++- src/tic.h | 26 ++-- src/tools.c | 6 +- src/tools.h | 3 +- 29 files changed, 521 insertions(+), 385 deletions(-) diff --git a/build/assets/bpp.tic.dat b/build/assets/bpp.tic.dat index 4e62aced8..294eccdff 100644 --- a/build/assets/bpp.tic.dat +++ b/build/assets/bpp.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x5b, 0x5b, 0x6f, 0x23, 0x47, 0x76, 0xae, 0xbe, 0x15, 0x5b, 0x9c, 0x52, 0x5f, 0xc4, 0x8b, 0x4b, 0x66, 0xab, 0xbb, 0x57, 0xd6, 0xd2, 0x1a, 0x89, 0x63, 0xb7, 0x44, 0x99, 0xa6, 0xc7, 0xad, 0xe6, 0x78, 0x86, 0x68, 0x6f, 0x92, 0x89, 0x61, 0xc0, 0x63, 0x39, 0x70, 0x6c, 0x80, 0xe2, 0xa5, 0x25, 0x59, 0x1c, 0x4a, 0x2b, 0x69, 0x24, 0xca, 0xe6, 0x92, 0x08, 0x90, 0x9f, 0x91, 0x3f, 0x90, 0xdf, 0x10, 0x20, 0x30, 0xe0, 0x87, 0xfd, 0x03, 0x79, 0x08, 0xb0, 0x41, 0xb2, 0xc1, 0x3e, 0xec, 0x63, 0xfc, 0x90, 0x07, 0x23, 0x18, 0x58, 0x39, 0x55, 0x4d, 0x4a, 0x6c, 0xd9, 0x5e, 0xac, 0xb3, 0x36, 0x1c, 0x60, 0x59, 0xa3, 0x4f, 0xd5, 0x5d, 0xa7, 0xee, 0xdf, 0x39, 0xa7, 0xea, 0x50, 0x1c, 0x13, 0x21, 0x24, 0xfc, 0x8f, 0x83, 0x66, 0x69, 0x96, 0x66, 0xe9, 0xcf, 0x38, 0x89, 0x8a, 0x02, 0x48, 0x21, 0x11, 0x29, 0xf0, 0x36, 0xc9, 0xaf, 0x13, 0x16, 0x24, 0x51, 0x92, 0x25, 0x11, 0x8b, 0x29, 0x24, 0x09, 0x50, 0x55, 0xc6, 0x89, 0xe6, 0xb2, 0x00, 0x5d, 0x88, 0x8a, 0x08, 0x29, 0xc5, 0x72, 0xf6, 0xfe, 0x2d, 0x49, 0xe6, 0x3d, 0x83, 0xcb, 0x11, 0x21, 0x4b, 0x54, 0x91, 0xd3, 0x69, 0x80, 0x03, 0x35, 0xd2, 0xf0, 0x36, 0xc9, 0xaf, 0x93, 0x6d, 0x8a, 0xb2, 0xa2, 0x2a, 0xa2, 0x26, 0xe7, 0x51, 0x56, 0x9c, 0x43, 0xba, 0x99, 0x4f, 0x74, 0xac, 0x8a, 0x32, 0x92, 0xe5, 0x9c, 0x2c, 0xcb, 0x9a, 0xc6, 0x72, 0xf6, 0x7e, 0x2b, 0x19, 0xac, 0x1a, 0xd2, 0x10, 0x13, 0xb0, 0xda, 0x82, 0x98, 0x90, 0x46, 0x2b, 0xc8, 0x28, 0xaf, 0x20, 0x8a, 0x46, 0x80, 0x0a, 0x22, 0x90, 0x23, 0x9e, 0x57, 0x98, 0x98, 0x22, 0x8b, 0x0e, 0xa2, 0x0a, 0xc5, 0xaf, 0xe5, 0x89, 0x5f, 0xe8, 0xa1, 0x46, 0xf7, 0x4d, 0x14, 0xec, 0x9c, 0x22, 0x5a, 0xfe, 0x77, 0xde, 0xdc, 0x23, 0x50, 0x87, 0x46, 0x94, 0x78, 0x3e, 0xe0, 0x6a, 0xc8, 0x72, 0xf6, 0xce, 0xca, 0xc7, 0xe9, 0x73, 0x40, 0x83, 0x55, 0x45, 0x43, 0xe8, 0x0e, 0x21, 0x42, 0x11, 0xc5, 0x00, 0x89, 0xc4, 0xeb, 0x37, 0x00, 0x59, 0x44, 0x94, 0x00, 0xc6, 0x84, 0x1c, 0x05, 0x50, 0xca, 0x72, 0xbe, 0x10, 0x98, 0xb8, 0x3c, 0x08, 0x45, 0x39, 0x5d, 0x5c, 0x10, 0x03, 0xa3, 0x86, 0xf6, 0xd5, 0x0c, 0xda, 0x6f, 0x67, 0xd0, 0xb0, 0x59, 0x03, 0x19, 0x74, 0x06, 0x9d, 0x60, 0xaa, 0xaa, 0x98, 0xae, 0x01, 0xac, 0x20, 0xce, 0x55, 0x95, 0x90, 0xc4, 0x1e, 0xb8, 0x7c, 0x1f, 0x6c, 0xde, 0x04, 0x18, 0xc4, 0xb0, 0x0f, 0x98, 0xef, 0x03, 0x16, 0x25, 0x49, 0x91, 0x64, 0x99, 0x31, 0xa8, 0x88, 0x82, 0x2c, 0xa5, 0x52, 0x52, 0x82, 0x9e, 0x14, 0x4e, 0x61, 0x41, 0x90, 0x15, 0x29, 0x25, 0xa6, 0x64, 0x05, 0x2a, 0x88, 0x09, 0xfa, 0x30, 0x74, 0xa2, 0xb0, 0xc6, 0x29, 0xc8, 0x65, 0x11, 0x7a, 0xbb, 0x45, 0x2f, 0x12, 0xa0, 0x21, 0x53, 0x0b, 0x99, 0x69, 0x08, 0x7b, 0x4f, 0x6c, 0xbf, 0x06, 0xbc, 0x19, 0x29, 0xd3, 0x04, 0xe6, 0x88, 0x84, 0x44, 0x53, 0x73, 0x9c, 0x84, 0x82, 0xa9, 0x8e, 0xe6, 0xa4, 0x05, 0x01, 0xcd, 0xcd, 0xcf, 0xab, 0x05, 0xc3, 0x94, 0x55, 0x9d, 0x24, 0xda, 0x13, 0xa8, 0x6d, 0x9a, 0xb2, 0x9c, 0x06, 0xb5, 0x30, 0x81, 0x69, 0x0c, 0x5a, 0xc0, 0x78, 0xbe, 0x6e, 0x8f, 0x40, 0x75, 0x34, 0xd9, 0x10, 0x91, 0x4a, 0x20, 0x67, 0xef, 0x09, 0x05, 0xf1, 0x8d, 0x6a, 0x35, 0x32, 0xea, 0x0f, 0xce, 0x69, 0xe3, 0xb8, 0x46, 0xa9, 0xfb, 0x3a, 0xc1, 0x5e, 0x99, 0xd4, 0x6a, 0x36, 0xa9, 0xf1, 0xc3, 0xf1, 0x41, 0xdf, 0x1b, 0xfc, 0x42, 0x26, 0x8d, 0x76, 0x90, 0xf7, 0x86, 0x8d, 0x32, 0x1d, 0x81, 0xb4, 0x51, 0xab, 0xe1, 0x86, 0x6d, 0xf3, 0x79, 0x7a, 0x1e, 0x42, 0xab, 0xbf, 0xa0, 0xd4, 0x6f, 0x53, 0xba, 0xd0, 0x47, 0xa8, 0x0c, 0xef, 0xb5, 0x80, 0x10, 0xdb, 0xe6, 0x0c, 0xb0, 0x3a, 0xd5, 0x06, 0xc2, 0x75, 0x3a, 0xa4, 0x0d, 0x8c, 0x1a, 0x55, 0x5a, 0xa3, 0xa4, 0xc1, 0x8b, 0x11, 0x67, 0xa8, 0x8f, 0x03, 0xbb, 0x2e, 0x37, 0xdd, 0xb6, 0xdc, 0x70, 0x77, 0xc8, 0x60, 0xf0, 0x0e, 0xc1, 0x8d, 0x10, 0x10, 0x90, 0xe1, 0x90, 0xef, 0xdf, 0xa0, 0x3f, 0x04, 0xe5, 0x7e, 0x00, 0x70, 0x8b, 0x7e, 0xe0, 0x15, 0x1b, 0xa1, 0x37, 0x8c, 0x42, 0xcf, 0x1b, 0x0e, 0x3d, 0x26, 0x1f, 0x0c, 0x10, 0xaa, 0x3f, 0x64, 0x20, 0xd0, 0x82, 0x90, 0x10, 0x34, 0x2d, 0x6c, 0xc0, 0x73, 0x83, 0x70, 0xae, 0x01, 0x4c, 0x9f, 0x42, 0x58, 0x77, 0x03, 0xd6, 0xdf, 0x87, 0x7d, 0xa0, 0xe3, 0x7d, 0xa0, 0x9c, 0x3f, 0x4d, 0x23, 0x4a, 0x36, 0xb7, 0x90, 0xb2, 0x88, 0x28, 0xe4, 0xb2, 0x22, 0x5e, 0xd0, 0x12, 0x9a, 0xa3, 0xcd, 0xdb, 0x24, 0xb7, 0xa0, 0x88, 0x59, 0x8d, 0xbc, 0x98, 0x15, 0x65, 0x90, 0x8a, 0x09, 0x79, 0x5e, 0xd3, 0xf2, 0x39, 0x65, 0x2e, 0x67, 0xc9, 0x16, 0xc9, 0x82, 0x1e, 0xe7, 0x99, 0xa1, 0x4e, 0xeb, 0x47, 0x3e, 0xaf, 0x2b, 0x4b, 0x4b, 0x0b, 0x72, 0xd6, 0xe2, 0xb0, 0x17, 0xb2, 0x04, 0xa9, 0xb1, 0x49, 0xf2, 0xfe, 0x0d, 0x45, 0xcb, 0x65, 0xe7, 0x8c, 0xa5, 0x85, 0x79, 0x41, 0x78, 0xc1, 0x34, 0x35, 0x73, 0x5e, 0x9b, 0x6e, 0x2f, 0xd8, 0xb6, 0x05, 0x0e, 0x49, 0x9c, 0xd3, 0xf5, 0x45, 0x53, 0x10, 0xcc, 0x79, 0x5b, 0x48, 0xf4, 0x6f, 0xda, 0xf6, 0xa2, 0x09, 0xaa, 0xb7, 0x24, 0xab, 0x92, 0x29, 0xcf, 0xcd, 0x99, 0x3a, 0x36, 0x13, 0xed, 0x0b, 0x19, 0x4d, 0xc8, 0x66, 0xa1, 0x65, 0xce, 0x44, 0x66, 0xce, 0x70, 0xcc, 0x45, 0x2d, 0xc9, 0xbf, 0xe5, 0x47, 0xab, 0x2b, 0xe1, 0x87, 0x25, 0x5b, 0xfa, 0xb0, 0xb8, 0x2c, 0x7d, 0xda, 0x6b, 0xbd, 0x8d, 0x3f, 0x1b, 0x0d, 0xfd, 0x56, 0xcd, 0xe7, 0x24, 0x0d, 0x06, 0x7e, 0x56, 0x96, 0xc3, 0xa2, 0x6d, 0x4b, 0x4d, 0x51, 0x3c, 0x3d, 0x95, 0xa4, 0xbd, 0xda, 0x48, 0x1a, 0x39, 0x23, 0x89, 0xf3, 0x53, 0x37, 0xdc, 0x3a, 0xa0, 0x0d, 0x16, 0x5f, 0x19, 0x52, 0xcf, 0x1e, 0x11, 0xcf, 0x69, 0x91, 0xf2, 0x9b, 0x2d, 0x52, 0x3b, 0x05, 0xef, 0x85, 0xe4, 0x95, 0x3a, 0x05, 0xac, 0xe0, 0x4a, 0xaf, 0x29, 0x06, 0xc3, 0x96, 0x34, 0xfa, 0xec, 0x74, 0x74, 0x78, 0x5a, 0x1b, 0xb5, 0x5a, 0x36, 0x5f, 0x7f, 0xd5, 0xea, 0xe7, 0xea, 0x2b, 0xf5, 0xa5, 0xfa, 0x8a, 0x2c, 0x0c, 0x03, 0xac, 0x85, 0x21, 0x46, 0x61, 0x18, 0xa2, 0x30, 0x18, 0x30, 0xb9, 0x35, 0x18, 0xf4, 0x57, 0x64, 0xb9, 0x5e, 0x07, 0x05, 0x08, 0x41, 0xe7, 0x42, 0x8c, 0x23, 0x40, 0x18, 0x0c, 0x31, 0x97, 0xd7, 0x55, 0xa3, 0x0e, 0x58, 0x01, 0x64, 0x61, 0xfc, 0x20, 0xa4, 0x5e, 0x14, 0xd2, 0x4d, 0x40, 0x10, 0x71, 0xfd, 0xe9, 0xd6, 0xab, 0x72, 0xf7, 0x71, 0x5d, 0x1e, 0x3c, 0xae, 0xe3, 0x27, 0x3b, 0x21, 0x0e, 0x23, 0x8e, 0x20, 0x0c, 0xf9, 0xfa, 0x34, 0xa2, 0x59, 0xb9, 0x85, 0x9c, 0x48, 0x16, 0x2c, 0x22, 0x2f, 0x10, 0x13, 0x93, 0xac, 0x86, 0xbc, 0x29, 0xff, 0x9b, 0x5f, 0x58, 0x50, 0x72, 0xb9, 0x9c, 0x9c, 0xcd, 0x5a, 0x0c, 0xe0, 0x5b, 0xb2, 0x09, 0xfe, 0xf3, 0x36, 0x9e, 0xcf, 0xcd, 0x89, 0x32, 0x95, 0xc5, 0xb4, 0xb1, 0x20, 0xce, 0x91, 0xa4, 0xfd, 0x22, 0x09, 0xfc, 0xbd, 0x08, 0xe7, 0x06, 0x58, 0xa4, 0xcc, 0xac, 0x52, 0x82, 0x93, 0x60, 0x2a, 0xcd, 0x83, 0x82, 0x99, 0x82, 0x29, 0xcc, 0x9b, 0xf3, 0x69, 0x41, 0x35, 0x0d, 0x21, 0x6f, 0xea, 0xd3, 0x72, 0xc7, 0x34, 0x81, 0x37, 0xb0, 0x70, 0x73, 0xc1, 0x94, 0x8d, 0x85, 0xac, 0xac, 0x65, 0x0b, 0x09, 0xfe, 0x4d, 0x87, 0x98, 0xa6, 0x2a, 0xa7, 0xc1, 0xbf, 0x9b, 0x60, 0xdb, 0xa6, 0xec, 0x24, 0xf4, 0x53, 0xc0, 0x32, 0x94, 0xc2, 0x11, 0x03, 0x52, 0x15, 0xac, 0xc1, 0xc0, 0xc8, 0x4e, 0xf0, 0x4f, 0x7d, 0xbf, 0xbd, 0xd2, 0x6e, 0x46, 0xcd, 0x88, 0x0c, 0x5b, 0x81, 0x57, 0x3b, 0xad, 0xed, 0x4a, 0xb5, 0x53, 0x60, 0xb7, 0x15, 0x30, 0xaf, 0x3d, 0xaa, 0x3f, 0x7c, 0xa8, 0x02, 0xc8, 0xc3, 0xe5, 0x26, 0x69, 0x96, 0x0f, 0x71, 0xcb, 0xa9, 0xe1, 0x9a, 0x5e, 0xc3, 0x76, 0xaa, 0xcc, 0xda, 0x3f, 0xdc, 0x1d, 0x1c, 0x2f, 0x6f, 0x3c, 0x30, 0xb6, 0x5e, 0xf4, 0xa8, 0x45, 0x08, 0xb5, 0x31, 0x26, 0xaf, 0xe3, 0x11, 0x29, 0xe3, 0x11, 0xdf, 0x5f, 0xa9, 0x4a, 0x11, 0x76, 0x7d, 0x44, 0xdc, 0x08, 0x51, 0x2f, 0xf6, 0x17, 0x0d, 0xc0, 0xe7, 0x3e, 0xaa, 0xf1, 0xf1, 0x81, 0xff, 0x3a, 0xf0, 0x0f, 0x90, 0xc3, 0x30, 0xa8, 0x02, 0x2f, 0x0d, 0xbc, 0x13, 0x46, 0xd8, 0x0f, 0x03, 0xe6, 0xb5, 0x07, 0x20, 0x31, 0x38, 0x40, 0x91, 0xc2, 0xe2, 0x0e, 0x0d, 0xf3, 0x43, 0x1a, 0xda, 0x3d, 0xea, 0x93, 0x90, 0xf3, 0x5f, 0x1f, 0x68, 0xf5, 0x7a, 0x1b, 0xb7, 0x43, 0x0f, 0x9a, 0x50, 0xfc, 0x8e, 0x4f, 0x70, 0x48, 0x35, 0xc0, 0x50, 0x1b, 0x3b, 0x58, 0x24, 0x90, 0x34, 0x12, 0x89, 0x89, 0x64, 0xd8, 0x19, 0x15, 0x60, 0x00, 0x5c, 0x8d, 0xfb, 0x05, 0xc4, 0xce, 0x63, 0x59, 0xc2, 0x70, 0x24, 0xa4, 0x15, 0xa4, 0xa4, 0x05, 0xa4, 0xa5, 0xb4, 0xa4, 0xff, 0x26, 0x08, 0x63, 0x38, 0x1b, 0x94, 0x94, 0xa2, 0x48, 0x62, 0x4a, 0xd3, 0xf8, 0xb1, 0x75, 0x7d, 0x46, 0x88, 0xa2, 0x2c, 0x02, 0xe1, 0xe9, 0xb4, 0x88, 0x71, 0x1a, 0x2e, 0x07, 0x77, 0xe6, 0x95, 0x3b, 0x53, 0xee, 0x97, 0x1f, 0x06, 0xa2, 0x06, 0x1d, 0xe4, 0xd3, 0x8a, 0xb8, 0x90, 0x56, 0x52, 0xe6, 0x5c, 0xc2, 0x7f, 0xb3, 0xdb, 0x80, 0x9c, 0x9f, 0xb7, 0x80, 0x48, 0x81, 0x23, 0x3f, 0x6f, 0x27, 0x0f, 0x6f, 0x0b, 0xe5, 0x09, 0xca, 0x9b, 0x4b, 0xa0, 0x09, 0x82, 0x08, 0xea, 0x26, 0x32, 0xe7, 0x71, 0x3d, 0x47, 0x41, 0x36, 0x84, 0x79, 0xa6, 0x06, 0x98, 0xce, 0x83, 0x82, 0x98, 0x26, 0x68, 0xc3, 0x94, 0x98, 0xcf, 0x44, 0xbc, 0xa3, 0x6b, 0x62, 0xd6, 0x10, 0x50, 0xce, 0x34, 0xac, 0x9c, 0x99, 0x58, 0x1f, 0x85, 0x15, 0x32, 0x78, 0x1f, 0xd9, 0x3e, 0x6a, 0x2e, 0x63, 0xd4, 0x2a, 0xa7, 0x50, 0x0d, 0x7c, 0x7f, 0xe0, 0xf0, 0x79, 0x3c, 0x00, 0x63, 0x78, 0x00, 0xbe, 0xaa, 0xef, 0x93, 0x7e, 0x14, 0x5a, 0x51, 0x6b, 0x84, 0x07, 0xa3, 0x14, 0xf6, 0xc0, 0x54, 0xd9, 0xfe, 0x39, 0xb2, 0xe1, 0xb2, 0x03, 0x47, 0x0e, 0xc0, 0xee, 0x98, 0x0f, 0x68, 0x59, 0x55, 0xb0, 0x7f, 0x0a, 0xf6, 0xef, 0x80, 0xfd, 0xeb, 0xfc, 0xf2, 0xc1, 0x1c, 0x2d, 0xbd, 0x7f, 0xdf, 0x27, 0xbd, 0x28, 0x22, 0x87, 0xad, 0x32, 0xa0, 0x46, 0xc7, 0xf6, 0xcf, 0xf7, 0x9f, 0xcd, 0xd2, 0x87, 0xf1, 0x5d, 0x18, 0xdf, 0x2f, 0x6a, 0xa8, 0x08, 0x08, 0x6c, 0x3f, 0x3e, 0xb8, 0xab, 0x00, 0x19, 0xf9, 0x96, 0x6d, 0x2d, 0x2f, 0xcb, 0xcb, 0xc5, 0x80, 0x6c, 0x16, 0x31, 0xf1, 0x7d, 0x8b, 0x30, 0x2b, 0xb5, 0xd8, 0xd8, 0x32, 0xf5, 0x56, 0xa0, 0xb2, 0xcf, 0x7c, 0xd1, 0x63, 0xea, 0x3d, 0x8e, 0xb1, 0xf9, 0x18, 0xc4, 0xdc, 0xcb, 0x72, 0x10, 0xbf, 0xaa, 0x6e, 0xd5, 0xeb, 0xf4, 0x09, 0x88, 0x62, 0x54, 0xaf, 0x7d, 0x34, 0x9e, 0x27, 0xc0, 0x0e, 0x68, 0x80, 0xa8, 0xa6, 0x34, 0x38, 0xaf, 0x65, 0x94, 0xd8, 0xbf, 0x94, 0xb2, 0xb8, 0x28, 0x2a, 0x73, 0x73, 0xa2, 0x92, 0x9e, 0x27, 0x70, 0x9a, 0xde, 0xba, 0x5f, 0xe1, 0xf4, 0xbc, 0x2e, 0xe6, 0x14, 0x59, 0x92, 0xf1, 0xc2, 0xc3, 0x3b, 0xb2, 0x8e, 0xa7, 0xe8, 0x47, 0xa2, 0xc4, 0x74, 0x04, 0x34, 0x04, 0x4b, 0xdc, 0x07, 0x88, 0xd2, 0x37, 0x2f, 0x87, 0xf3, 0x79, 0xdd, 0x36, 0x4d, 0x43, 0x02, 0x82, 0xe9, 0x7c, 0x5e, 0xd0, 0x05, 0x23, 0x39, 0xfe, 0xc4, 0x07, 0x88, 0x60, 0xff, 0xd6, 0x2d, 0xfb, 0x67, 0x2e, 0x1a, 0x7c, 0x80, 0x9c, 0x36, 0x55, 0xd1, 0xcc, 0x83, 0xfd, 0x1b, 0x60, 0xff, 0x53, 0x33, 0x64, 0xd7, 0x55, 0x59, 0xce, 0x22, 0x59, 0x65, 0x3e, 0x20, 0x7e, 0xff, 0xb6, 0x74, 0xff, 0x6f, 0xee, 0x57, 0xa3, 0x28, 0xc2, 0xc3, 0xa1, 0x44, 0x1d, 0x5f, 0xaa, 0x49, 0x9e, 0xe4, 0x48, 0x1e, 0xba, 0xe6, 0x2f, 0x60, 0x3e, 0xa0, 0xd9, 0xfc, 0x04, 0xb7, 0xca, 0x35, 0xbb, 0xe6, 0xbc, 0x6e, 0x05, 0x5a, 0x66, 0xdc, 0x94, 0xf1, 0x40, 0xff, 0xbe, 0x39, 0xa0, 0xdd, 0xa6, 0x4b, 0xaa, 0x01, 0xa5, 0x81, 0x35, 0xa0, 0x7b, 0x04, 0xce, 0x67, 0x1c, 0xdb, 0x9a, 0x41, 0x7b, 0x70, 0x47, 0x7c, 0x93, 0xdb, 0x3f, 0x5c, 0xfe, 0x62, 0x24, 0xef, 0x67, 0xc8, 0x07, 0xfe, 0xeb, 0xcb, 0xcb, 0xf8, 0xf1, 0x26, 0xa6, 0x80, 0x65, 0xdf, 0xc7, 0xb6, 0xec, 0x4e, 0x6c, 0x10, 0xc6, 0x5f, 0x06, 0xf6, 0x8b, 0xc5, 0x35, 0x52, 0x2c, 0xbe, 0x42, 0x8a, 0x56, 0x50, 0xb5, 0xd4, 0xca, 0xb5, 0x0a, 0x43, 0x77, 0x8f, 0xeb, 0x03, 0x52, 0x6d, 0xb7, 0xb1, 0xd1, 0xf6, 0x48, 0xb5, 0x4f, 0x49, 0xbb, 0x31, 0xe0, 0xe7, 0xbb, 0x8a, 0x63, 0x9b, 0xe7, 0xa0, 0xef, 0x42, 0xbe, 0x1a, 0x3f, 0xe3, 0x59, 0xe8, 0x33, 0x4b, 0xb3, 0x34, 0x8b, 0xff, 0x7f, 0xe2, 0xf8, 0x9f, 0x40, 0xfc, 0x4f, 0x20, 0xfe, 0x27, 0xe3, 0xf8, 0x9f, 0xfc, 0x78, 0xf1, 0xff, 0x74, 0xdc, 0x7b, 0x73, 0x01, 0xa8, 0x54, 0x62, 0x8c, 0xe3, 0x7f, 0x3a, 0x8e, 0xff, 0xe9, 0xf7, 0x8c, 0xff, 0x8d, 0xff, 0x63, 0xfc, 0x8f, 0x56, 0xa1, 0x03, 0x86, 0x6c, 0x16, 0xa4, 0x01, 0xcc, 0x34, 0xcb, 0x63, 0xb6, 0x38, 0x67, 0x67, 0xb7, 0xea, 0x6b, 0xaa, 0x9a, 0x5e, 0xcb, 0xca, 0x3e, 0x5c, 0x84, 0xf6, 0xf7, 0x97, 0xd1, 0x27, 0x4f, 0x16, 0x50, 0x70, 0x5c, 0xe2, 0xe7, 0xba, 0xc1, 0x2a, 0xc0, 0x0a, 0x89, 0x07, 0x31, 0xbf, 0xb7, 0x06, 0xb0, 0x02, 0x96, 0xab, 0x06, 0xfb, 0xb9, 0x15, 0xff, 0xb3, 0xee, 0xfc, 0xf8, 0x73, 0x10, 0x03, 0x1e, 0xd5, 0x3f, 0x22, 0xfe, 0x57, 0x20, 0xfe, 0x57, 0x20, 0xfe, 0x4f, 0x41, 0xfc, 0x2f, 0xf3, 0xf8, 0x3f, 0x95, 0xa0, 0x2f, 0x95, 0x8a, 0xe3, 0xff, 0xd4, 0x38, 0xfe, 0x4f, 0xc9, 0xdf, 0x33, 0xfe, 0x27, 0xba, 0x53, 0xd0, 0x28, 0x7d, 0x81, 0x68, 0x24, 0x43, 0xa4, 0x45, 0xcd, 0x76, 0x12, 0xf7, 0x0b, 0x02, 0xf1, 0xbf, 0x26, 0x49, 0xf4, 0x8e, 0xae, 0x13, 0x87, 0x66, 0xb0, 0xaa, 0x6b, 0x89, 0xf9, 0x69, 0x1a, 0xc6, 0x99, 0x0c, 0xc6, 0x1a, 0xdc, 0xa6, 0x32, 0x06, 0xe4, 0x1a, 0xbe, 0x1d, 0xff, 0xdb, 0x10, 0xef, 0xd2, 0xa9, 0xf8, 0x9f, 0xdc, 0xbe, 0xff, 0x47, 0x56, 0x14, 0x9d, 0xdb, 0x8d, 0x06, 0xc4, 0x4f, 0xd5, 0x1e, 0xa5, 0x0d, 0x60, 0x33, 0xf2, 0xe9, 0x90, 0xdf, 0xbf, 0xaa, 0xc3, 0xea, 0xd0, 0xc7, 0xa4, 0x51, 0x09, 0x70, 0xa3, 0xdc, 0x08, 0xbc, 0x11, 0x48, 0xf9, 0x4d, 0xcf, 0xf7, 0x69, 0x7c, 0x6e, 0x23, 0x04, 0xaf, 0x94, 0xc1, 0x87, 0x88, 0x2c, 0x02, 0xa6, 0x23, 0x0f, 0x9e, 0x2d, 0x4a, 0xc7, 0x31, 0xbe, 0x0f, 0xf1, 0x7e, 0x34, 0x8e, 0xff, 0x3d, 0xc8, 0xe9, 0x38, 0xfe, 0xa7, 0xc9, 0x39, 0x34, 0x1b, 0xe7, 0xb4, 0x01, 0xe3, 0x57, 0x61, 0x04, 0x39, 0xf2, 0xfd, 0x78, 0xfc, 0xc9, 0x1c, 0xb6, 0x30, 0x6e, 0x6e, 0x05, 0x15, 0x6f, 0xb3, 0xd1, 0xa3, 0xc3, 0x26, 0x8c, 0x1f, 0xf8, 0x37, 0xed, 0xf9, 0x1c, 0x20, 0x3f, 0x57, 0x8d, 0xa8, 0x1b, 0xcf, 0xc1, 0x6f, 0x4c, 0x05, 0xd9, 0x70, 0x11, 0x04, 0xbe, 0x2b, 0xaa, 0x6f, 0x78, 0x32, 0x72, 0x29, 0xe4, 0xa0, 0x0c, 0xaa, 0x1a, 0x7f, 0x7e, 0x23, 0x61, 0x45, 0x51, 0x04, 0xa0, 0x5d, 0x10, 0x20, 0xc7, 0x8a, 0x94, 0x30, 0x70, 0xd0, 0x07, 0x0c, 0xfc, 0x0b, 0x0a, 0xa8, 0x89, 0xc2, 0xb2, 0x94, 0x80, 0x93, 0xfa, 0x01, 0x71, 0x01, 0x98, 0x28, 0x50, 0x2c, 0x29, 0xe0, 0x4b, 0xe0, 0x21, 0xe1, 0x3f, 0x84, 0x94, 0x24, 0x0a, 0x50, 0x45, 0x50, 0x62, 0xb0, 0xda, 0x49, 0xfe, 0x74, 0x2d, 0x97, 0xc9, 0x64, 0x96, 0x32, 0xba, 0x24, 0x38, 0x99, 0x8c, 0x96, 0xd1, 0x13, 0xfc, 0xeb, 0x8e, 0x63, 0x67, 0x24, 0x49, 0xca, 0xe8, 0x7a, 0x21, 0xc3, 0x32, 0x47, 0x4a, 0xc4, 0x07, 0x19, 0x1b, 0x1a, 0x11, 0x7a, 0xc7, 0x21, 0x34, 0x95, 0x21, 0x85, 0x3b, 0x19, 0xfb, 0xfa, 0x5e, 0x16, 0xcf, 0x1f, 0xe2, 0x7f, 0xc9, 0x79, 0x21, 0x23, 0x39, 0x4e, 0x46, 0xca, 0x15, 0x32, 0x8e, 0x99, 0x49, 0xc6, 0xff, 0x7e, 0xd0, 0x87, 0x7b, 0x1f, 0xf9, 0x10, 0xee, 0x7e, 0x1f, 0xc2, 0xa5, 0xfe, 0x53, 0xc8, 0x31, 0xbc, 0xfb, 0x51, 0xd0, 0xe7, 0xfe, 0x67, 0x38, 0xf4, 0x2b, 0xac, 0x04, 0xc3, 0x2f, 0xdb, 0x3e, 0x67, 0x52, 0xf6, 0x6e, 0x8f, 0xe3, 0xef, 0xc8, 0x6f, 0xb4, 0x22, 0xda, 0x28, 0x03, 0x0a, 0x40, 0xb1, 0xce, 0xf2, 0x88, 0x46, 0x65, 0x20, 0xb0, 0xc5, 0xf7, 0xb7, 0xd5, 0xf2, 0xf1, 0xc5, 0x5e, 0x84, 0x47, 0x47, 0x11, 0x3e, 0xfc, 0x2c, 0xc2, 0xad, 0x53, 0x40, 0x2b, 0x1a, 0x42, 0x79, 0xec, 0x7f, 0x1c, 0xbf, 0x5a, 0x2d, 0x46, 0xf5, 0xad, 0x9a, 0x74, 0xb2, 0x15, 0x4a, 0x7f, 0x19, 0x84, 0xd2, 0x27, 0x9b, 0xe1, 0xde, 0x93, 0xd3, 0x1a, 0x8f, 0xcf, 0x9c, 0xd1, 0xc8, 0x2f, 0x86, 0x2c, 0x68, 0xc7, 0x52, 0x18, 0x04, 0xa7, 0x90, 0xb7, 0xc2, 0x10, 0xef, 0xd5, 0x46, 0x3a, 0x97, 0xbf, 0xec, 0xf7, 0xf7, 0x58, 0xdc, 0x11, 0xb1, 0xcf, 0x1e, 0xa8, 0x57, 0x8b, 0x9f, 0xcb, 0x95, 0x3d, 0xdf, 0xde, 0xe3, 0xfb, 0xb7, 0x77, 0xe1, 0xe3, 0x1e, 0xbb, 0xd8, 0xf6, 0x1e, 0xc1, 0xe5, 0xf6, 0x11, 0xde, 0x39, 0x7f, 0x04, 0xdd, 0xbd, 0x3c, 0x7a, 0xf9, 0x65, 0x3b, 0x0e, 0xcf, 0x63, 0xfe, 0x25, 0x20, 0x0e, 0xb8, 0x92, 0x99, 0x02, 0x24, 0xec, 0x1b, 0x84, 0xe2, 0x0d, 0x52, 0xfc, 0x20, 0x98, 0xe6, 0x1f, 0x1c, 0x84, 0xc2, 0x0c, 0x3f, 0xf6, 0x1f, 0x80, 0xd4, 0xf7, 0x8a, 0xff, 0x75, 0x4d, 0xb7, 0x81, 0xfe, 0x14, 0x40, 0xd3, 0x33, 0xba, 0x25, 0x81, 0x02, 0xa0, 0xa9, 0xfb, 0x3f, 0x08, 0x4d, 0x92, 0xc9, 0xe4, 0x00, 0x0e, 0xc9, 0x68, 0x0e, 0xc4, 0x1f, 0x89, 0xfb, 0x7f, 0x26, 0x0f, 0xc5, 0x79, 0x30, 0x6d, 0x1b, 0xcb, 0xe0, 0x3f, 0x00, 0xdf, 0x2f, 0xfe, 0x0f, 0xec, 0xc0, 0x07, 0xb6, 0x22, 0x80, 0x16, 0x94, 0x03, 0x1f, 0x97, 0x2b, 0xc7, 0xf8, 0x4d, 0xb6, 0x5f, 0x11, 0xe7, 0x67, 0x18, 0x45, 0x2d, 0x7a, 0x83, 0x43, 0x1a, 0xf9, 0x23, 0xc0, 0x05, 0xf5, 0x29, 0xe7, 0xf7, 0x8b, 0x2f, 0x46, 0x7e, 0x14, 0x79, 0x10, 0x90, 0x51, 0x42, 0x29, 0x21, 0x3e, 0xc5, 0x24, 0x02, 0xd7, 0xfe, 0x05, 0x1d, 0xc7, 0xff, 0x60, 0xa6, 0xd8, 0x83, 0xf8, 0xdf, 0xfb, 0xf6, 0xf8, 0xbf, 0xe6, 0x3b, 0x76, 0x14, 0x55, 0xca, 0xd1, 0xa3, 0x4a, 0x2a, 0x78, 0x64, 0x07, 0xf8, 0xaf, 0x2a, 0x0d, 0x98, 0x43, 0x4b, 0xb7, 0xf7, 0xf8, 0xe7, 0x0f, 0xb5, 0x97, 0x1e, 0x7d, 0xf0, 0xd7, 0x2f, 0x85, 0x3b, 0x84, 0xa3, 0x08, 0xb0, 0x01, 0xda, 0x8e, 0x6d, 0xe3, 0x57, 0x59, 0xfb, 0xdd, 0xb7, 0x6b, 0xb4, 0x12, 0x6e, 0xa8, 0xfe, 0x2b, 0x54, 0xb5, 0x7c, 0xa2, 0xda, 0x14, 0xab, 0x15, 0xfa, 0x92, 0xfa, 0xc8, 0xaa, 0xa9, 0xdc, 0xc7, 0x80, 0x1b, 0x12, 0x8d, 0x15, 0x24, 0x1b, 0x0f, 0xf9, 0x39, 0x61, 0x00, 0x5c, 0x03, 0x4d, 0x02, 0x1b, 0x9f, 0xc7, 0xdf, 0x12, 0xd8, 0x3c, 0x58, 0x39, 0x90, 0x29, 0xa0, 0x54, 0xd2, 0xfe, 0xe1, 0x74, 0x65, 0xf1, 0x3f, 0x9e, 0xc4, 0xff, 0x18, 0x8b, 0x09, 0xff, 0x2a, 0x80, 0x6b, 0x97, 0xf8, 0x11, 0xc0, 0xec, 0x3f, 0xf6, 0x01, 0xd3, 0xf1, 0x3f, 0x53, 0x26, 0x11, 0x7c, 0x80, 0x98, 0x8a, 0x75, 0xe8, 0xb6, 0xfd, 0x8b, 0x50, 0x43, 0xb6, 0x75, 0x1b, 0x2d, 0x66, 0x52, 0x1c, 0xec, 0x39, 0x11, 0x9f, 0x5b, 0xc8, 0xd6, 0xb0, 0xb6, 0x58, 0x70, 0x16, 0x17, 0x53, 0xd8, 0x81, 0x67, 0x3a, 0x1d, 0xff, 0x4b, 0x84, 0x4a, 0x3a, 0xa8, 0x01, 0xf8, 0x00, 0x1d, 0x00, 0xf9, 0x62, 0x66, 0x3a, 0xfe, 0x67, 0x8b, 0xc1, 0x10, 0xff, 0x63, 0x70, 0x13, 0x18, 0x1c, 0x8d, 0x95, 0xcb, 0xdc, 0x8a, 0xff, 0x31, 0x87, 0xe7, 0x07, 0x3e, 0x6a, 0x44, 0x18, 0x0d, 0x00, 0x11, 0xcb, 0x03, 0xce, 0x5f, 0x03, 0xe2, 0xef, 0x06, 0xb8, 0xf1, 0x81, 0x1f, 0x0c, 0xc0, 0x2d, 0x44, 0xd1, 0x10, 0x80, 0xd9, 0xa7, 0x82, 0x84, 0x9d, 0xe9, 0x3e, 0xa6, 0x1e, 0x66, 0xd1, 0xed, 0x24, 0xfe, 0x67, 0x76, 0xc8, 0x73, 0x0f, 0x08, 0x07, 0x55, 0xa3, 0x93, 0xf8, 0xff, 0x75, 0x70, 0xd8, 0x23, 0xa8, 0x72, 0x08, 0x68, 0x81, 0xc6, 0xb4, 0x62, 0xfd, 0x52, 0x41, 0xaa, 0x52, 0x8c, 0x0c, 0xb7, 0xe2, 0xa3, 0x6e, 0xaf, 0x88, 0xce, 0xf9, 0xf8, 0x45, 0xf4, 0x91, 0x6d, 0xc5, 0xf3, 0xa3, 0x30, 0xfe, 0x0a, 0xea, 0x5a, 0xb8, 0x74, 0x5e, 0x04, 0xff, 0x93, 0x07, 0x5f, 0xf4, 0x0e, 0x1e, 0xf4, 0x7d, 0xcc, 0xc7, 0xb7, 0x08, 0x65, 0x1f, 0x81, 0xe3, 0x8a, 0x46, 0x8b, 0x3d, 0x42, 0xf3, 0x11, 0xa1, 0x41, 0x64, 0xf9, 0x95, 0x88, 0xbc, 0x18, 0xb1, 0xe3, 0x87, 0x19, 0x03, 0xbb, 0x31, 0xe5, 0x2b, 0x79, 0x2b, 0x3f, 0x7c, 0xa5, 0xa8, 0xed, 0x14, 0x8b, 0x18, 0x40, 0xfe, 0xa5, 0x6d, 0x5d, 0xef, 0x21, 0x56, 0x80, 0x5f, 0xee, 0xe0, 0x65, 0x09, 0x2e, 0x7c, 0xc2, 0x37, 0xe2, 0xff, 0x1b, 0xfb, 0x97, 0x6f, 0xd9, 0x3f, 0xdb, 0x5e, 0xe6, 0x16, 0x44, 0x05, 0x4b, 0x0a, 0x5c, 0xad, 0x14, 0x39, 0xf5, 0xbd, 0xe3, 0x7f, 0x1d, 0x38, 0xcf, 0x00, 0xf7, 0x99, 0x45, 0xc9, 0xd2, 0x6d, 0x49, 0x97, 0x28, 0x4a, 0xf0, 0x07, 0xd4, 0x99, 0x70, 0xc8, 0xe7, 0x30, 0xd8, 0xbf, 0x75, 0xcb, 0xfe, 0xd9, 0x19, 0x5b, 0x58, 0x74, 0x64, 0x6d, 0x91, 0x60, 0xe6, 0x03, 0x0a, 0xf4, 0x3b, 0xe2, 0x7f, 0xf2, 0x87, 0xe3, 0xff, 0x00, 0xf8, 0x66, 0xf1, 0x3f, 0xfc, 0x00, 0xd3, 0xb8, 0x01, 0xff, 0x02, 0xb6, 0xc3, 0x64, 0x7c, 0x88, 0x07, 0x60, 0xff, 0x24, 0xc6, 0x21, 0xdc, 0x0e, 0x46, 0xd5, 0x01, 0xad, 0x4c, 0xc7, 0xff, 0xe0, 0xd1, 0x29, 0x90, 0x4e, 0x2c, 0xb8, 0x07, 0x54, 0x7c, 0x42, 0x5b, 0x14, 0xe2, 0x7f, 0x76, 0x37, 0xe4, 0xf7, 0xc3, 0x9b, 0xf8, 0x9f, 0xdd, 0x0a, 0x38, 0x6e, 0xc5, 0xff, 0x95, 0x6e, 0xc5, 0xef, 0x9d, 0x77, 0xd9, 0xd1, 0x53, 0xb5, 0x07, 0xe4, 0x18, 0x37, 0x08, 0x1f, 0x5f, 0x9e, 0x8c, 0x5f, 0x8c, 0x76, 0x20, 0xf6, 0x8f, 0x71, 0x9e, 0xdf, 0xa9, 0x96, 0xb4, 0x57, 0xa6, 0xc7, 0xef, 0x45, 0x01, 0xbf, 0x86, 0xd2, 0x73, 0x42, 0xad, 0x6e, 0x91, 0x9e, 0xc3, 0x5d, 0x05, 0x4c, 0x67, 0x1c, 0xf7, 0x8f, 0xe1, 0x41, 0xec, 0x4f, 0xb3, 0xf1, 0x33, 0x11, 0x3f, 0xb5, 0x51, 0x41, 0x2b, 0x10, 0x33, 0x57, 0xc8, 0x9b, 0x0e, 0x7a, 0xc1, 0x74, 0x0a, 0xf9, 0x42, 0xae, 0x90, 0x98, 0x97, 0xed, 0x38, 0xda, 0x82, 0x89, 0xcc, 0x05, 0xd3, 0xd1, 0x0a, 0x0e, 0x92, 0x0b, 0xba, 0x93, 0xb8, 0x5e, 0x1b, 0xd6, 0xfb, 0x46, 0xd5, 0x42, 0xee, 0x20, 0x78, 0xeb, 0x41, 0x90, 0x45, 0x5f, 0x2f, 0x65, 0xdf, 0xfa, 0xd5, 0x5c, 0x16, 0xbd, 0x91, 0x52, 0xdf, 0xe7, 0x9f, 0xc2, 0x5f, 0x58, 0x01, 0x3e, 0x5c, 0x1e, 0x8d, 0x2e, 0xfe, 0x71, 0x0d, 0x5f, 0xfc, 0x72, 0x0d, 0x5d, 0xfc, 0x6c, 0xcd, 0x3b, 0x14, 0xd7, 0x46, 0x50, 0xee, 0x4d, 0xf7, 0xc3, 0x54, 0xf1, 0x1f, 0x60, 0x9d, 0x5f, 0xfd, 0x13, 0xe0, 0x6b, 0x1d, 0x7d, 0x75, 0x55, 0x43, 0x5f, 0x5e, 0xbd, 0x3c, 0x8b, 0xce, 0x7e, 0xe4, 0x94, 0xd6, 0x35, 0x92, 0x9e, 0x33, 0xb1, 0xbc, 0xe4, 0x38, 0x85, 0x17, 0x0a, 0xb8, 0x60, 0x25, 0x4f, 0x4f, 0x35, 0x47, 0xd4, 0x2c, 0x5c, 0x1e, 0xd3, 0xe6, 0x52, 0xa0, 0x20, 0x7b, 0x49, 0xca, 0x91, 0xb9, 0x1f, 0x72, 0xfc, 0x2f, 0xe1, 0x32, 0xc0, 0xf0, 0x15, 0xd2, 0xd1, 0xbf, 0x01, 0xfe, 0x15, 0xf0, 0xe5, 0x18, 0x5f, 0xa1, 0xd4, 0x8c, 0xa0, 0x1f, 0x39, 0x39, 0x0e, 0xf3, 0x89, 0x44, 0x5d, 0xca, 0x39, 0x4b, 0x4b, 0x39, 0x96, 0xcb, 0x09, 0xfb, 0x76, 0x44, 0x45, 0x77, 0xf0, 0xbc, 0xe1, 0x68, 0x4b, 0x26, 0xe4, 0x02, 0xbc, 0xdb, 0x3f, 0x28, 0xff, 0x57, 0xce, 0x0d, 0x7e, 0xed, 0xa3, 0xcf, 0xa5, 0x1a, 0xfa, 0x2d, 0xa2, 0x33, 0x62, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x66, 0x69, 0x96, 0x7e, 0x80, 0xf4, 0xb5, 0xe3, 0xa0, 0xab, 0x5a, 0x8d, 0xe1, 0x6b, 0x80, 0x78, 0x75, 0x35, 0xc1, 0x08, 0x70, 0x75, 0xfd, 0x77, 0x1c, 0xf6, 0x95, 0xec, 0xeb, 0x6f, 0x92, 0x2e, 0xbf, 0x05, 0x58, 0xe6, 0x88, 0x13, 0xfb, 0x22, 0xfc, 0xef, 0x01, 0xbf, 0x19, 0xe3, 0x8b, 0x71, 0x3e, 0x44, 0xbf, 0x85, 0xdf, 0x5f, 0x05, 0x08, 0x3d, 0x67, 0x63, 0x71, 0x08, 0xe8, 0x0a, 0x49, 0x0c, 0xc2, 0x15, 0xff, 0x7b, 0xd0, 0x2c, 0xfd, 0x94, 0x89, 0x71, 0x7c, 0x35, 0xba, 0x02, 0xee, 0x27, 0xe0, 0x7a, 0x80, 0xae, 0x40, 0x2f, 0xfe, 0x59, 0xd7, 0x39, 0xdf, 0x8c, 0x7b, 0x7d, 0xd9, 0x42, 0xba, 0xb5, 0x8c, 0xf4, 0x6f, 0xed, 0x85, 0xfd, 0x4f, 0x95, 0xdf, 0x5d, 0x01, 0xe7, 0x57, 0xc9, 0x3c, 0xfe, 0x1f, 0x2c, 0x9c, 0x7c, 0x60, 0xfa, 0x39, 0xfb, 0xeb, 0x9f, 0xf8, 0xfc, 0x8a, 0xfd, 0x35, 0x50, 0x04, 0xea, 0xc5, 0x19, 0xfd, 0xff, 0x5f, 0xd2, 0x73, 0xfe, 0xb5, 0x00, 0xc3, 0x88, 0xf3, 0x77, 0x27, 0xf0, 0xae, 0x6d, 0x9f, 0xa5, 0xeb, 0xbf, 0xc6, 0xbc, 0x0f, 0xb8, 0xb8, 0x40, 0x68, 0x79, 0x9a, 0xff, 0xdf, 0xfc, 0x17, 0x00, 0x9c, 0xc0, 0xef, 0x7f, 0x17, 0xe7, 0xec, 0x7d, 0x38, 0x8c, 0xb9, 0xfe, 0xfa, 0x8a, 0x03, 0x03, 0xf7, 0xe0, 0x04, 0x38, 0x9e, 0x4f, 0x7f, 0x47, 0x60, 0x96, 0x7e, 0xb2, 0xe4, 0xbd, 0x0b, 0xbc, 0x4f, 0x30, 0xfe, 0x7a, 0x08, 0xb8, 0x69, 0x2b, 0x75, 0xeb, 0x6f, 0x6f, 0x01, 0x90, 0x6e, 0xad, 0x25, 0xf4, 0x21, 0x69, 0xff, 0xcc, 0xe6, 0x19, 0xef, 0xbf, 0x06, 0xe7, 0xff, 0x1f, 0x7f, 0x07, 0x7a, 0xc0, 0xed, 0x1f, 0x38, 0x26, 0x22, 0x22, 0xb6, 0x88, 0xec, 0x9a, 0x88, 0x6a, 0x84, 0x01, 0x43, 0xd9, 0xf3, 0x2b, 0xf9, 0xbf, 0xd9, 0x77, 0x01, 0x64, 0xe5, 0xcf, 0x69, 0xb3, 0x17, 0x32, 0xd9, 0xdc, 0x5c, 0xf0, 0xa7, 0xf5, 0x01, 0x5b, 0xf6, 0x9f, 0x18, 0xdd, 0xbb, 0xe7, 0x9e, 0x1d, 0x9c, 0x75, 0x3b, 0xf7, 0x5d, 0xf7, 0x61, 0xf7, 0xe0, 0xcc, 0x3d, 0xed, 0xec, 0x3d, 0xed, 0xf4, 0xce, 0xdc, 0x76, 0xe7, 0xe9, 0x91, 0xdb, 0xda, 0x3d, 0x39, 0x4b, 0x43, 0x8d, 0xdd, 0x67, 0x67, 0xfb, 0x47, 0x27, 0xf7, 0xdd, 0x76, 0xbb, 0xd3, 0xed, 0x80, 0xf8, 0x92, 0x15, 0xb6, 0x3b, 0xa7, 0x2d, 0x68, 0xe5, 0xee, 0xec, 0x9e, 0x1c, 0xec, 0x36, 0xbb, 0x1d, 0xf7, 0xe1, 0xbb, 0xef, 0xba, 0x27, 0x9d, 0x5e, 0xbb, 0x73, 0x72, 0xd0, 0xdb, 0x73, 0x59, 0x95, 0xd3, 0xd6, 0xc9, 0xc1, 0xf1, 0xd9, 0x7d, 0xb7, 0xfb, 0x6c, 0x37, 0x9d, 0xfe, 0x60, 0x7b, 0xa3, 0xb2, 0xb6, 0x95, 0x3e, 0x8a, 0xa2, 0xd3, 0xce, 0x99, 0xbb, 0x9d, 0xfe, 0x2c, 0x0d, 0x8d, 0xbd, 0x92, 0xcb, 0xd2, 0x46, 0x9c, 0x6d, 0x96, 0x58, 0xd9, 0x07, 0xec, 0xe5, 0x83, 0xf5, 0x8d, 0x38, 0x63, 0x65, 0x9b, 0x6b, 0x50, 0x06, 0xbf, 0x58, 0x19, 0xcb, 0xa0, 0xec, 0x57, 0xe9, 0xa3, 0xa7, 0xbb, 0xc7, 0xee, 0xb6, 0xfb, 0x99, 0x57, 0xda, 0x28, 0x95, 0x4b, 0x9b, 0xbf, 0x4a, 0xa7, 0xa3, 0x67, 0xbd, 0xd6, 0xd9, 0xc1, 0x51, 0xcf, 0x3d, 0x09, 0x4f, 0x76, 0x9f, 0x76, 0x56, 0xfb, 0xa5, 0xcb, 0xd2, 0x45, 0x69, 0xbf, 0x34, 0x5e, 0x53, 0xe9, 0xf4, 0xec, 0xb2, 0xdb, 0xb9, 0x0b, 0x43, 0x74, 0x8f, 0x5a, 0xbb, 0x5d, 0xf7, 0xb0, 0xd3, 0x61, 0x1d, 0x1c, 0x77, 0x3a, 0x87, 0x5b, 0xab, 0x9b, 0x6b, 0x5e, 0xdf, 0x2b, 0x87, 0x61, 0x75, 0x7d, 0x83, 0xd5, 0x38, 0x3e, 0x3a, 0xec, 0x24, 0x0a, 0x4b, 0x93, 0x9d, 0x61, 0xd2, 0xeb, 0x81, 0x9a, 0xed, 0x93, 0xd5, 0xfe, 0x65, 0xe9, 0xe4, 0x88, 0x17, 0x4f, 0x3a, 0xde, 0x3f, 0xf9, 0x74, 0x7b, 0x15, 0xca, 0x7e, 0xbe, 0x79, 0x77, 0x7b, 0x1b, 0x56, 0x78, 0x00, 0x9b, 0x52, 0x72, 0x5b, 0xbc, 0xc6, 0x41, 0xc4, 0xc4, 0xee, 0xd9, 0x7e, 0xa7, 0xe7, 0xb6, 0xb6, 0xfb, 0x5c, 0xb6, 0x7d, 0x71, 0xaf, 0xcc, 0x85, 0x9d, 0xee, 0x69, 0x07, 0x4a, 0x2f, 0xe3, 0xd2, 0xfd, 0x7b, 0x65, 0x17, 0x72, 0x2e, 0xe1, 0xbf, 0xa2, 0xa3, 0x13, 0xf7, 0x00, 0x3a, 0x64, 0x52, 0xb7, 0x7d, 0xc4, 0xcb, 0x26, 0x63, 0xb6, 0x0e, 0x60, 0x29, 0xad, 0xf5, 0x83, 0xb5, 0xea, 0x7a, 0x35, 0x21, 0x68, 0xbe, 0x07, 0x82, 0xa7, 0xbb, 0x67, 0xfb, 0xaf, 0x9c, 0xec, 0xf6, 0xda, 0x47, 0x4f, 0x57, 0x37, 0x4a, 0x5b, 0x77, 0xc7, 0x35, 0x4e, 0x8f, 0x4f, 0x56, 0xc7, 0x8f, 0xf0, 0xc2, 0x76, 0x67, 0x3d, 0xa6, 0xe7, 0x6f, 0x9b, 0xef, 0xad, 0x6d, 0x7e, 0x5c, 0xba, 0x96, 0xb1, 0x29, 0x43, 0x6b, 0x36, 0x0a, 0xcc, 0x01, 0x56, 0xfc, 0x0d, 0x49, 0xff, 0x92, 0x49, 0x5a, 0x07, 0x37, 0x12, 0xc6, 0x8b, 0x57, 0x62, 0x2c, 0x41, 0x6f, 0x1f, 0xaf, 0xc3, 0x7e, 0x8c, 0x45, 0xf1, 0xe8, 0xf1, 0xca, 0xd8, 0x6f, 0xc8, 0xa6, 0xe6, 0x77, 0xda, 0xe9, 0xb4, 0x57, 0xfb, 0xeb, 0x97, 0x37, 0x3c, 0xf5, 0x37, 0xb7, 0xfb, 0xeb, 0xab, 0x17, 0xf7, 0x36, 0xee, 0xae, 0x55, 0xdd, 0xcb, 0xcd, 0xed, 0xcb, 0xf5, 0xd5, 0x7d, 0xfe, 0xc2, 0x5a, 0xb2, 0x25, 0xf0, 0x99, 0x97, 0x18, 0xdb, 0xde, 0xdd, 0xe9, 0xa2, 0xc9, 0x62, 0xca, 0x1f, 0x97, 0xfa, 0x9b, 0xdf, 0x29, 0x7d, 0x1d, 0xa4, 0x6e, 0xe9, 0x72, 0xf3, 0x3b, 0xc4, 0x6f, 0xc4, 0x8d, 0xc7, 0x62, 0xf8, 0x61, 0x9c, 0x8f, 0xfb, 0xe2, 0x8f, 0x9b, 0xa5, 0xcd, 0xc9, 0x73, 0xbf, 0x54, 0xbe, 0x7e, 0xdc, 0x2c, 0x6d, 0x8c, 0x1b, 0x9c, 0x74, 0x5a, 0x67, 0xb0, 0xa2, 0x6a, 0xe9, 0x12, 0x70, 0xb1, 0x56, 0xbd, 0xb7, 0x51, 0x29, 0xed, 0xc7, 0xd9, 0x77, 0xe9, 0x1a, 0x53, 0xcd, 0xbb, 0x69, 0xbe, 0x39, 0x53, 0x4a, 0x7d, 0xd4, 0x3b, 0x7b, 0x6f, 0xbf, 0xd3, 0x81, 0xce, 0x4a, 0xee, 0xe5, 0xb5, 0x42, 0x96, 0xdc, 0xdd, 0xee, 0xd9, 0x64, 0xea, 0xab, 0x13, 0x2d, 0x5d, 0xdb, 0x5a, 0x87, 0xe2, 0xb5, 0x8d, 0xcd, 0x6a, 0xbc, 0x31, 0x9c, 0x0c, 0xaf, 0xb4, 0x55, 0xaa, 0x7e, 0xa3, 0xdf, 0x27, 0x9d, 0xfe, 0xd9, 0xea, 0x19, 0xfc, 0xe2, 0x35, 0x27, 0xbd, 0x8e, 0x3b, 0xfd, 0x93, 0x4d, 0x05, 0x26, 0x7d, 0xd3, 0xb9, 0x57, 0x7a, 0xad, 0x54, 0x2d, 0x45, 0xbb, 0xa0, 0xe7, 0x30, 0xa1, 0xf1, 0x10, 0x7f, 0x78, 0xfd, 0xcc, 0x8d, 0xc4, 0xdd, 0x9d, 0x72, 0x03, 0xd8, 0x68, 0x1e, 0x1f, 0xbb, 0x0f, 0xdf, 0x76, 0x8f, 0x77, 0xf7, 0x3a, 0xee, 0xee, 0x49, 0xe7, 0x3e, 0xab, 0xf1, 0x46, 0xc9, 0xdd, 0x80, 0x66, 0x1b, 0x65, 0xc0, 0x6b, 0xe9, 0x74, 0x3c, 0x69, 0x36, 0xea, 0xf6, 0xf2, 0x93, 0xfd, 0x8e, 0xfb, 0xcb, 0x67, 0x07, 0xad, 0x43, 0xb7, 0x79, 0x72, 0x74, 0xd1, 0xfb, 0xa8, 0x17, 0x1d, 0xf5, 0xdd, 0x4f, 0x9e, 0x3d, 0x3d, 0x3e, 0x75, 0x8f, 0xce, 0x3b, 0x27, 0x1f, 0xf5, 0xc0, 0x14, 0xdd, 0xee, 0xee, 0xa7, 0x97, 0x60, 0x51, 0x7b, 0x3f, 0x5b, 0x1e, 0xb7, 0x3d, 0xed, 0x74, 0xb7, 0xbd, 0x9b, 0x3d, 0x7a, 0xf2, 0x17, 0x8f, 0x56, 0xd9, 0x54, 0x5b, 0xdd, 0xd3, 0xd5, 0x8d, 0xd7, 0xbe, 0x39, 0x69, 0x0f, 0x26, 0xed, 0xdd, 0x9d, 0x58, 0x2a, 0xd8, 0x78, 0xf3, 0xac, 0x77, 0xbc, 0xea, 0xdd, 0x8d, 0xed, 0x9c, 0x75, 0x06, 0xc4, 0x74, 0x41, 0x69, 0x7f, 0x5e, 0x1d, 0x2b, 0xfe, 0xa4, 0xce, 0xc6, 0xad, 0x3a, 0xeb, 0xd7, 0x75, 0xa0, 0x12, 0xac, 0x8c, 0x2f, 0xf7, 0xec, 0xe8, 0x0c, 0xe6, 0x74, 0x00, 0xae, 0xb5, 0x0f, 0xae, 0x35, 0x3d, 0x37, 0x07, 0x82, 0xe6, 0xb4, 0xb7, 0xde, 0x76, 0x99, 0xd1, 0x8f, 0xdd, 0xde, 0x06, 0xb8, 0x1c, 0x06, 0xb6, 0x29, 0x5b, 0x25, 0xb7, 0xca, 0xde, 0xb6, 0x60, 0x76, 0x73, 0x73, 0x71, 0xcb, 0xad, 0x3f, 0xb2, 0xcb, 0x4d, 0x77, 0xb5, 0xdd, 0x89, 0x76, 0x9f, 0xc5, 0x2c, 0x4d, 0xa9, 0x5f, 0x19, 0x3a, 0x67, 0x80, 0xe9, 0xbe, 0xfa, 0xea, 0x26, 0xcf, 0xc1, 0xd5, 0x5d, 0xf7, 0xcf, 0xa7, 0x1c, 0x6f, 0xe3, 0xa4, 0x7f, 0x77, 0x95, 0xe9, 0xc1, 0xdd, 0x58, 0xce, 0x1e, 0x41, 0x02, 0x9b, 0x0f, 0x94, 0x02, 0x93, 0xcc, 0x7d, 0x84, 0x6f, 0x5f, 0xb3, 0xfc, 0xed, 0xcb, 0x5b, 0xdf, 0x5a, 0x67, 0x8c, 0xb3, 0x89, 0xdc, 0xe8, 0x2b, 0x2c, 0x0c, 0xa6, 0x51, 0x01, 0x30, 0xf9, 0x78, 0x3a, 0x7c, 0x36, 0xdb, 0xdb, 0x1b, 0x5c, 0x7f, 0xdc, 0xf4, 0xff, 0x02, 0x9e, 0xdc, 0xa1, 0x61, \ No newline at end of file +0x78, 0xda, 0xed, 0x5b, 0x5b, 0x6f, 0x23, 0x47, 0x76, 0xae, 0xbe, 0x15, 0x5b, 0x9c, 0x52, 0x5f, 0xc4, 0x8b, 0x4b, 0x66, 0xab, 0xbb, 0x57, 0xd6, 0xd2, 0x1a, 0x89, 0x63, 0xb7, 0x44, 0x99, 0xa6, 0xc7, 0xad, 0xe6, 0x78, 0x86, 0x68, 0x6f, 0x92, 0x89, 0x61, 0xc0, 0x63, 0x39, 0x70, 0x6c, 0x80, 0xe2, 0xa5, 0x25, 0x59, 0x1c, 0x4a, 0x2b, 0xc9, 0x12, 0x65, 0x73, 0x49, 0x04, 0xc8, 0xcf, 0xc8, 0x1f, 0xc8, 0x6f, 0x08, 0x10, 0x18, 0xf0, 0xc3, 0xfe, 0x81, 0x04, 0x08, 0xb0, 0x41, 0xb2, 0xc0, 0x3e, 0xec, 0x63, 0xfc, 0x90, 0x07, 0x23, 0x18, 0x58, 0x39, 0x55, 0x4d, 0x4a, 0x6c, 0x79, 0xbc, 0x58, 0x67, 0x6d, 0x38, 0xc0, 0xb2, 0x46, 0x9f, 0xaa, 0xbb, 0x4e, 0xdd, 0xbf, 0x73, 0x4e, 0xd5, 0xa1, 0x38, 0x26, 0x42, 0x48, 0xf8, 0x1f, 0x07, 0xcd, 0xd2, 0x2c, 0xcd, 0xd2, 0x9f, 0x71, 0x12, 0x15, 0x05, 0x90, 0x42, 0x22, 0x52, 0xe0, 0x6d, 0x92, 0x5f, 0x27, 0x2c, 0x48, 0xa2, 0x24, 0x4b, 0x22, 0x16, 0x53, 0x48, 0x12, 0xa0, 0xaa, 0x8c, 0x13, 0xcd, 0x65, 0x01, 0xba, 0x10, 0x15, 0x11, 0x52, 0x8a, 0xe5, 0xec, 0xfd, 0x39, 0x49, 0xe6, 0x3d, 0x83, 0xcb, 0x11, 0x21, 0x4b, 0x54, 0x91, 0xd3, 0x69, 0x80, 0x03, 0x35, 0xd2, 0xf0, 0x36, 0xc9, 0xaf, 0x93, 0x6d, 0x8a, 0xb2, 0xa2, 0x2a, 0xa2, 0x26, 0xe7, 0x51, 0x56, 0x9c, 0x43, 0xba, 0x99, 0x4f, 0x74, 0xac, 0x8a, 0x32, 0x92, 0xe5, 0x9c, 0x2c, 0xcb, 0x9a, 0xc6, 0x72, 0xf6, 0x7e, 0x2b, 0x19, 0xac, 0x1a, 0xd2, 0x10, 0x13, 0xb0, 0xda, 0x82, 0x98, 0x90, 0x46, 0x2b, 0xc8, 0x28, 0xaf, 0x20, 0x8a, 0x46, 0x80, 0x0a, 0x22, 0x90, 0x23, 0x9e, 0x57, 0x98, 0x98, 0x22, 0x8b, 0x0e, 0xa2, 0x0a, 0xc5, 0xaf, 0xe5, 0x89, 0x5f, 0xe8, 0xa1, 0x46, 0xf7, 0x4d, 0x14, 0xec, 0x9c, 0x22, 0x5a, 0xfe, 0x0f, 0xde, 0xdc, 0x23, 0x50, 0x87, 0x46, 0x94, 0x78, 0x3e, 0xe0, 0x6a, 0xc8, 0x72, 0xf6, 0xce, 0xca, 0xc7, 0xe9, 0x0b, 0x40, 0x83, 0x55, 0x45, 0x43, 0xe8, 0x0e, 0x21, 0x42, 0x11, 0xc5, 0x00, 0x89, 0xc4, 0xeb, 0x37, 0x00, 0x59, 0x44, 0x94, 0x00, 0xc6, 0x84, 0x1c, 0x05, 0x50, 0xca, 0x72, 0xbe, 0x10, 0x98, 0xb8, 0x3c, 0x08, 0x45, 0x39, 0x5d, 0x5c, 0x10, 0x03, 0xa3, 0x86, 0xf6, 0xd5, 0x0c, 0xda, 0x6f, 0x67, 0xd0, 0xb0, 0x59, 0x03, 0x19, 0x74, 0x06, 0x9d, 0x60, 0xaa, 0xaa, 0x98, 0xae, 0x01, 0xac, 0x20, 0xce, 0x55, 0x95, 0x90, 0xc4, 0x1e, 0xb8, 0x7c, 0x1f, 0x6c, 0xde, 0x04, 0x18, 0xc4, 0xb0, 0x0f, 0x98, 0xef, 0x03, 0x16, 0x25, 0x49, 0x91, 0x64, 0x99, 0x31, 0xa8, 0x88, 0x82, 0x2c, 0xa5, 0x52, 0x52, 0x82, 0x9e, 0x14, 0x4e, 0x61, 0x41, 0x90, 0x15, 0x29, 0x25, 0xa6, 0x64, 0x05, 0x2a, 0x88, 0x09, 0xfa, 0x30, 0x74, 0xa2, 0xb0, 0xc6, 0x29, 0xc8, 0x65, 0x11, 0x7a, 0xbb, 0x45, 0x2f, 0x12, 0xa0, 0x21, 0x53, 0x0b, 0x99, 0x69, 0x08, 0x7b, 0x4f, 0x6c, 0xbf, 0x06, 0xbc, 0x19, 0x29, 0xd3, 0x04, 0xe6, 0x88, 0x84, 0x44, 0x53, 0x73, 0x9c, 0x84, 0x82, 0xa9, 0x8e, 0xe6, 0xa4, 0x05, 0x01, 0xcd, 0xcd, 0xcf, 0xab, 0x05, 0xc3, 0x94, 0x55, 0x9d, 0x24, 0xda, 0x13, 0xa8, 0x6d, 0x9a, 0xb2, 0x9c, 0x06, 0xb5, 0x30, 0x81, 0x69, 0x0c, 0x5a, 0xc0, 0x78, 0xbe, 0x6e, 0x8f, 0x40, 0x75, 0x34, 0xd9, 0x10, 0x91, 0x4a, 0x20, 0x67, 0xef, 0x09, 0x05, 0xf1, 0x8d, 0x6a, 0x35, 0x32, 0xea, 0x0f, 0xce, 0x69, 0xe3, 0xb8, 0x46, 0xa9, 0xfb, 0x3a, 0xc1, 0x5e, 0x99, 0xd4, 0x6a, 0x36, 0xa9, 0xf1, 0xc3, 0xf1, 0x41, 0xdf, 0x1b, 0xfc, 0x42, 0x26, 0x8d, 0x76, 0x90, 0xf7, 0x86, 0x8d, 0x32, 0x1d, 0x81, 0xb4, 0x51, 0xab, 0xe1, 0x86, 0x6d, 0xf3, 0x79, 0x7a, 0x1e, 0x42, 0xab, 0xbf, 0xa0, 0xd4, 0x6f, 0x53, 0xba, 0xd0, 0x47, 0xa8, 0x0c, 0xef, 0xb5, 0x80, 0x10, 0xdb, 0xe6, 0x0c, 0xb0, 0x3a, 0xd5, 0x06, 0xc2, 0x75, 0x3a, 0xa4, 0x0d, 0x8c, 0x1a, 0x55, 0x5a, 0xa3, 0xa4, 0xc1, 0x8b, 0x11, 0x67, 0xa8, 0x8f, 0x03, 0xbb, 0x2e, 0x37, 0xdd, 0xb6, 0xdc, 0x70, 0x77, 0xc8, 0x60, 0xf0, 0x0e, 0xc1, 0x8d, 0x10, 0x10, 0x90, 0xe1, 0x90, 0xef, 0xdf, 0xa0, 0x3f, 0x04, 0xe5, 0x7e, 0x00, 0x70, 0x8b, 0x7e, 0xe0, 0x15, 0x1b, 0xa1, 0x37, 0x8c, 0x42, 0xcf, 0x1b, 0x0e, 0x3d, 0x26, 0x1f, 0x0c, 0x10, 0xaa, 0x3f, 0x64, 0x20, 0xd0, 0x82, 0x90, 0x10, 0x34, 0x2d, 0x6c, 0xc0, 0x73, 0x83, 0x70, 0xae, 0x01, 0x4c, 0x9f, 0x42, 0x58, 0x77, 0x03, 0xd6, 0xdf, 0x87, 0x7d, 0xa0, 0xe3, 0x7d, 0xa0, 0x9c, 0x3f, 0x4d, 0x23, 0x4a, 0x36, 0xb7, 0x90, 0xb2, 0x88, 0x28, 0xe4, 0xb2, 0x22, 0x5e, 0xd0, 0x12, 0x9a, 0xa3, 0xcd, 0xdb, 0x24, 0xb7, 0xa0, 0x88, 0x59, 0x8d, 0xbc, 0x98, 0x15, 0x65, 0x90, 0x8a, 0x09, 0x79, 0x5e, 0xd3, 0xf2, 0x39, 0x65, 0x2e, 0x67, 0xc9, 0x16, 0xc9, 0x82, 0x1e, 0xe7, 0x99, 0xa1, 0x4e, 0xeb, 0x47, 0x3e, 0xaf, 0x2b, 0x4b, 0x4b, 0x0b, 0x72, 0xd6, 0xe2, 0xb0, 0x17, 0xb2, 0x04, 0xa9, 0xb1, 0x49, 0xf2, 0xfe, 0x0d, 0x45, 0xcb, 0x65, 0xe7, 0x8c, 0xa5, 0x85, 0x79, 0x41, 0x78, 0xc1, 0x34, 0x35, 0x73, 0x5e, 0x9b, 0x6e, 0x2f, 0xd8, 0xb6, 0x05, 0x0e, 0x49, 0x9c, 0xd3, 0xf5, 0x45, 0x53, 0x10, 0xcc, 0x79, 0x5b, 0x48, 0xf4, 0x6f, 0xda, 0xf6, 0xa2, 0x09, 0xaa, 0xb7, 0x24, 0xab, 0x92, 0x29, 0xcf, 0xcd, 0x99, 0x3a, 0x36, 0x13, 0xed, 0x0b, 0x19, 0x4d, 0xc8, 0x66, 0xa1, 0x65, 0xce, 0x44, 0x66, 0xce, 0x70, 0xcc, 0x45, 0x2d, 0xc9, 0xbf, 0xe5, 0x47, 0xab, 0x2b, 0xe1, 0x87, 0x25, 0x5b, 0xfa, 0xb0, 0xb8, 0x2c, 0x7d, 0xd6, 0x6b, 0xbd, 0x8d, 0x3f, 0x1f, 0x0d, 0xfd, 0x56, 0xcd, 0xe7, 0x24, 0x0d, 0x06, 0x7e, 0x56, 0x96, 0xc3, 0xa2, 0x6d, 0x4b, 0x4d, 0x51, 0x3c, 0x3d, 0x95, 0xa4, 0xbd, 0xda, 0x48, 0x1a, 0x39, 0x23, 0x89, 0xf3, 0x53, 0x37, 0xdc, 0x3a, 0xa0, 0x0d, 0x16, 0x5f, 0x19, 0x52, 0xcf, 0x1e, 0x11, 0xcf, 0x69, 0x91, 0xf2, 0x9b, 0x2d, 0x52, 0x3b, 0x05, 0xef, 0x85, 0xe4, 0x95, 0x3a, 0x05, 0xac, 0xe0, 0x4a, 0xaf, 0x29, 0x06, 0xc3, 0x96, 0x34, 0xfa, 0xfc, 0x74, 0x74, 0x78, 0x5a, 0x1b, 0xb5, 0x5a, 0x36, 0x5f, 0x7f, 0xd5, 0xea, 0xe7, 0xea, 0x2b, 0xf5, 0xa5, 0xfa, 0x8a, 0x2c, 0x0c, 0x03, 0xac, 0x85, 0x21, 0x46, 0x61, 0x18, 0xa2, 0x30, 0x18, 0x30, 0xb9, 0x35, 0x18, 0xf4, 0x57, 0x64, 0xb9, 0x5e, 0x07, 0x05, 0x08, 0x41, 0xe7, 0x42, 0x8c, 0x23, 0x40, 0x18, 0x0c, 0x31, 0x97, 0xd7, 0x55, 0xa3, 0x0e, 0x58, 0x01, 0x64, 0x61, 0xfc, 0x20, 0xa4, 0x5e, 0x14, 0xd2, 0x4d, 0x40, 0x10, 0x71, 0xfd, 0xe9, 0xd6, 0xab, 0x72, 0xf7, 0x71, 0x5d, 0x1e, 0x3c, 0xae, 0xe3, 0x27, 0x3b, 0x21, 0x0e, 0x23, 0x8e, 0x20, 0x0c, 0xf9, 0xfa, 0x34, 0xa2, 0x59, 0xb9, 0x85, 0x9c, 0x48, 0x16, 0x2c, 0x22, 0x2f, 0x10, 0x13, 0x93, 0xac, 0x86, 0xbc, 0x29, 0xff, 0x9b, 0x5f, 0x58, 0x50, 0x72, 0xb9, 0x9c, 0x9c, 0xcd, 0x5a, 0x0c, 0xe0, 0x5b, 0xb2, 0x09, 0xfe, 0xf3, 0x36, 0x9e, 0xcf, 0xcd, 0x89, 0x32, 0x95, 0xc5, 0xb4, 0xb1, 0x20, 0xce, 0x91, 0xa4, 0xfd, 0x22, 0x09, 0xfc, 0xbd, 0x08, 0xe7, 0x06, 0x58, 0xa4, 0xcc, 0xac, 0x52, 0x82, 0x93, 0x60, 0x2a, 0xcd, 0x83, 0x82, 0x99, 0x82, 0x29, 0xcc, 0x9b, 0xf3, 0x69, 0x41, 0x35, 0x0d, 0x21, 0x6f, 0xea, 0xd3, 0x72, 0xc7, 0x34, 0x81, 0x37, 0xb0, 0x70, 0x73, 0xc1, 0x94, 0x8d, 0x85, 0xac, 0xac, 0x65, 0x0b, 0x09, 0xfe, 0x4d, 0x87, 0x98, 0xa6, 0x2a, 0xa7, 0xc1, 0xbf, 0x9b, 0x60, 0xdb, 0xa6, 0xec, 0x24, 0xf4, 0x53, 0xc0, 0x32, 0x94, 0xc2, 0x11, 0x03, 0x52, 0x15, 0xac, 0xc1, 0xc0, 0xc8, 0x4e, 0xf0, 0x4f, 0x7d, 0xbf, 0xbd, 0xd2, 0x6e, 0x46, 0xcd, 0x88, 0x0c, 0x5b, 0x81, 0x57, 0x3b, 0xad, 0xed, 0x4a, 0xb5, 0x53, 0x60, 0xb7, 0x15, 0x30, 0xaf, 0x3d, 0xaa, 0x3f, 0x7c, 0xa8, 0x02, 0xc8, 0xc3, 0xe5, 0x26, 0x69, 0x96, 0x0f, 0x71, 0xcb, 0xa9, 0xe1, 0x9a, 0x5e, 0xc3, 0x76, 0xaa, 0xcc, 0xda, 0x3f, 0xdc, 0x1d, 0x1c, 0x2f, 0x6f, 0x3c, 0x30, 0xb6, 0x5e, 0xf4, 0xa8, 0x45, 0x08, 0xb5, 0x31, 0x26, 0xaf, 0xe3, 0x11, 0x29, 0xe3, 0x11, 0xdf, 0x5f, 0xa9, 0x4a, 0x11, 0x76, 0x7d, 0x44, 0xdc, 0x08, 0x51, 0x2f, 0xf6, 0x17, 0x0d, 0xc0, 0x17, 0x3e, 0xaa, 0xf1, 0xf1, 0x81, 0xff, 0x3a, 0xf0, 0x0f, 0x90, 0xc3, 0x30, 0xa8, 0x02, 0x2f, 0x0d, 0xbc, 0x13, 0x46, 0xd8, 0x0f, 0x03, 0xe6, 0xb5, 0x07, 0x20, 0x31, 0x38, 0x40, 0x91, 0xc2, 0xe2, 0x0e, 0x0d, 0xf3, 0x43, 0x1a, 0xda, 0x3d, 0xea, 0x93, 0x90, 0xf3, 0x5f, 0x1f, 0x68, 0xf5, 0x7a, 0x1b, 0xb7, 0x43, 0x0f, 0x9a, 0x50, 0xfc, 0x8e, 0x4f, 0x70, 0x48, 0x35, 0xc0, 0x50, 0x1b, 0x3b, 0x58, 0x24, 0x90, 0x34, 0x12, 0x89, 0x89, 0x64, 0xd8, 0x19, 0x15, 0x60, 0x00, 0x5c, 0x8d, 0xfb, 0x05, 0xc4, 0xce, 0x63, 0x59, 0xc2, 0x70, 0x24, 0xa4, 0x15, 0xa4, 0xa4, 0x05, 0xa4, 0xa5, 0xb4, 0xa4, 0xff, 0x26, 0x08, 0x63, 0x38, 0x1b, 0x94, 0x94, 0xa2, 0x48, 0x62, 0x4a, 0xd3, 0xf8, 0xb1, 0x75, 0x7d, 0x46, 0x88, 0xa2, 0x2c, 0x02, 0xe1, 0xe9, 0xb4, 0x88, 0x71, 0x1a, 0x2e, 0x07, 0x77, 0xe6, 0x95, 0x3b, 0x53, 0xee, 0x97, 0x1f, 0x06, 0xa2, 0x06, 0x1d, 0xe4, 0xd3, 0x8a, 0xb8, 0x90, 0x56, 0x52, 0xe6, 0x5c, 0xc2, 0x7f, 0xb3, 0xdb, 0x80, 0x9c, 0x9f, 0xb7, 0x80, 0x48, 0x81, 0x23, 0x3f, 0x6f, 0x27, 0x0f, 0x6f, 0x0b, 0xe5, 0x09, 0xca, 0x9b, 0x4b, 0xa0, 0x09, 0x82, 0x08, 0xea, 0x26, 0x32, 0xe7, 0x71, 0x3d, 0x47, 0x41, 0x36, 0x84, 0x79, 0xa6, 0x06, 0x98, 0xce, 0x83, 0x82, 0x98, 0x26, 0x68, 0xc3, 0x94, 0x98, 0xcf, 0x44, 0xbc, 0xa3, 0x6b, 0x62, 0xd6, 0x10, 0x50, 0xce, 0x34, 0xac, 0x9c, 0x99, 0x58, 0x1f, 0x85, 0x15, 0x32, 0x78, 0x1f, 0xd9, 0x3e, 0x6a, 0x2e, 0x63, 0xd4, 0x2a, 0xa7, 0x50, 0x0d, 0x7c, 0x7f, 0xe0, 0xf0, 0x79, 0x3c, 0x00, 0x63, 0x78, 0x00, 0xbe, 0xaa, 0xef, 0x93, 0x7e, 0x14, 0x5a, 0x51, 0x6b, 0x84, 0x07, 0xa3, 0x14, 0xf6, 0xc0, 0x54, 0xd9, 0xfe, 0x39, 0xb2, 0xe1, 0xb2, 0x03, 0x47, 0x0e, 0xc0, 0xee, 0x98, 0x0f, 0x68, 0x59, 0x55, 0xb0, 0x7f, 0x0a, 0xf6, 0xef, 0x80, 0xfd, 0xeb, 0xfc, 0xf2, 0xc1, 0x1c, 0x2d, 0xbd, 0x7f, 0xdf, 0x27, 0xbd, 0x28, 0x22, 0x87, 0xad, 0x32, 0xa0, 0x46, 0xc7, 0xf6, 0xcf, 0xf7, 0x9f, 0xcd, 0xd2, 0x87, 0xf1, 0x5d, 0x18, 0xdf, 0x2f, 0x6a, 0xa8, 0x08, 0x08, 0x6c, 0x3f, 0x3e, 0xb8, 0xab, 0x00, 0x19, 0xf9, 0x96, 0x6d, 0x2d, 0x2f, 0xcb, 0xcb, 0xc5, 0x80, 0x6c, 0x16, 0x31, 0xf1, 0x7d, 0x8b, 0x30, 0x2b, 0xb5, 0xd8, 0xd8, 0x32, 0xf5, 0x56, 0xa0, 0xb2, 0xcf, 0x7c, 0xd1, 0x63, 0xea, 0x3d, 0x8e, 0xb1, 0xf9, 0x18, 0xc4, 0xdc, 0xcb, 0x72, 0x10, 0xbf, 0xaa, 0x6e, 0xd5, 0xeb, 0xf4, 0x09, 0x88, 0x62, 0x54, 0xaf, 0x7d, 0x34, 0x9e, 0x27, 0xc0, 0x0e, 0x68, 0x80, 0xa8, 0xa6, 0x34, 0x38, 0xaf, 0x65, 0x94, 0xd8, 0xbf, 0x94, 0xb2, 0xb8, 0x28, 0x2a, 0x73, 0x73, 0xa2, 0x92, 0x9e, 0x27, 0x70, 0x9a, 0xde, 0xba, 0x5f, 0xe1, 0xf4, 0xbc, 0x2e, 0xe6, 0x14, 0x59, 0x92, 0xf1, 0xc2, 0xc3, 0x3b, 0xb2, 0x8e, 0xa7, 0xe8, 0x47, 0xa2, 0xc4, 0x74, 0x04, 0x34, 0x04, 0x4b, 0xdc, 0x07, 0x88, 0xd2, 0xb7, 0x2f, 0x87, 0xf3, 0x79, 0xdd, 0x36, 0x4d, 0x43, 0x02, 0x82, 0xe9, 0x7c, 0x5e, 0xd0, 0x05, 0x23, 0x39, 0xfe, 0xc4, 0x07, 0x88, 0x60, 0xff, 0xd6, 0x2d, 0xfb, 0x67, 0x2e, 0x1a, 0x7c, 0x80, 0x9c, 0x36, 0x55, 0xd1, 0xcc, 0x83, 0xfd, 0x1b, 0x60, 0xff, 0x53, 0x33, 0x64, 0xd7, 0x55, 0x59, 0xce, 0x22, 0x59, 0x65, 0x3e, 0x20, 0x7e, 0x7f, 0x5e, 0xba, 0xff, 0x37, 0xf7, 0xab, 0x51, 0x14, 0xe1, 0xe1, 0x50, 0xa2, 0x8e, 0x2f, 0xd5, 0x24, 0x4f, 0x72, 0x24, 0x0f, 0x5d, 0xf3, 0x17, 0x30, 0x1f, 0xd0, 0x6c, 0x7e, 0x82, 0x5b, 0xe5, 0x9a, 0x5d, 0x73, 0x5e, 0xb7, 0x02, 0x2d, 0x33, 0x6e, 0xca, 0x78, 0xa0, 0x7f, 0xdf, 0x1c, 0xd0, 0x6e, 0xd3, 0x25, 0xd5, 0x80, 0xd2, 0xc0, 0x1a, 0xd0, 0x3d, 0x02, 0xe7, 0x33, 0x8e, 0x6d, 0xcd, 0xa0, 0x3d, 0xb8, 0x23, 0xbe, 0xc9, 0xed, 0x1f, 0x2e, 0x7f, 0x31, 0x92, 0xf7, 0x33, 0xe4, 0x03, 0xff, 0xf5, 0xe5, 0x65, 0xfc, 0x78, 0x13, 0x53, 0xc0, 0xb2, 0xef, 0x63, 0x5b, 0x76, 0x27, 0x36, 0x08, 0xe3, 0x2f, 0x03, 0xfb, 0xc5, 0xe2, 0x1a, 0x29, 0x16, 0x5f, 0x21, 0x45, 0x2b, 0xa8, 0x5a, 0x6a, 0xe5, 0x5a, 0x85, 0xa1, 0xbb, 0xc7, 0xf5, 0x01, 0xa9, 0xb6, 0xdb, 0xd8, 0x68, 0x7b, 0xa4, 0xda, 0xa7, 0xa4, 0xdd, 0x18, 0xf0, 0xf3, 0x5d, 0xc5, 0xb1, 0xcd, 0x73, 0xd0, 0x77, 0x21, 0x5f, 0x8d, 0x9f, 0xf1, 0x2c, 0xf4, 0x99, 0xa5, 0x59, 0x9a, 0xc5, 0xff, 0x3f, 0x71, 0xfc, 0x4f, 0x20, 0xfe, 0x27, 0x10, 0xff, 0x93, 0x71, 0xfc, 0x4f, 0x7e, 0xbc, 0xf8, 0x7f, 0x3a, 0xee, 0xbd, 0xb9, 0x00, 0x54, 0x2a, 0x31, 0xc6, 0xf1, 0x3f, 0x1d, 0xc7, 0xff, 0xf4, 0x7b, 0xc6, 0xff, 0xc6, 0xff, 0x31, 0xfe, 0x47, 0xab, 0xd0, 0x01, 0x43, 0x36, 0x0b, 0xd2, 0x00, 0x66, 0x9a, 0xe5, 0x31, 0x5b, 0x9c, 0xb3, 0xb3, 0x5b, 0xf5, 0x35, 0x55, 0x4d, 0xaf, 0x65, 0x65, 0x1f, 0x2e, 0x42, 0xfb, 0xfb, 0xcb, 0xe8, 0x93, 0x27, 0x0b, 0x28, 0x38, 0x2e, 0xf1, 0x73, 0xdd, 0x60, 0x15, 0x60, 0x85, 0xc4, 0x83, 0x98, 0xdf, 0x5b, 0x03, 0x58, 0x01, 0xcb, 0x55, 0x83, 0xfd, 0xdc, 0x8a, 0xff, 0x59, 0x77, 0x7e, 0xfc, 0x39, 0x88, 0x01, 0x8f, 0xea, 0x1f, 0x11, 0xff, 0x2b, 0x10, 0xff, 0x2b, 0x10, 0xff, 0xa7, 0x20, 0xfe, 0x97, 0x79, 0xfc, 0x9f, 0x4a, 0xd0, 0x97, 0x4a, 0xc5, 0xf1, 0x7f, 0x6a, 0x1c, 0xff, 0xa7, 0xe4, 0xef, 0x19, 0xff, 0x13, 0xdd, 0x29, 0x68, 0x94, 0xbe, 0x40, 0x34, 0x92, 0x21, 0xd2, 0xa2, 0x66, 0x3b, 0x89, 0xfb, 0x05, 0x81, 0xf8, 0x5f, 0x93, 0x24, 0x7a, 0x47, 0xd7, 0x89, 0x43, 0x33, 0x58, 0xd5, 0xb5, 0xc4, 0xfc, 0x34, 0x0d, 0xe3, 0x4c, 0x06, 0x63, 0x0d, 0x6e, 0x53, 0x19, 0x03, 0x72, 0x0d, 0xdf, 0x8e, 0xff, 0x6d, 0x88, 0x77, 0xe9, 0x54, 0xfc, 0x4f, 0x6e, 0xdf, 0xff, 0x23, 0x2b, 0x8a, 0xce, 0xed, 0x46, 0x03, 0xe2, 0xa7, 0x6a, 0x8f, 0xd2, 0x06, 0xb0, 0x19, 0xf9, 0x74, 0xc8, 0xef, 0x5f, 0xd5, 0x61, 0x75, 0xe8, 0x63, 0xd2, 0xa8, 0x04, 0xb8, 0x51, 0x6e, 0x04, 0xde, 0x08, 0xa4, 0xfc, 0xa6, 0xe7, 0xfb, 0x34, 0x3e, 0xb7, 0x11, 0x82, 0x57, 0xca, 0xe0, 0x43, 0x44, 0x16, 0x01, 0xd3, 0x91, 0x07, 0xcf, 0x16, 0xa5, 0xe3, 0x18, 0xdf, 0x87, 0x78, 0x3f, 0x1a, 0xc7, 0xff, 0x1e, 0xe4, 0x74, 0x1c, 0xff, 0xd3, 0xe4, 0x1c, 0x9a, 0x8d, 0x73, 0xda, 0x80, 0xf1, 0xab, 0x30, 0x82, 0x1c, 0xf9, 0x7e, 0x3c, 0xfe, 0x64, 0x0e, 0x5b, 0x18, 0x37, 0xb7, 0x82, 0x8a, 0xb7, 0xd9, 0xe8, 0xd1, 0x61, 0x13, 0xc6, 0x0f, 0xfc, 0x9b, 0xf6, 0x7c, 0x0e, 0x90, 0x9f, 0xab, 0x46, 0xd4, 0x8d, 0xe7, 0xe0, 0x37, 0xa6, 0x82, 0x6c, 0xb8, 0x08, 0x02, 0xdf, 0x15, 0xd5, 0x37, 0x3c, 0x19, 0xb9, 0x14, 0x72, 0x50, 0x06, 0x55, 0x8d, 0x3f, 0xbf, 0x91, 0xb0, 0xa2, 0x28, 0x02, 0xd0, 0x2e, 0x08, 0x90, 0x63, 0x45, 0x4a, 0x18, 0x38, 0xe8, 0x03, 0x06, 0xfe, 0x05, 0x05, 0xd4, 0x44, 0x61, 0x59, 0x4a, 0xc0, 0x49, 0xfd, 0x80, 0xb8, 0x00, 0x4c, 0x14, 0x28, 0x96, 0x14, 0xf0, 0x25, 0xf0, 0x90, 0xf0, 0x1f, 0x42, 0x4a, 0x12, 0x05, 0xa8, 0x22, 0x28, 0x31, 0x58, 0xed, 0x24, 0x7f, 0xba, 0x96, 0xcb, 0x64, 0x32, 0x4b, 0x19, 0x5d, 0x12, 0x9c, 0x4c, 0x46, 0xcb, 0xe8, 0x09, 0xfe, 0x75, 0xc7, 0xb1, 0x33, 0x92, 0x24, 0x65, 0x74, 0xbd, 0x90, 0x61, 0x99, 0x23, 0x25, 0xe2, 0x83, 0x8c, 0x0d, 0x8d, 0x08, 0xbd, 0xe3, 0x10, 0x9a, 0xca, 0x90, 0xc2, 0x9d, 0x8c, 0x7d, 0x7d, 0x2f, 0x8b, 0xe7, 0x0f, 0xf1, 0xbf, 0xe4, 0xbc, 0x90, 0x91, 0x1c, 0x27, 0x23, 0xe5, 0x0a, 0x19, 0xc7, 0xcc, 0x24, 0xe3, 0x7f, 0x3f, 0xe8, 0xc3, 0xbd, 0x8f, 0x7c, 0x08, 0x77, 0xbf, 0x0f, 0xe1, 0x52, 0xff, 0x19, 0xe4, 0x18, 0xde, 0xfd, 0x28, 0xe8, 0x73, 0xff, 0x33, 0x1c, 0xfa, 0x15, 0x56, 0x82, 0xe1, 0x97, 0x6d, 0x9f, 0x33, 0x29, 0x7b, 0xb7, 0xc7, 0xf1, 0x77, 0xe4, 0x37, 0x5a, 0x11, 0x6d, 0x94, 0x01, 0x05, 0xa0, 0x58, 0x67, 0x79, 0x44, 0xa3, 0x32, 0x10, 0xd8, 0xe2, 0xfb, 0xdb, 0x6a, 0xf9, 0xf8, 0x62, 0x2f, 0xc2, 0xa3, 0xa3, 0x08, 0x1f, 0x7e, 0x1e, 0xe1, 0xd6, 0x29, 0xa0, 0x15, 0x0d, 0xa1, 0x3c, 0xf6, 0x3f, 0x8e, 0x5f, 0xad, 0x16, 0xa3, 0xfa, 0x56, 0x4d, 0x3a, 0xd9, 0x0a, 0xa5, 0xbf, 0x0c, 0x42, 0xe9, 0x93, 0xcd, 0x70, 0xef, 0xc9, 0x69, 0x8d, 0xc7, 0x67, 0xce, 0x68, 0xe4, 0x17, 0x43, 0x16, 0xb4, 0x63, 0x29, 0x0c, 0x82, 0x53, 0xc8, 0x5b, 0x61, 0x88, 0xf7, 0x6a, 0x23, 0x9d, 0xcb, 0x5f, 0xf6, 0xfb, 0x7b, 0x2c, 0xee, 0x88, 0xd8, 0x67, 0x0f, 0xd4, 0xab, 0xc5, 0xcf, 0xe5, 0xca, 0x9e, 0x6f, 0xef, 0xf1, 0xfd, 0xdb, 0xbb, 0xf0, 0x71, 0x8f, 0x5d, 0x6c, 0x7b, 0x8f, 0xe0, 0x72, 0xfb, 0x08, 0xef, 0x9c, 0x3f, 0x82, 0xee, 0x5e, 0x1e, 0xbd, 0xfc, 0xb2, 0x1d, 0x87, 0xe7, 0x31, 0xff, 0x12, 0x10, 0x07, 0x5c, 0xc9, 0x4c, 0x01, 0x12, 0xf6, 0x0d, 0x42, 0xf1, 0x06, 0x29, 0x7e, 0x10, 0x4c, 0xf3, 0x0f, 0x0e, 0x42, 0x61, 0x86, 0x1f, 0xfb, 0x0f, 0x40, 0xea, 0x7b, 0xc5, 0xff, 0xba, 0xa6, 0xdb, 0x40, 0x7f, 0x0a, 0xa0, 0xe9, 0x19, 0xdd, 0x92, 0x40, 0x01, 0xd0, 0xd4, 0xfd, 0x1f, 0x84, 0x26, 0xc9, 0x64, 0x72, 0x00, 0x87, 0x64, 0x34, 0x07, 0xe2, 0x8f, 0xc4, 0xfd, 0x3f, 0x93, 0x87, 0xe2, 0x3c, 0x98, 0xb6, 0x8d, 0x65, 0xf0, 0x1f, 0x80, 0xef, 0x17, 0xff, 0x07, 0x76, 0xe0, 0x03, 0x5b, 0x11, 0x40, 0x0b, 0xca, 0x81, 0x8f, 0xcb, 0x95, 0x63, 0xfc, 0x26, 0xdb, 0xaf, 0x88, 0xf3, 0x33, 0x8c, 0xa2, 0x16, 0xbd, 0xc1, 0x21, 0x8d, 0xfc, 0x11, 0xe0, 0x82, 0xfa, 0x94, 0xf3, 0xfb, 0xe5, 0x97, 0x23, 0x3f, 0x8a, 0x3c, 0x08, 0xc8, 0x28, 0xa1, 0x94, 0x10, 0x9f, 0x62, 0x12, 0x81, 0x6b, 0xff, 0x92, 0x8e, 0xe3, 0x7f, 0x30, 0x53, 0xec, 0x41, 0xfc, 0xef, 0x3d, 0x3f, 0xfe, 0xaf, 0xf9, 0x8e, 0x1d, 0x45, 0x95, 0x72, 0xf4, 0xa8, 0x92, 0x0a, 0x1e, 0xd9, 0x01, 0xfe, 0xab, 0x4a, 0x03, 0xe6, 0xd0, 0xd2, 0xed, 0x3d, 0xfe, 0xf9, 0x43, 0xed, 0xa5, 0x47, 0x1f, 0xfc, 0xf5, 0x4b, 0xe1, 0x0e, 0xe1, 0x28, 0x02, 0x6c, 0x80, 0xb6, 0x63, 0xdb, 0xf8, 0x55, 0xd6, 0x7e, 0xf7, 0xed, 0x1a, 0xad, 0x84, 0x1b, 0xaa, 0xff, 0x0a, 0x55, 0x2d, 0x9f, 0xa8, 0x36, 0xc5, 0x6a, 0x85, 0xbe, 0xa4, 0x3e, 0xb2, 0x6a, 0x2a, 0xf7, 0x31, 0xe0, 0x86, 0x44, 0x63, 0x05, 0xc9, 0xc6, 0x43, 0x7e, 0x4e, 0x18, 0x00, 0xd7, 0x40, 0x93, 0xc0, 0xc6, 0xe7, 0xf1, 0xb7, 0x04, 0x36, 0x0f, 0x56, 0x0e, 0x64, 0x0a, 0x28, 0x95, 0xb4, 0x7f, 0x38, 0x5d, 0x59, 0xfc, 0x8f, 0x27, 0xf1, 0x3f, 0xc6, 0x62, 0xc2, 0xbf, 0x0a, 0xe0, 0xda, 0x25, 0x7e, 0x04, 0x30, 0xfb, 0x8f, 0x7d, 0xc0, 0x74, 0xfc, 0xcf, 0x94, 0x49, 0x04, 0x1f, 0x20, 0xa6, 0x62, 0x1d, 0xba, 0x6d, 0xff, 0x22, 0xd4, 0x90, 0x6d, 0xdd, 0x46, 0x8b, 0x99, 0x14, 0x07, 0x7b, 0x4e, 0xc4, 0xe7, 0x16, 0xb2, 0x35, 0xac, 0x2d, 0x16, 0x9c, 0xc5, 0xc5, 0x14, 0x76, 0xe0, 0x99, 0x4e, 0xc7, 0xff, 0x12, 0xa1, 0x92, 0x0e, 0x6a, 0x00, 0x3e, 0x40, 0x07, 0x40, 0xbe, 0x98, 0x99, 0x8e, 0xff, 0xd9, 0x62, 0x30, 0xc4, 0xff, 0x18, 0xdc, 0x04, 0x06, 0x47, 0x63, 0xe5, 0x32, 0xb7, 0xe2, 0x7f, 0xcc, 0xe1, 0xf9, 0x81, 0x8f, 0x1a, 0x11, 0x46, 0x03, 0x40, 0xc4, 0xf2, 0x80, 0xf3, 0xd7, 0x80, 0xf8, 0xbb, 0x01, 0x6e, 0x7c, 0xe0, 0x07, 0x03, 0x70, 0x0b, 0x51, 0x34, 0x04, 0x60, 0xf6, 0xa9, 0x20, 0x61, 0x67, 0xba, 0x8f, 0xa9, 0x87, 0x59, 0x74, 0x3b, 0x89, 0xff, 0x99, 0x1d, 0xf2, 0xdc, 0x03, 0xc2, 0x41, 0xd5, 0xe8, 0x24, 0xfe, 0x7f, 0x1d, 0x1c, 0xf6, 0x08, 0xaa, 0x1c, 0x02, 0x5a, 0xa0, 0x31, 0xad, 0x58, 0xbf, 0x54, 0x90, 0xaa, 0x14, 0x23, 0xc3, 0xad, 0xf8, 0xa8, 0xdb, 0x2b, 0xa2, 0x73, 0x3e, 0x7e, 0x11, 0x7d, 0x64, 0x5b, 0xf1, 0xfc, 0x28, 0x8c, 0xbf, 0x82, 0xba, 0x16, 0x2e, 0x9d, 0x17, 0xc1, 0xff, 0xe4, 0xc1, 0x17, 0xbd, 0x83, 0x07, 0x7d, 0x1f, 0xf3, 0xf1, 0x2d, 0x42, 0xd9, 0x47, 0xe0, 0xb8, 0xa2, 0xd1, 0x62, 0x8f, 0xd0, 0x7c, 0x44, 0x68, 0x10, 0x59, 0x7e, 0x25, 0x22, 0x2f, 0x46, 0xec, 0xf8, 0x61, 0xc6, 0xc0, 0x6e, 0x4c, 0xf9, 0x4a, 0xde, 0xca, 0x0f, 0x5f, 0x29, 0x6a, 0x3b, 0xc5, 0x22, 0x06, 0x90, 0x7f, 0x69, 0x5b, 0xd7, 0x7b, 0x88, 0x15, 0xe0, 0x97, 0x3b, 0x78, 0x59, 0x82, 0x0b, 0x9f, 0xf0, 0xad, 0xf8, 0xff, 0xc6, 0xfe, 0xe5, 0x5b, 0xf6, 0xcf, 0xb6, 0x97, 0xb9, 0x05, 0x51, 0xc1, 0x92, 0x02, 0x57, 0x2b, 0x45, 0x4e, 0x7d, 0xef, 0xf8, 0x5f, 0x07, 0xce, 0x33, 0xc0, 0x7d, 0x66, 0x51, 0xb2, 0x74, 0x5b, 0xd2, 0x25, 0x8a, 0x12, 0xfc, 0x01, 0x75, 0x26, 0x1c, 0xf2, 0x39, 0x0c, 0xf6, 0x6f, 0xdd, 0xb2, 0x7f, 0x76, 0xc6, 0x16, 0x16, 0x1d, 0x59, 0x5b, 0x24, 0x98, 0xf9, 0x80, 0x02, 0xfd, 0x8e, 0xf8, 0x9f, 0xfc, 0xe1, 0xf8, 0x3f, 0x00, 0xbe, 0x59, 0xfc, 0x0f, 0x3f, 0xc0, 0x34, 0x6e, 0xc0, 0xbf, 0x80, 0xed, 0x30, 0x19, 0x1f, 0xe2, 0x01, 0xd8, 0x3f, 0x89, 0x71, 0x08, 0xb7, 0x83, 0x51, 0x75, 0x40, 0x2b, 0xd3, 0xf1, 0x3f, 0x78, 0x74, 0x0a, 0xa4, 0x13, 0x0b, 0xee, 0x01, 0x15, 0x9f, 0xd0, 0x16, 0x85, 0xf8, 0x9f, 0xdd, 0x0d, 0xf9, 0xfd, 0xf0, 0x26, 0xfe, 0x67, 0xb7, 0x02, 0x8e, 0x5b, 0xf1, 0x7f, 0xa5, 0x5b, 0xf1, 0x7b, 0xe7, 0x5d, 0x76, 0xf4, 0x54, 0xed, 0x01, 0x39, 0xc6, 0x0d, 0xc2, 0xc7, 0x97, 0x27, 0xe3, 0x17, 0xa3, 0x1d, 0x88, 0xfd, 0x63, 0x9c, 0xe7, 0x77, 0xaa, 0x25, 0xed, 0x95, 0xe9, 0xf1, 0x7b, 0x51, 0xc0, 0xaf, 0xa1, 0xf4, 0x9c, 0x50, 0xab, 0x5b, 0xa4, 0xe7, 0x70, 0x57, 0x01, 0xd3, 0x19, 0xc7, 0xfd, 0x63, 0x78, 0x10, 0xfb, 0xd3, 0x6c, 0xfc, 0x4c, 0xc4, 0xcf, 0x6c, 0x54, 0xd0, 0x0a, 0xc4, 0xcc, 0x15, 0xf2, 0xa6, 0x83, 0x5e, 0x30, 0x9d, 0x42, 0xbe, 0x90, 0x2b, 0x24, 0xe6, 0x65, 0x3b, 0x8e, 0xb6, 0x60, 0x22, 0x73, 0xc1, 0x74, 0xb4, 0x82, 0x83, 0xe4, 0x82, 0xee, 0x24, 0xae, 0xd7, 0x86, 0xf5, 0xbe, 0x51, 0xb5, 0x90, 0x3b, 0x08, 0xde, 0x7a, 0x10, 0x64, 0xd1, 0x37, 0x4b, 0xd9, 0xb7, 0x7e, 0x35, 0x97, 0x45, 0x6f, 0xa4, 0xd4, 0xf7, 0xf9, 0xa7, 0xf0, 0x17, 0x56, 0x80, 0x0f, 0x97, 0x47, 0xa3, 0x8b, 0x7f, 0x5c, 0xc3, 0x17, 0xbf, 0x5c, 0x43, 0x17, 0x3f, 0x5b, 0xf3, 0x0e, 0xc5, 0xb5, 0x11, 0x94, 0x7b, 0xd3, 0xfd, 0x30, 0x55, 0xfc, 0x07, 0x58, 0xe7, 0xd7, 0xff, 0x04, 0xf8, 0x46, 0x47, 0x5f, 0x5f, 0xd5, 0xd0, 0x57, 0x57, 0x2f, 0xcf, 0xa2, 0xb3, 0x1f, 0x39, 0xa5, 0x75, 0x8d, 0xa4, 0xe7, 0x4c, 0x2c, 0x2f, 0x39, 0x4e, 0xe1, 0x85, 0x02, 0x2e, 0x58, 0xc9, 0xd3, 0x53, 0xcd, 0x11, 0x35, 0x0b, 0x97, 0xc7, 0xb4, 0xb9, 0x14, 0x28, 0xc8, 0x5e, 0x92, 0x72, 0x64, 0xee, 0x87, 0x1c, 0xff, 0x2b, 0xb8, 0x0c, 0x30, 0x7c, 0x8d, 0x74, 0xf4, 0xef, 0x80, 0x7f, 0x03, 0x7c, 0x35, 0xc6, 0xd7, 0x28, 0x35, 0x23, 0xe8, 0x47, 0x4e, 0x8e, 0xc3, 0x7c, 0x22, 0x51, 0x97, 0x72, 0xce, 0xd2, 0x52, 0x8e, 0xe5, 0x72, 0xc2, 0xbe, 0x1d, 0x51, 0xd1, 0x1d, 0x3c, 0x6f, 0x38, 0xda, 0x92, 0x09, 0xb9, 0x00, 0xef, 0xf6, 0x0f, 0xca, 0xff, 0x95, 0x73, 0x83, 0x5f, 0xfb, 0xe8, 0x0b, 0xa9, 0x86, 0x7e, 0x8b, 0xe8, 0x8c, 0x98, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x59, 0x9a, 0xa5, 0x1f, 0x20, 0x7d, 0xe3, 0x38, 0xe8, 0xaa, 0x56, 0x63, 0xf8, 0x06, 0x20, 0x5e, 0x5d, 0x4d, 0x30, 0x02, 0x5c, 0x5d, 0xff, 0x1d, 0x87, 0x7d, 0x25, 0xfb, 0xfa, 0x9b, 0xa4, 0xcb, 0x6f, 0x01, 0x96, 0x39, 0xe2, 0xc4, 0xbe, 0x08, 0xff, 0x7b, 0xc0, 0x6f, 0xc6, 0xf8, 0x72, 0x9c, 0x0f, 0xd1, 0x6f, 0xe1, 0xf7, 0xd7, 0x01, 0x42, 0xcf, 0xd8, 0x58, 0x1c, 0x02, 0xba, 0x42, 0x12, 0x83, 0x70, 0xc5, 0xff, 0x1e, 0x34, 0x4b, 0x3f, 0x65, 0x62, 0x1c, 0x5f, 0x8d, 0xae, 0x80, 0xfb, 0x09, 0xb8, 0x1e, 0xa0, 0x2b, 0xd0, 0x8b, 0x7f, 0xd6, 0x75, 0xce, 0x37, 0xe3, 0x5e, 0x5f, 0xb6, 0x90, 0x6e, 0x2d, 0x23, 0xfd, 0xb9, 0xbd, 0xb0, 0xff, 0xa9, 0xf2, 0xbb, 0x2b, 0xe0, 0xfc, 0x2a, 0x99, 0xc7, 0xff, 0x83, 0x85, 0x93, 0x0f, 0x4c, 0x3f, 0x63, 0x7f, 0xfd, 0x13, 0x9f, 0x5d, 0xb1, 0xbf, 0x06, 0x8a, 0x40, 0xbd, 0x38, 0xa3, 0xff, 0xff, 0x4b, 0x7a, 0xc6, 0xbf, 0x16, 0x60, 0x18, 0x71, 0xfe, 0xee, 0x04, 0xde, 0xb5, 0xed, 0xb3, 0x74, 0xfd, 0xd7, 0x98, 0xf7, 0x01, 0x17, 0x17, 0x08, 0x2d, 0x4f, 0xf3, 0xff, 0x9b, 0xff, 0x02, 0x80, 0x13, 0xf8, 0xfd, 0xef, 0xe2, 0x9c, 0xbd, 0x0f, 0x87, 0x31, 0xd7, 0xdf, 0x5c, 0x71, 0x60, 0xe0, 0x1e, 0x9c, 0x00, 0xc7, 0xb3, 0xe9, 0xef, 0x08, 0xcc, 0xd2, 0x4f, 0x96, 0xbc, 0x77, 0x81, 0xf7, 0x09, 0xc6, 0x5f, 0x0f, 0x01, 0x37, 0x6d, 0xa5, 0x6e, 0xfd, 0xed, 0x2d, 0x00, 0xd2, 0xad, 0xb5, 0x84, 0x3e, 0x24, 0xed, 0x9f, 0xd9, 0x3c, 0xe3, 0xfd, 0xd7, 0xe0, 0xfc, 0xff, 0xf3, 0xef, 0x40, 0x0f, 0xb8, 0xfd, 0x03, 0xc7, 0x44, 0x44, 0xc4, 0x16, 0x91, 0x5d, 0x13, 0x51, 0x8d, 0x30, 0x60, 0x28, 0x7b, 0x76, 0x25, 0xff, 0x37, 0xfb, 0x2e, 0x80, 0xac, 0xfc, 0x39, 0x6d, 0xf6, 0x42, 0x26, 0x9b, 0x9b, 0x0b, 0xfe, 0xb4, 0x3e, 0x60, 0xcb, 0xfe, 0x15, 0xa3, 0x7b, 0xf7, 0xdc, 0xb3, 0x83, 0xb3, 0x6e, 0xe7, 0xbe, 0xeb, 0x3e, 0xec, 0x1e, 0x9c, 0xb9, 0xa7, 0x9d, 0xbd, 0xa7, 0x9d, 0xde, 0x99, 0xdb, 0xee, 0x3c, 0x3d, 0x72, 0x5b, 0xbb, 0x27, 0x67, 0x69, 0xa8, 0xb1, 0xfb, 0xe9, 0xd9, 0xfe, 0xd1, 0xc9, 0x7d, 0xb7, 0xdd, 0xee, 0x74, 0x3b, 0x20, 0xbe, 0x64, 0x85, 0xed, 0xce, 0x69, 0x0b, 0x5a, 0xb9, 0x3b, 0xbb, 0x27, 0x07, 0xbb, 0xcd, 0x6e, 0xc7, 0x7d, 0xf8, 0xee, 0xbb, 0xee, 0x49, 0xa7, 0xd7, 0xee, 0x9c, 0x1c, 0xf4, 0xf6, 0x5c, 0x56, 0xe5, 0xb4, 0x75, 0x72, 0x70, 0x7c, 0x76, 0xdf, 0xed, 0x7e, 0xba, 0x9b, 0x4e, 0x7f, 0xb0, 0xbd, 0x51, 0x59, 0xdb, 0x4a, 0x1f, 0x45, 0xd1, 0x69, 0xe7, 0xcc, 0xdd, 0x4e, 0x7f, 0x9e, 0x86, 0xc6, 0x5e, 0xc9, 0x65, 0x69, 0x23, 0xce, 0x36, 0x4b, 0xac, 0xec, 0x03, 0xf6, 0xf2, 0xc1, 0xfa, 0x46, 0x9c, 0xb1, 0xb2, 0xcd, 0x35, 0x28, 0x83, 0x5f, 0xac, 0x8c, 0x65, 0x50, 0xf6, 0xab, 0xf4, 0xd1, 0xd3, 0xdd, 0x63, 0x77, 0xdb, 0xfd, 0xdc, 0x2b, 0x6d, 0x94, 0xca, 0xa5, 0xcd, 0x5f, 0xa5, 0xd3, 0xd1, 0xa7, 0xbd, 0xd6, 0xd9, 0xc1, 0x51, 0xcf, 0x3d, 0x09, 0x4f, 0x76, 0x9f, 0x76, 0x56, 0xfb, 0xa5, 0xcb, 0xd2, 0x45, 0x69, 0xbf, 0x34, 0x5e, 0x53, 0xe9, 0xf4, 0xec, 0xb2, 0xdb, 0xb9, 0x0b, 0x43, 0x74, 0x8f, 0x5a, 0xbb, 0x5d, 0xf7, 0xb0, 0xd3, 0x61, 0x1d, 0x1c, 0x77, 0x3a, 0x87, 0x5b, 0xab, 0x9b, 0x6b, 0x5e, 0xdf, 0x2b, 0x87, 0xe1, 0x23, 0x26, 0x3f, 0x3e, 0x3a, 0xec, 0x4c, 0x15, 0x95, 0x26, 0xbb, 0xc2, 0x64, 0xd7, 0x83, 0x34, 0xdb, 0x27, 0xab, 0xfd, 0xcb, 0xd2, 0xc9, 0x11, 0x2f, 0x9e, 0x74, 0xba, 0x7f, 0xf2, 0xd9, 0xf6, 0x2a, 0x94, 0xfd, 0x7c, 0xf3, 0xee, 0xf6, 0x36, 0xac, 0xee, 0x00, 0x36, 0xa4, 0xe4, 0xb6, 0x78, 0x8d, 0x83, 0x88, 0x89, 0xdd, 0xb3, 0xfd, 0x4e, 0xcf, 0x6d, 0x6d, 0xf7, 0xb9, 0x6c, 0xfb, 0xe2, 0x5e, 0x99, 0x0b, 0x3b, 0xdd, 0xd3, 0x0e, 0x94, 0x5e, 0xc6, 0xa5, 0xfb, 0xf7, 0xca, 0x2e, 0xe4, 0x5c, 0xc2, 0x7f, 0x45, 0x47, 0x27, 0xee, 0x01, 0x74, 0xc8, 0xa4, 0x6e, 0xfb, 0x88, 0x97, 0x4d, 0xc6, 0x6c, 0x1d, 0xc0, 0x32, 0x5a, 0xeb, 0x07, 0x6b, 0xd5, 0xf5, 0x6a, 0x42, 0xd0, 0x7c, 0x0f, 0x04, 0x4f, 0x77, 0xcf, 0xf6, 0x5f, 0x39, 0xd9, 0xed, 0xb5, 0x8f, 0x9e, 0xae, 0x6e, 0x94, 0xb6, 0xee, 0x8e, 0x6b, 0x9c, 0x1e, 0x9f, 0xac, 0x8e, 0x1f, 0xe1, 0x85, 0xed, 0xcc, 0x7a, 0x4c, 0xcd, 0xdf, 0x36, 0xdf, 0x5b, 0xdb, 0xfc, 0xb8, 0x74, 0x2d, 0x63, 0x53, 0x86, 0xd6, 0x6c, 0x14, 0x98, 0x03, 0xac, 0xf8, 0x5b, 0x92, 0xfe, 0x25, 0x93, 0xb4, 0x0e, 0x6e, 0x24, 0x8c, 0x13, 0xaf, 0xc4, 0x18, 0x82, 0xde, 0x3e, 0x5e, 0x87, 0xfd, 0x18, 0x8b, 0xe2, 0xd1, 0xe3, 0x95, 0xb1, 0xdf, 0x90, 0x4d, 0xcd, 0xef, 0xb4, 0xd3, 0x69, 0xaf, 0xf6, 0xd7, 0x2f, 0x6f, 0x38, 0xea, 0x6f, 0x6e, 0xf7, 0xd7, 0x57, 0x2f, 0xee, 0x6d, 0xdc, 0x5d, 0xab, 0xba, 0x97, 0x9b, 0xdb, 0x97, 0xeb, 0xab, 0xfb, 0xfc, 0x85, 0xb5, 0x64, 0x4b, 0xe0, 0x33, 0x2f, 0x31, 0xa6, 0xbd, 0xbb, 0xd3, 0x45, 0x93, 0xc5, 0x94, 0x3f, 0x2e, 0xf5, 0x37, 0xbf, 0x53, 0xfa, 0x3a, 0x48, 0xdd, 0xd2, 0xe5, 0xe6, 0x77, 0x88, 0xdf, 0x88, 0x1b, 0x8f, 0xc5, 0xf0, 0xc3, 0x38, 0x1f, 0xf7, 0xc5, 0x1f, 0x37, 0x4b, 0x9b, 0x93, 0xe7, 0x7e, 0xa9, 0x7c, 0xfd, 0xb8, 0x59, 0xda, 0x18, 0x37, 0x38, 0xe9, 0xb4, 0xce, 0x60, 0x45, 0xd5, 0xd2, 0x25, 0xe0, 0x62, 0xad, 0x7a, 0x6f, 0xa3, 0x52, 0xda, 0x8f, 0xb3, 0x8d, 0xe7, 0x6a, 0x1a, 0x53, 0xca, 0xbb, 0x69, 0xbe, 0x35, 0x53, 0xea, 0x7c, 0xd4, 0x3b, 0x7b, 0x6f, 0xbf, 0xd3, 0x81, 0xae, 0x4a, 0xee, 0xe5, 0xb5, 0x3a, 0x96, 0xdc, 0xdd, 0xee, 0xd9, 0x64, 0xe2, 0xab, 0x13, 0x1d, 0x5d, 0xdb, 0x5a, 0x87, 0xe2, 0xb5, 0x8d, 0xcd, 0x6a, 0xbc, 0x2d, 0x9c, 0x0a, 0xaf, 0xb4, 0x55, 0xaa, 0x7e, 0xab, 0xdf, 0x27, 0x9d, 0xfe, 0xd9, 0xea, 0x19, 0xfc, 0xe2, 0x35, 0x27, 0xbd, 0x8e, 0x3b, 0xfd, 0x93, 0x8c, 0x04, 0x26, 0x7c, 0xd3, 0xb1, 0x57, 0x7a, 0xad, 0x54, 0x2d, 0x45, 0xbb, 0xa0, 0xe1, 0x30, 0x99, 0x71, 0xf7, 0x7f, 0x68, 0xe5, 0xcc, 0x75, 0xc4, 0x9d, 0x9d, 0x72, 0xc5, 0xdf, 0x68, 0x1e, 0x1f, 0xbb, 0x0f, 0xdf, 0x76, 0x8f, 0x77, 0xf7, 0x3a, 0xee, 0xee, 0x49, 0xe7, 0x3e, 0xab, 0xf1, 0x46, 0xc9, 0xdd, 0x00, 0x7f, 0xb0, 0x51, 0x06, 0xbc, 0x96, 0x4e, 0xc7, 0xd3, 0x65, 0x63, 0x6e, 0x2f, 0x3f, 0xd9, 0xef, 0xb8, 0xbf, 0xfc, 0xf4, 0xa0, 0x75, 0xe8, 0x36, 0x4f, 0x8e, 0x2e, 0x7a, 0x1f, 0xf5, 0xa2, 0xa3, 0xbe, 0xfb, 0xc9, 0xa7, 0x4f, 0x8f, 0x4f, 0xdd, 0xa3, 0xf3, 0xce, 0xc9, 0x47, 0x3d, 0x30, 0x41, 0xb7, 0xbb, 0xfb, 0xd9, 0x25, 0x58, 0xd2, 0xde, 0xcf, 0x96, 0xc7, 0x6d, 0x4f, 0x3b, 0xdd, 0x6d, 0xef, 0x66, 0x77, 0x9e, 0xfc, 0xc5, 0xa3, 0x55, 0x36, 0xd1, 0x56, 0xf7, 0x74, 0x75, 0xe3, 0xb5, 0x6f, 0x4f, 0xd9, 0x03, 0x6f, 0xe4, 0xdd, 0x9d, 0x58, 0x28, 0xd8, 0x76, 0xf3, 0xac, 0x77, 0xbc, 0xea, 0xdd, 0x8d, 0xed, 0x9b, 0x75, 0x06, 0x94, 0x74, 0x41, 0x59, 0x7f, 0x5e, 0x1d, 0x2b, 0xfc, 0xa4, 0xce, 0xc6, 0xad, 0x3a, 0xeb, 0xd7, 0x75, 0xa0, 0x12, 0xac, 0x8c, 0x2f, 0xf7, 0xec, 0xe8, 0x0c, 0xe6, 0x74, 0x00, 0xee, 0xb4, 0x0f, 0xee, 0x34, 0x3d, 0x37, 0x07, 0x82, 0xe6, 0xb4, 0x87, 0xde, 0x76, 0x99, 0xb1, 0x8f, 0x5d, 0xdd, 0x06, 0xb8, 0x1a, 0x06, 0xb6, 0x29, 0x5b, 0x25, 0xb7, 0xca, 0xde, 0xb6, 0x60, 0x76, 0x73, 0x73, 0x71, 0xcb, 0xad, 0x3f, 0xb2, 0xcb, 0x4d, 0x77, 0xb5, 0xdd, 0x89, 0x76, 0x3f, 0x8d, 0x39, 0x9a, 0x52, 0xbc, 0x32, 0x74, 0xce, 0x00, 0xd3, 0x7d, 0xf5, 0xd5, 0x4d, 0x9e, 0x83, 0x8b, 0xbb, 0xee, 0x9f, 0x4f, 0x39, 0xde, 0xc6, 0x49, 0xff, 0xee, 0x2a, 0xd3, 0x82, 0xbb, 0xb1, 0x9c, 0x3d, 0x82, 0x04, 0x36, 0x1f, 0x28, 0x05, 0x26, 0x99, 0xdb, 0x08, 0xdf, 0xbe, 0x66, 0xf9, 0xf9, 0xcb, 0x5b, 0xdf, 0x5a, 0x67, 0x8c, 0xb3, 0x89, 0xdc, 0x68, 0x2a, 0x2c, 0x0c, 0xa6, 0x51, 0x01, 0x30, 0xf9, 0x78, 0x3a, 0x7c, 0x36, 0xdb, 0xdb, 0x1b, 0x5c, 0x7f, 0xdc, 0xf4, 0xff, 0x02, 0x57, 0x04, 0x9f, 0x6f, \ No newline at end of file diff --git a/demos/bpp.lua b/demos/bpp.lua index f16f07317..b3432f890 100644 --- a/demos/bpp.lua +++ b/demos/bpp.lua @@ -13,8 +13,8 @@ offset = omap = {0,1,3,2} function rFrame(x,y,w,h,segment,style) - local keep = peek4(2*0x03FF8+1) - poke4(2*0x03FF8+1, segment) + local keep = peek4(2*0x03FFC) + poke4(2*0x03FFC, segment) function bdr(xy,rot) local hrz=(rot%2)==0, iend, c if hrz then c=x iend=w-3 @@ -46,7 +46,7 @@ function rFrame(x,y,w,h,segment,style) bdr(x2,1) rect(x+8,y+8,w*8-16,h*8-16,1) - poke4(2*0x03FF8+1, keep) + poke4(2*0x03FFC, keep) end function rFontSheet(x, y, segment, alt) @@ -54,10 +54,10 @@ function rFontSheet(x, y, segment, alt) end function rText(text,x,y,segment,alt) - local keep = peek4(2*0x03FF8+1) - poke4(2*0x03FF8+1, segment) + local keep = peek4(2*0x03FFC) + poke4(2*0x03FFC, segment) font(text,x,y,0,5,8,false,1,alt) - poke4(2*0x03FF8+1, keep) + poke4(2*0x03FFC, keep) end -- segments for 1bpp BG page are: diff --git a/src/api.h b/src/api.h index c30736091..ca72f25cc 100644 --- a/src/api.h +++ b/src/api.h @@ -116,14 +116,14 @@ typedef struct // |---------+---------------+------- - - - // | | | #define TIC_SYNC_LIST(macro) \ - macro(tiles, tiles, 0) \ - macro(sprites, sprites, 1) \ - macro(map, map, 2) \ - macro(sfx, sfx, 3) \ - macro(music, music, 4) \ - macro(palette, vram.palette, 5) \ - macro(flags, flags, 6) \ - macro(screen, vram.screen, 7) + macro(tiles, tiles, 0) \ + macro(sprites, sprites, 1) \ + macro(map, map, 2) \ + macro(sfx, sfx, 3) \ + macro(music, music, 4) \ + macro(palette, vram.palette, 5) \ + macro(flags, flags, 6) \ + macro(screen, vram.screen, 7) enum { @@ -655,6 +655,15 @@ enum tic_mem*, u32 mask, s32 bank, bool toCart) \ \ \ + macro(vbank, \ + "vbank(bank) -> prev\nvbank() -> prev", \ + \ + "VRAM contains 2x16K memory chips, use vbank(0) or vbank(1) to switch between them.", \ + 1, \ + s32, \ + tic_mem*, s32 ovr) \ + \ + \ macro(reset, \ "reset()", \ \ @@ -749,7 +758,6 @@ void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); void tic_core_blit(tic_mem* tic); void tic_core_synth_sound(tic_mem* tic); - void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb); const tic_script_config* tic_core_script_config(tic_mem* memory); @@ -760,3 +768,9 @@ typedef struct tic_tick_data tickData; u64 tick_counter; } tic80_local; + +#define VBANK(tic, ovr) \ + bool MACROVAR(_ovr_) = tic_api_vbank(tic, ovr); \ + SCOPE(tic_api_vbank(tic, MACROVAR(_ovr_))) + +#define OVR(tic) VBANK(tic, 1) diff --git a/src/api/js.c b/src/api/js.c index a287252e2..f5199c3a7 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -896,6 +896,21 @@ static duk_ret_t duk_music(duk_context* duk) return 0; } +static duk_ret_t duk_vbank(duk_context* duk) +{ + tic_core* core = getDukCore(duk); + tic_mem* tic = (tic_mem*)core; + + s32 prev = core->state.vbank.id; + + if(!duk_is_null_or_undefined(duk, 0)) + tic_api_vbank(tic, duk_opt_int(duk, 0, 0)); + + duk_push_uint(duk, prev); + + return 1; +} + static duk_ret_t duk_sync(duk_context* duk) { tic_mem* tic = (tic_mem*)getDukCore(duk); @@ -1046,6 +1061,7 @@ static void callJavascriptOverline(tic_mem* tic, void* data) if(duk_get_global_string(duk, OVR_FN)) { + tic_api_cls(tic, 0); if(duk_pcall(duk, 0) != 0) core->data->error(core->data->data, duk_safe_to_stacktrace(duk, -1)); } diff --git a/src/api/lua.c b/src/api/lua.c index 6863ab4fc..c8444c553 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -942,6 +942,20 @@ static s32 lua_sfx(lua_State* lua) return 0; } +static s32 lua_vbank(lua_State* lua) +{ + tic_core* core = getLuaCore(lua); + tic_mem* tic = (tic_mem*)core; + + s32 prev = core->state.vbank.id; + + if(lua_gettop(lua) == 1) + tic_api_vbank(tic, getLuaNumber(lua, 1)); + + lua_pushinteger(lua, prev); + return 1; +} + static s32 lua_sync(lua_State* lua) { tic_mem* tic = (tic_mem*)getLuaCore(lua); @@ -1565,8 +1579,9 @@ void callLuaOverline(tic_mem* tic, void* data) lua_getglobal(lua, OvrFunc); if(lua_isfunction(lua, -1)) { + tic_api_cls(tic, 0); if(docall(lua, 0, 0) != LUA_OK) - core->data->error(core->data->data, lua_tostring(lua, -1)); + core->data->error(core->data->data, lua_tostring(lua, -1)); } else lua_pop(lua, 1); } diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 85926f976..80e5eeb89 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1029,6 +1029,20 @@ static SQInteger squirrel_sfx(HSQUIRRELVM vm) return 0; } +static SQInteger squirrel_vbank(HSQUIRRELVM vm) +{ + tic_core* core = getSquirrelCore(vm); + tic_mem* tic = (tic_mem*)core; + + s32 prev = core->state.vbank.id; + + if(sq_gettop(vm) == 2) + tic_api_vbank(tic, getSquirrelNumber(vm, 2)); + + sq_pushinteger(vm, prev); + return 1; +} + static SQInteger squirrel_sync(HSQUIRRELVM vm) { tic_mem* tic = (tic_mem*)getSquirrelCore(vm); @@ -1676,6 +1690,7 @@ static void callSquirrelOverline(tic_mem* tic, void* data) if(SQ_SUCCEEDED(sq_get(vm, -2))) { + tic_api_cls(tic, 0); sq_pushroottable(vm); if(SQ_FAILED(sq_call(vm, 1, SQFalse, SQTrue))) { diff --git a/src/api/wren.c b/src/api/wren.c index 8082c857b..fcaa21a7b 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -114,6 +114,8 @@ class TIC {\n\ foreign static music(track, frame, loop, sustain)\n\ foreign static time()\n\ foreign static tstamp()\n\ + foreign static vbank()\n\ + foreign static vbank(bank)\n\ foreign static sync()\n\ foreign static sync(mask)\n\ foreign static sync(mask, bank)\n\ @@ -1224,6 +1226,19 @@ static void wren_tstamp(WrenVM* vm) wrenSetSlotDouble(vm, 0, tic_api_tstamp(tic)); } +static void wren_vbank(WrenVM* vm) +{ + tic_core* core = getWrenCore(vm); + tic_mem* tic = (tic_mem*)core; + + s32 prev = core->state.vbank.id; + + if(wrenGetSlotCount(vm) == 2) + tic_api_vbank(tic, getWrenNumber(vm, 1)); + + wrenSetSlotDouble(vm, 0, prev); +} + static void wren_sync(WrenVM* vm) { tic_mem* tic = (tic_mem*)getWrenCore(vm); @@ -1395,6 +1410,8 @@ static WrenForeignMethodFn foreignTicMethods(const char* signature) if (strcmp(signature, "static TIC.time()" ) == 0) return wren_time; if (strcmp(signature, "static TIC.tstamp()" ) == 0) return wren_tstamp; + if (strcmp(signature, "static TIC.vbank()" ) == 0) return wren_vbank; + if (strcmp(signature, "static TIC.vbank(_)" ) == 0) return wren_vbank; if (strcmp(signature, "static TIC.sync()" ) == 0) return wren_sync; if (strcmp(signature, "static TIC.sync(_)" ) == 0) return wren_sync; if (strcmp(signature, "static TIC.sync(_,_)" ) == 0) return wren_sync; diff --git a/src/core/core.c b/src/core/core.c index b5dca7fd8..62b803357 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -72,10 +72,24 @@ void tic_api_poke(tic_mem* memory, s32 address, u8 value, s32 bits) switch(bits) { - case 1: if(address < RamBits / 1) {tic_tool_poke1(ram, address, value); core->state.memmask[address >> 2] = 1;} break; - case 2: if(address < RamBits / 2) {tic_tool_poke2(ram, address, value); core->state.memmask[address >> 1] = 1;} break; - case 4: if(address < RamBits / 4) {tic_tool_poke4(ram, address, value); core->state.memmask[address >> 0] = 1;} break; - case 8: if(address < RamBits / 8) {ram[address] = value; *(u16*)&core->state.memmask[address << 1] = 0x0101;} break; + case 1: if(address < RamBits / 1) tic_tool_poke1(ram, address, value); break; + case 2: if(address < RamBits / 2) tic_tool_poke2(ram, address, value); break; + case 4: if(address < RamBits / 4) tic_tool_poke4(ram, address, value); break; + case 8: if(address < RamBits / 8) ram[address] = value; break; + } + + if(core->state.vbank.id) + { + enum{ScreenBits = sizeof(tic_screen) * BITS_IN_BYTE}; + + u8* mmask = core->state.vbank.memmask; + switch(bits) + { + case 1: if(address < ScreenBits / 1) {mmask[address >> 2] = 1;} break; + case 2: if(address < ScreenBits / 2) {mmask[address >> 1] = 1;} break; + case 4: if(address < ScreenBits / 4) {mmask[address >> 0] = 1;} break; + case 8: if(address < ScreenBits / 8) {*(u16*)&mmask[address << 1] = 0x0101;} break; + } } } @@ -121,9 +135,8 @@ void tic_api_memcpy(tic_mem* memory, s32 dst, s32 src, s32 size) && dst <= bound && src <= bound) { - u8* base = (u8*)&memory->ram; - memcpy(base + dst, base + src, size); - memcpy(core->state.memmask + (dst << 1), core->state.memmask + (src << 1), size << 1); + for(s32 end = dst + size; dst != end;) + tic_api_poke(memory, dst++, tic_api_peek(memory, src++, 8), 8); } } @@ -137,9 +150,8 @@ void tic_api_memset(tic_mem* memory, s32 dst, u8 val, s32 size) && dst >= 0 && dst <= bound) { - u8* base = (u8*)&memory->ram; - memset(base + dst, val, size); - memset(core->state.memmask + (dst << 1), 1, size << 1); + for(s32 end = dst + size; dst != end;) + tic_api_poke(memory, dst++, val, 8); } } @@ -196,10 +208,6 @@ void tic_api_sync(tic_mem* tic, u32 mask, s32 bank, bool toCart) if(mask & Sections[i].mask) sync((u8*)&tic->ram + Sections[i].ram, (u8*)&tic->cart.banks[bank] + Sections[i].bank, Sections[i].size, toCart); - // copy OVR palette - if (mask & tic_sync_palette) - sync(&core->state.ovr.palette, &tic->cart.banks[bank].palette.ovr, sizeof(tic_palette), toCart); - core->state.synced |= mask; } @@ -215,18 +223,6 @@ s32 tic_api_tstamp(tic_mem* memory) return (s32)time(NULL); } -static void resetPalette(tic_mem* memory) -{ - static const u8 DefaultMapping[] = { 16, 50, 84, 118, 152, 186, 220, 254 }; - memcpy(memory->ram.vram.palette.data, memory->cart.bank0.palette.scn.data, sizeof(tic_palette)); - memcpy(memory->ram.vram.mapping, DefaultMapping, sizeof DefaultMapping); -} - -static void resetBlitSegment(tic_mem* memory) -{ - memory->ram.vram.vars.blit = TIC_DEFAULT_BLIT_MODE; -} - static bool compareMetatag(const char* code, const char* tag, const char* value, const char* comment) { bool result = false; @@ -294,20 +290,40 @@ static void soundClear(tic_mem* memory) tic_api_music(memory, -1, 0, 0, false, false, -1, -1); } -void tic_api_reset(tic_mem* memory) +static void resetVbank(tic_mem* memory) { memset(&memory->ram.vram.vars, 0, sizeof memory->ram.vram.vars); + memory->ram.vram.blit.segment = TIC_DEFAULT_BLIT_MODE; + tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + + static const u8 DefaultMapping[] = { 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe }; + memcpy(memory->ram.vram.mapping, DefaultMapping, sizeof DefaultMapping); + memory->ram.vram.palette = memory->cart.bank0.palette.scn; +} - resetPalette(memory); - resetBlitSegment(memory); +void tic_api_reset(tic_mem* memory) +{ + tic_core* core = (tic_core*)memory; - memory->ram.input.mouse.relative = 0; + resetVbank(memory); - tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + OVR(memory) + { + resetVbank(memory); + + // clear OVR memmask + ZEROMEM(core->state.vbank.memmask); + + // init OVR palette with SCN if it's empty + // for backward compatibility + if(!EMPTY(memory->cart.bank0.palette.ovr.data)) + memcpy(&memory->ram.vram.palette, &memory->cart.bank0.palette.ovr, sizeof(tic_palette)); + } + + memory->ram.input.mouse.relative = 0; soundClear(memory); - tic_core* core = (tic_core*)memory; core->state.initialized = false; ZEROMEM(core->state.callback); @@ -382,6 +398,30 @@ static bool tic_init_vm(tic_core* core, const char* code, const tic_script_confi return done; } +s32 tic_api_vbank(tic_mem* tic, s32 ovr) +{ + tic_core* core = (tic_core*)tic; + + s32 prev = core->state.vbank.id; + + switch(ovr) + { + case 0: + case 1: + if(core->state.vbank.id != ovr) + { + SWAP(tic->ram.vram, core->state.vbank.mem, tic_vram); + core->state.vbank.id = ovr; + + // border color and mouse cursor is the same in both modes + tic->ram.vram.vars.border = core->state.vbank.mem.vars.border; + tic->ram.vram.vars.cursor = core->state.vbank.mem.vars.cursor; + } + } + + return prev; +} + void tic_core_tick(tic_mem* tic, tic_tick_data* data) { tic_core* core = (tic_core*)tic; @@ -428,7 +468,14 @@ void tic_core_tick(tic_mem* tic, tic_tick_data* data) else return; } + tic_api_vbank(tic, 0); core->state.tick(tic); + + OVR(tic) + { + // call OVR(tic) callback for backward compatibility + core->state.callback.overline(tic, core->state.callback.data); + } } void tic_core_pause(tic_mem* memory) @@ -437,7 +484,6 @@ void tic_core_pause(tic_mem* memory) memcpy(&core->pause.state, &core->state, sizeof(tic_core_state_data)); memcpy(&core->pause.ram, &memory->ram, sizeof(tic_ram)); - memset(&core->state.ovr, 0, sizeof core->state.ovr); if (core->data) { @@ -526,91 +572,79 @@ static inline void memset4(void* dst, u32 val, u32 dwords) void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) { tic_core* core = (tic_core*)tic; - - tic_palette ovrpal; tic80_pixel_color_format fmt = tic->screen_format; - - if(clb.overline) - { - memcpy(&ovrpal, EMPTY(core->state.ovr.palette.data) - ? &tic->ram.vram.palette - : &core->state.ovr.palette - , sizeof ovrpal); + const tic_vram* vram = &tic->ram.vram; + const tic_vram* ovr = &core->state.vbank.mem; + + tic_api_vbank(tic, 0); + +#define UPDBRD() \ + if(clb.border) \ + { \ + clb.border(tic, row, clb.data); \ + tic_api_vbank(tic, 0); \ + pal = tic_tool_palette_blit(&vram->palette, fmt); \ + ovrpal = tic_tool_palette_blit(&ovr->palette, fmt); \ } + if (clb.scanline) { -#define UPDBRD() \ - if(clb.border) \ - { \ - clb.border(tic, row, clb.data); \ - pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); \ - } - - if (clb.scanline) - clb.scanline(tic, 0, clb.data); + clb.scanline(tic, 0, clb.data); + tic_api_vbank(tic, 0); + } - const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); + tic_blitpal pal = tic_tool_palette_blit(&vram->palette, fmt); + tic_blitpal ovrpal = tic_tool_palette_blit(&ovr->palette, fmt); - s32 row = 0; - u32* rowPtr = tic->screen; + s32 row = 0; + u32* rowPtr = tic->screen; - for(; row < TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) - { - UPDBRD(); - memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH); - } + for(; row != TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) + { + UPDBRD(); + memset4(rowPtr, pal.data[vram->vars.border], TIC80_FULLWIDTH); + } - for (; row < TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row, rowPtr += TIC80_FULLWIDTH) - { - UPDBRD(); + for (; row < TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row) + { + UPDBRD(); + memset4(rowPtr, pal.data[vram->vars.border], TIC80_MARGIN_LEFT); - memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_MARGIN_LEFT); - memset4(rowPtr + (TIC80_FULLWIDTH - TIC80_MARGIN_RIGHT), pal[tic->ram.vram.vars.border], TIC80_MARGIN_RIGHT); + rowPtr += TIC80_MARGIN_LEFT; - for (s32 i = (row + tic->ram.vram.vars.offset.y + (TIC80_HEIGHT - TIC80_MARGIN_TOP)) % TIC80_HEIGHT * TIC80_WIDTH, - end = i + TIC80_WIDTH, x = (TIC80_WIDTH - tic->ram.vram.vars.offset.x) % TIC80_WIDTH; i < end; ++i, ++x) - rowPtr[TIC80_MARGIN_LEFT + x % TIC80_WIDTH] = pal[tic_tool_peek4(tic->ram.vram.screen.data, i)]; + enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; + s32 start = (row - vram->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 ovrstart = (row - ovr->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; - if (clb.scanline && (row < TIC80_HEIGHT + TIC80_MARGIN_TOP - 1)) - { - clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), clb.data); - pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); - } - } + for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) + { + s32 ovrpix = (x - ovr->vars.offset.x) % TIC80_WIDTH + ovrstart; - for(; row < TIC80_FULLHEIGHT; ++row, rowPtr += TIC80_FULLWIDTH) - { - UPDBRD(); - memset4(rowPtr, pal[tic->ram.vram.vars.border], TIC80_FULLWIDTH); + *rowPtr++ = core->state.vbank.memmask[ovrpix] + ? ovrpal.data[tic_tool_peek4(ovr->screen.data, ovrpix)] + : pal.data[tic_tool_peek4(vram->screen.data, (x - vram->vars.offset.x) % TIC80_WIDTH + start)]; } -#undef UPDBRD - } + memset4(rowPtr, pal.data[vram->vars.border], TIC80_MARGIN_RIGHT); - if (clb.overline) - { - ZEROMEM(core->state.memmask); - - tic_palette scnpal; - memcpy(&scnpal, &tic->ram.vram.palette, sizeof scnpal); - memcpy(&tic->ram.vram.palette, &ovrpal, sizeof ovrpal); + rowPtr += TIC80_MARGIN_RIGHT; + if (clb.scanline && (row < TIC80_HEIGHT + TIC80_MARGIN_TOP - 1)) { - clb.overline(tic, clb.data); - - const u32* pal = tic_tool_palette_blit(&tic->ram.vram.palette, fmt); - - u32* out = tic->screen + TIC80_MARGIN_TOP * TIC80_FULLWIDTH + TIC80_MARGIN_LEFT; - u8* memmask = core->state.memmask; - for(s32 pos = 0; pos != TIC80_WIDTH * TIC80_HEIGHT; pos += TIC80_WIDTH, out += TIC80_MARGIN_LEFT + TIC80_MARGIN_RIGHT) - for (s32 i = pos, end = pos + TIC80_WIDTH; i != end; ++i, ++out) - if(*memmask++) - *out = pal[tic_tool_peek4(tic->ram.vram.screen.data, i)]; + clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), clb.data); + tic_api_vbank(tic, 0); + pal = tic_tool_palette_blit(&vram->palette, fmt); + ovrpal = tic_tool_palette_blit(&ovr->palette, fmt); } + } - memcpy(&core->state.ovr.palette, &tic->ram.vram.palette, sizeof(tic_palette)); - memcpy(&tic->ram.vram.palette, &scnpal, sizeof scnpal); + for(; row != TIC80_FULLHEIGHT; ++row, rowPtr += TIC80_FULLWIDTH) + { + UPDBRD(); + memset4(rowPtr, pal.data[vram->vars.border], TIC80_FULLWIDTH); } + +#undef UPDBRD } static inline void scanline(tic_mem* memory, s32 row, void* data) diff --git a/src/core/core.h b/src/core/core.h index 5742369f9..51e9e25a7 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -146,14 +146,18 @@ typedef struct tic_tick tick; tic_blit_callback callback; - struct - { - tic_palette palette; - } ovr; - u32 synced; - u8 memmask[sizeof(tic_ram) << 1]; + struct + { + s32 id; + tic_vram mem; + u8 memmask[sizeof(tic_screen) << 1]; + struct + { + u8 l, t, r, b; + } clip; + } vbank; bool initialized; } tic_core_state_data; diff --git a/src/core/draw.c b/src/core/draw.c index d3c42afa9..44a0215f3 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -62,7 +62,7 @@ static void setPixel(tic_core* core, s32 x, s32 y, u8 color) { const tic_vram* vram = &core->memory.ram.vram; - if (x < vram->clip.l || y < vram->clip.t || x >= vram->clip.r || y >= vram->clip.b) return; + if (x < core->state.vbank.clip.l || y < core->state.vbank.clip.t || x >= core->state.vbank.clip.r || y >= core->state.vbank.clip.b) return; tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } @@ -74,20 +74,20 @@ static u8 getPixel(tic_core* core, s32 x, s32 y) #define EARLY_CLIP(x, y, width, height) \ ( \ - (((y)+(height)-1) < vram->clip.t) \ - || (((x)+(width)-1) < vram->clip.l) \ - || ((y) >= vram->clip.b) \ - || ((x) >= vram->clip.r) \ + (((y)+(height)-1) < core->state.vbank.clip.t) \ + || (((x)+(width)-1) < core->state.vbank.clip.l) \ + || ((y) >= core->state.vbank.clip.b) \ + || ((x) >= core->state.vbank.clip.r) \ ) static void drawHLine(tic_core* core, s32 x, s32 y, s32 width, u8 color) { const tic_vram* vram = &core->memory.ram.vram; - if (y < vram->clip.t || vram->clip.b <= y) return; + if (y < core->state.vbank.clip.t || core->state.vbank.clip.b <= y) return; - s32 xl = MAX(x, vram->clip.l); - s32 xr = MIN(x + width, vram->clip.r); + s32 xl = MAX(x, core->state.vbank.clip.l); + s32 xr = MIN(x + width, core->state.vbank.clip.r); s32 start = y * TIC80_WIDTH; for(s32 i = start + xl, end = start + xr; i < end; ++i) @@ -98,7 +98,7 @@ static void drawVLine(tic_core* core, s32 x, s32 y, s32 height, u8 color) { const tic_vram* vram = &core->memory.ram.vram; - if (x < vram->clip.l || vram->clip.r <= x) return; + if (x < core->state.vbank.clip.l || core->state.vbank.clip.r <= x) return; s32 yl = y < 0 ? 0 : y; s32 yr = y + height >= TIC80_HEIGHT ? TIC80_HEIGHT : y + height; @@ -152,10 +152,10 @@ static void drawTile(tic_core* core, tic_tileptr* tile, s32 x, s32 y, u8* colors if (scale == 1) { // the most common path s32 sx, sy, ex, ey; - sx = vram->clip.l - x; if (sx < 0) sx = 0; - sy = vram->clip.t - y; if (sy < 0) sy = 0; - ex = vram->clip.r - x; if (ex > TIC_SPRITESIZE) ex = TIC_SPRITESIZE; - ey = vram->clip.b - y; if (ey > TIC_SPRITESIZE) ey = TIC_SPRITESIZE; + sx = core->state.vbank.clip.l - x; if (sx < 0) sx = 0; + sy = core->state.vbank.clip.t - y; if (sy < 0) sy = 0; + ex = core->state.vbank.clip.r - x; if (ex > TIC_SPRITESIZE) ex = TIC_SPRITESIZE; + ey = core->state.vbank.clip.b - y; if (ey > TIC_SPRITESIZE) ey = TIC_SPRITESIZE; y += sy; x += sx; switch (orientation) { @@ -202,7 +202,7 @@ static void drawSprite(tic_core* core, s32 index, s32 x, s32 y, s32 w, s32 h, u8 rotate &= 0b11; flip &= 0b11; - tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.vars.blit); + tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.blit.segment); if (w == 1 && h == 1) { tic_tileptr tile = tic_tilesheet_gettile(&sheet, index, false); drawTile(core, &tile, x, y, colors, count, scale, flip, rotate); @@ -259,7 +259,7 @@ static void drawMap(tic_core* core, const tic_map* src, s32 x, s32 y, s32 width, { const s32 size = TIC_SPRITESIZE * scale; - tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.vars.blit); + tic_tilesheet sheet = getTileSheetFromSegment(&core->memory, core->memory.ram.vram.blit.segment); for (s32 j = y, jj = sy; j < y + height; j++, jj += size) for (s32 i = x, ii = sx; i < x + width; i++, ii += size) @@ -352,15 +352,15 @@ void tic_api_clip(tic_mem* memory, s32 x, s32 y, s32 width, s32 height) tic_core* core = (tic_core*)memory; tic_vram* vram = &memory->ram.vram; - vram->clip.l = x; - vram->clip.t = y; - vram->clip.r = x + width; - vram->clip.b = y + height; + core->state.vbank.clip.l = x; + core->state.vbank.clip.t = y; + core->state.vbank.clip.r = x + width; + core->state.vbank.clip.b = y + height; - if (vram->clip.l < 0) vram->clip.l = 0; - if (vram->clip.t < 0) vram->clip.t = 0; - if (vram->clip.r > TIC80_WIDTH) vram->clip.r = TIC80_WIDTH; - if (vram->clip.b > TIC80_HEIGHT) vram->clip.b = TIC80_HEIGHT; + if (core->state.vbank.clip.l < 0) core->state.vbank.clip.l = 0; + if (core->state.vbank.clip.t < 0) core->state.vbank.clip.t = 0; + if (core->state.vbank.clip.r > TIC80_WIDTH) core->state.vbank.clip.r = TIC80_WIDTH; + if (core->state.vbank.clip.b > TIC80_HEIGHT) core->state.vbank.clip.b = TIC80_HEIGHT; } void tic_api_rect(tic_mem* memory, s32 x, s32 y, s32 width, s32 height, u8 color) @@ -372,17 +372,33 @@ void tic_api_rect(tic_mem* memory, s32 x, s32 y, s32 width, s32 height, u8 color void tic_api_cls(tic_mem* memory, u8 color) { + tic_core* core = (tic_core*)memory; tic_vram* vram = &memory->ram.vram; static const u8 EmptyClip[] = { 0, 0, TIC80_WIDTH, TIC80_HEIGHT }; - tic_core* core = (tic_core*)memory; + if (memcmp(&core->state.vbank.clip, &EmptyClip, sizeof EmptyClip) == 0) + { + memset(&vram->screen, (color & 0xf) | (color << TIC_PALETTE_BPP), sizeof(tic_screen)); - if (memcmp(&vram->clip, &EmptyClip, sizeof EmptyClip) == 0) - tic_api_memset(memory, 0, (color & 0xf) | (color << TIC_PALETTE_BPP), sizeof(tic_screen)); + // clear OVR memmask + if(core->state.vbank.id) + ZEROMEM(core->state.vbank.memmask); + } else - tic_api_rect(memory, vram->clip.l, vram->clip.t, - vram->clip.r - vram->clip.l, vram->clip.b - vram->clip.t, color); + { + tic_rect rect = {core->state.vbank.clip.l, core->state.vbank.clip.t, core->state.vbank.clip.r - core->state.vbank.clip.l, core->state.vbank.clip.b - core->state.vbank.clip.t}; + + tic_api_rect(memory, rect.x, rect.y, rect.w, rect.h, color); + + // clear OVR memmask + if(core->state.vbank.id) + { + for(u8 *ptr = core->state.vbank.memmask + rect.x + rect.y * TIC80_WIDTH, + *end = ptr + (rect.w - 1) + (rect.h - 1) * TIC80_WIDTH; ptr < end; ptr += TIC80_WIDTH) + memset(ptr, 0, rect.w); + } + } } s32 tic_api_font(tic_mem* memory, const char* text, s32 x, s32 y, u8 chromakey, s32 w, s32 h, bool fixed, s32 scale, bool alt) @@ -391,10 +407,10 @@ s32 tic_api_font(tic_mem* memory, const char* text, s32 x, s32 y, u8 chromakey, // Compatibility : flip top and bottom of the spritesheet // to preserve tic_api_font's default target - u8 segment = memory->ram.vram.vars.blit >> 1; + u8 segment = memory->ram.vram.blit.segment >> 1; u8 flipmask = 1; while (segment >>= 1) flipmask <<= 1; - tic_tilesheet font_face = getTileSheetFromSegment(memory, memory->ram.vram.vars.blit ^ flipmask); + tic_tilesheet font_face = getTileSheetFromSegment(memory, memory->ram.vram.blit.segment ^ flipmask); return drawText((tic_core*)memory, &font_face, text, x, y, w, h, fixed, mapping, scale, alt); } @@ -554,13 +570,13 @@ static void drawSidesBuffer(tic_mem* memory, s32 y0, s32 y1, u8 color) tic_vram* vram = &memory->ram.vram; tic_core* core = (tic_core*)memory; - s32 yt = MAX(vram->clip.t, y0); - s32 yb = MIN(vram->clip.b, y1 + 1); + s32 yt = MAX(core->state.vbank.clip.t, y0); + s32 yb = MIN(core->state.vbank.clip.b, y1 + 1); u8 final_color = mapColor(&core->memory, color); for (s32 y = yt; y < yb; y++) { - s32 xl = MAX(SidesBuffer.Left[y], vram->clip.l); - s32 xr = MIN(SidesBuffer.Right[y] + 1, vram->clip.r); + s32 xl = MAX(SidesBuffer.Left[y], core->state.vbank.clip.l); + s32 xr = MIN(SidesBuffer.Right[y] + 1, core->state.vbank.clip.r); s32 start = y * TIC80_WIDTH; for(s32 i = start + xl, end = start + xr; i < end; ++i) @@ -714,7 +730,7 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f TexVert V0, V1, V2; const u8* map = memory->ram.map.data; - tic_tilesheet sheet = getTileSheetFromSegment(memory, memory->ram.vram.vars.blit); + tic_tilesheet sheet = getTileSheetFromSegment(memory, memory->ram.vram.blit.segment); V0.x = x1; V0.y = y1; V0.u = u1; V0.v = v1; V1.x = x2; V1.y = y2; V1.u = u2; V1.v = v2; @@ -747,7 +763,7 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f // if it's backwards skip it s32 width = SidesBuffer.Right[y] - SidesBuffer.Left[y]; // if it's off top or bottom , skip this line - if ((y < vram->clip.t) || (y > vram->clip.b)) + if ((y < core->state.vbank.clip.t) || (y > core->state.vbank.clip.b)) width = 0; if (width > 0) { @@ -756,15 +772,15 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f s32 left = SidesBuffer.Left[y]; s32 right = SidesBuffer.Right[y]; // check right edge, and CLAMP it - if (right > vram->clip.r) - right = vram->clip.r; + if (right > core->state.vbank.clip.r) + right = core->state.vbank.clip.r; // check left edge and offset UV's if we are off the left - if (left < vram->clip.l) + if (left < core->state.vbank.clip.l) { - s32 dist = vram->clip.l - SidesBuffer.Left[y]; + s32 dist = core->state.vbank.clip.l - SidesBuffer.Left[y]; u += dudxs * dist; v += dvdxs * dist; - left = vram->clip.l; + left = core->state.vbank.clip.l; } // are we drawing from the map . ok then at least check before the inner loop if (use_map == true) diff --git a/src/defines.h b/src/defines.h index 9b701b76a..a075576bd 100644 --- a/src/defines.h +++ b/src/defines.h @@ -35,7 +35,6 @@ #define CONCAT2(a, b) a ## b #define CONCAT(a, b) CONCAT2(a, b) #define MACROVAR(name) CONCAT(name, __LINE__) -#define DEFER(start, end) for(start, *MACROVAR(_i_) = NULL; !MACROVAR(_i_); ++MACROVAR(_i_), end) #define SCOPE(exp) for(int MACROVAR(_i_) = 0; !MACROVAR(_i_); ++MACROVAR(_i_), exp) #define FOR(type,it,list) for(type it = list, *MACROVAR(_end_) = it + COUNT_OF(list); it != MACROVAR(_end_); ++it) #define RFOR(type,it,list) for(type it = list + (COUNT_OF(list) - 1), *MACROVAR(_end_) = list; it >= MACROVAR(_end_); --it) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index c876fe376..0e33931bc 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -420,12 +420,12 @@ static void initBlitMode(Map* map) { tic_mem* tic = map->tic; tiles2ram(&tic->ram, getBankTiles()); - tic->ram.vram.vars.blit = tic_blit_calc_segment(&map->sheet.blit); + tic->ram.vram.blit.segment = tic_blit_calc_segment(&map->sheet.blit); } static void resetBlitMode(tic_mem* tic) { - tic->ram.vram.vars.blit = TIC_DEFAULT_BLIT_MODE; + tic->ram.vram.blit.segment = TIC_DEFAULT_BLIT_MODE; } static void drawSheetReg(Map* map, s32 x, s32 y) @@ -1246,6 +1246,49 @@ static void tick(Map* map) drawMapReg(map); drawSheetReg(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE); + + OVR(tic) + { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + + tic_api_clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (sheetVisible(map) ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE); + { + s32 screenScrollX = map->scroll.x % TIC80_WIDTH; + s32 screenScrollY = map->scroll.y % TIC80_HEIGHT; + + tic_api_line(tic, 0, TIC80_HEIGHT - screenScrollY, TIC80_WIDTH, TIC80_HEIGHT - screenScrollY, tic_color_grey); + tic_api_line(tic, TIC80_WIDTH - screenScrollX, 0, TIC80_WIDTH - screenScrollX, TIC80_HEIGHT, tic_color_grey); + } + tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + + drawSheetOvr(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE); + + { + tic_rect rect = {MAP_X, MAP_Y, MAP_WIDTH, MAP_HEIGHT}; + if(!sheetVisible(map) && checkMousePos(&rect) && !tic_api_key(tic, tic_key_space)) + { + switch(map->mode) + { + case MAP_DRAW_MODE: + case MAP_FILL_MODE: + drawTileCursorOvr(map); + break; + case MAP_SELECT_MODE: + if(map->paste) + drawPasteDataOvr(map); + break; + default: + break; + } + } + } + + if(!sheetVisible(map)) + drawSelectionOvr(map); + + drawMapToolbar(map, TIC80_WIDTH, 1); + drawToolbar(map->tic, false); + } } static void onStudioEvent(Map* map, StudioEvent event) @@ -1267,50 +1310,6 @@ static void scanline(tic_mem* tic, s32 row, void* data) memcpy(&tic->ram.vram.palette, getBankPalette(false), sizeof(tic_palette)); } -static void overline(tic_mem* tic, void* data) -{ - Map* map = (Map*)data; - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - - tic_api_clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (sheetVisible(map) ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE); - { - s32 screenScrollX = map->scroll.x % TIC80_WIDTH; - s32 screenScrollY = map->scroll.y % TIC80_HEIGHT; - - tic_api_line(tic, 0, TIC80_HEIGHT - screenScrollY, TIC80_WIDTH, TIC80_HEIGHT - screenScrollY, tic_color_grey); - tic_api_line(tic, TIC80_WIDTH - screenScrollX, 0, TIC80_WIDTH - screenScrollX, TIC80_HEIGHT, tic_color_grey); - } - tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); - - drawSheetOvr(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE); - - { - tic_rect rect = {MAP_X, MAP_Y, MAP_WIDTH, MAP_HEIGHT}; - if(!sheetVisible(map) && checkMousePos(&rect) && !tic_api_key(tic, tic_key_space)) - { - switch(map->mode) - { - case MAP_DRAW_MODE: - case MAP_FILL_MODE: - drawTileCursorOvr(map); - break; - case MAP_SELECT_MODE: - if(map->paste) - drawPasteDataOvr(map); - break; - default: - break; - } - } - } - - if(!sheetVisible(map)) - drawSelectionOvr(map); - - drawMapToolbar(map, TIC80_WIDTH, 1); - drawToolbar(map->tic, false); -} - void initMap(Map* map, tic_mem* tic, tic_map* src) { if(map->history) history_delete(map->history); @@ -1353,7 +1352,6 @@ void initMap(Map* map, tic_mem* tic, tic_map* src) }, .history = history_create(src, sizeof(tic_map)), .event = onStudioEvent, - .overline = overline, .scanline = scanline, }; diff --git a/src/studio/editors/map.h b/src/studio/editors/map.h index c6ca05730..0c509dc99 100644 --- a/src/studio/editors/map.h +++ b/src/studio/editors/map.h @@ -86,7 +86,6 @@ struct Map void (*tick)(Map*); void (*event)(Map*, StudioEvent); void (*scanline)(tic_mem* tic, s32 row, void* data); - void (*overline)(tic_mem* tic, void* data); }; void initMap(Map*, tic_mem*, tic_map* src); diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index c4067c16e..664b4d0fa 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -1290,9 +1290,9 @@ static void drawSheet(Sprite* sprite, s32 x, s32 y) { tic_mem* tic = sprite->tic; tiles2ram(&tic->ram, sprite->src); - tic->ram.vram.vars.blit = tic_blit_calc_segment(&sprite->blit); + tic->ram.vram.blit.segment = tic_blit_calc_segment(&sprite->blit); tic_api_spr(tic, 0, x, y, TIC_SPRITESHEET_COLS, TIC_SPRITESHEET_COLS, NULL, 0, 1, tic_no_flip, tic_no_rotate); - tic->ram.vram.vars.blit = TIC_DEFAULT_BLIT_MODE; + tic->ram.vram.blit.segment = TIC_DEFAULT_BLIT_MODE; } static void flipSpriteHorz(Sprite* sprite) @@ -1475,7 +1475,8 @@ static void copyToClipboard(Sprite* sprite) { s32 size = sprite->size * sprite->size * TIC_PALETTE_BPP / BITS_IN_BYTE; - DEFER(u8* buffer = malloc(size), free(buffer)) + u8* buffer = malloc(size); + SCOPE(free(buffer)) { tic_rect rect = getSpriteRect(sprite); s32 r = rect.x + rect.w; @@ -1499,7 +1500,8 @@ static void copyFromClipboard(Sprite* sprite) { s32 size = sprite->size * sprite->size * TIC_PALETTE_BPP / BITS_IN_BYTE; - DEFER(u8* buffer = malloc(size), free(buffer)) + u8* buffer = malloc(size); + SCOPE(free(buffer)) { if(fromClipboard(buffer, size, true, false)) { @@ -1813,50 +1815,6 @@ static void drawSpriteToolbar(Sprite* sprite) } } -static void tick(Sprite* sprite) -{ - tic_mem* tic = sprite->tic; - - // process scroll - { - tic80_input* input = &tic->ram.input; - - if(input->mouse.scrolly) - { - s32 size = sprite->size; - s32 delta = input->mouse.scrolly; - - if(delta > 0) - { - if(size < (TIC_SPRITESIZE * TIC_SPRITESIZE)) size <<= 1; - } - else if(size > TIC_SPRITESIZE) size >>= 1; - - updateSpriteSize(sprite, size); - } - } - - processKeyboard(sprite); - - drawCanvas(sprite, CanvasX, CanvasY); - drawPalette(sprite, PaletteX, PaletteY); - drawSheet(sprite, SheetX, SheetY); - - sprite->tickCounter++; -} - -static void onStudioEvent(Sprite* sprite, StudioEvent event) -{ - switch(event) - { - case TIC_TOOLBAR_CUT: cutToClipboard(sprite); break; - case TIC_TOOLBAR_COPY: copyToClipboard(sprite); break; - case TIC_TOOLBAR_PASTE: copyFromClipboard(sprite); break; - case TIC_TOOLBAR_UNDO: undo(sprite); break; - case TIC_TOOLBAR_REDO: redo(sprite); break; - } -} - static void scanline(tic_mem* tic, s32 row, void* data) { Sprite* sprite = (Sprite*)data; @@ -1894,52 +1852,94 @@ static void drawAdvancedButton(Sprite* sprite, s32 x, s32 y) tic_api_rect(tic, rect.x + Gap + (sprite->advanced ? Size : 0), rect.y + Gap, Size, Size, over ? tic_color_light_grey : tic_color_grey); } -static void overline(tic_mem* tic, void* data) +static void tick(Sprite* sprite) { - static const tic_rect bg[] = + tic_mem* tic = sprite->tic; + + // process scroll { - {0, ToolbarH, SheetX, CanvasY-ToolbarH}, - {0, CanvasY, CanvasX, CanvasH}, - {CanvasX + CanvasW, CanvasY, SheetX - (CanvasX + CanvasW), CanvasH}, + tic80_input* input = &tic->ram.input; - {0, CanvasY + CanvasH, SheetX, PaletteY - CanvasY - CanvasH}, + if(input->mouse.scrolly) + { + s32 size = sprite->size; + s32 delta = input->mouse.scrolly; - {0, PaletteY, PaletteX, PaletteH}, - {PaletteX + PaletteW, PaletteY, SheetX - PaletteX - PaletteW, PaletteH}, + if(delta > 0) + { + if(size < (TIC_SPRITESIZE * TIC_SPRITESIZE)) size <<= 1; + } + else if(size > TIC_SPRITESIZE) size >>= 1; - {0, PaletteY + PaletteH, SheetX, TIC80_HEIGHT - PaletteY - PaletteH}, - }; + updateSpriteSize(sprite, size); + } + } - Sprite* sprite = (Sprite*)data; + processKeyboard(sprite); - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + drawCanvas(sprite, CanvasX, CanvasY); + drawPalette(sprite, PaletteX, PaletteY); + drawSheet(sprite, SheetX, SheetY); - for(const tic_rect* r = bg; r < bg + COUNT_OF(bg); r++) - tic_api_rect(tic, r->x, r->y, r->w, r->h, tic_color_grey); + OVR(tic) + { + static const tic_rect bg[] = + { + {0, ToolbarH, SheetX, CanvasY-ToolbarH}, + {0, CanvasY, CanvasX, CanvasH}, + {CanvasX + CanvasW, CanvasY, SheetX - (CanvasX + CanvasW), CanvasH}, - drawCanvasOvr(sprite, 24, 20); - drawMoveButtons(sprite); + {0, CanvasY + CanvasH, SheetX, PaletteY - CanvasY - CanvasH}, - if(sprite->advanced) - { - if(sprite->blit.mode == 4) - drawFlags(sprite, 24+64+7, 20+8); + {0, PaletteY, PaletteX, PaletteH}, + {PaletteX + PaletteW, PaletteY, SheetX - PaletteX - PaletteW, PaletteH}, - drawBitMode(sprite, PaletteX, PaletteY + PaletteH + 2, PaletteW, 8); - } + {0, PaletteY + PaletteH, SheetX, TIC80_HEIGHT - PaletteY - PaletteH}, + }; - drawBankTabs(sprite, SheetX, 8); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - sprite->palette.edit - ? drawRGBSliders(sprite, 24, 91) - : drawTools(sprite, 12, 96); + for(const tic_rect* r = bg; r < bg + COUNT_OF(bg); r++) + tic_api_rect(tic, r->x, r->y, r->w, r->h, tic_color_grey); - drawPaletteOvr(sprite, 24, 112); - drawSheetOvr(sprite, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, 7); - drawAdvancedButton(sprite, 4, 11); - - drawSpriteToolbar(sprite); - drawToolbar(tic, false); + drawCanvasOvr(sprite, 24, 20); + drawMoveButtons(sprite); + + if(sprite->advanced) + { + if(sprite->blit.mode == 4) + drawFlags(sprite, 24+64+7, 20+8); + + drawBitMode(sprite, PaletteX, PaletteY + PaletteH + 2, PaletteW, 8); + } + + drawBankTabs(sprite, SheetX, 8); + + sprite->palette.edit + ? drawRGBSliders(sprite, 24, 91) + : drawTools(sprite, 12, 96); + + drawPaletteOvr(sprite, 24, 112); + drawSheetOvr(sprite, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, 7); + drawAdvancedButton(sprite, 4, 11); + + drawSpriteToolbar(sprite); + drawToolbar(tic, false); + } + + sprite->tickCounter++; +} + +static void onStudioEvent(Sprite* sprite, StudioEvent event) +{ + switch(event) + { + case TIC_TOOLBAR_CUT: cutToClipboard(sprite); break; + case TIC_TOOLBAR_COPY: copyToClipboard(sprite); break; + case TIC_TOOLBAR_PASTE: copyFromClipboard(sprite); break; + case TIC_TOOLBAR_UNDO: undo(sprite); break; + case TIC_TOOLBAR_REDO: redo(sprite); break; + } } void initSprite(Sprite* sprite, tic_mem* tic, tic_tiles* src) @@ -1978,7 +1978,6 @@ void initSprite(Sprite* sprite, tic_mem* tic, tic_tiles* src) .mode = SPRITE_DRAW_MODE, .history = history_create(src, TIC_SPRITES * sizeof(tic_tile)), .event = onStudioEvent, - .overline = overline, .scanline = scanline, }; switchBitMode(sprite, TIC_DEFAULT_BIT_DEPTH); diff --git a/src/studio/editors/sprite.h b/src/studio/editors/sprite.h index d28480319..b84679534 100644 --- a/src/studio/editors/sprite.h +++ b/src/studio/editors/sprite.h @@ -75,7 +75,6 @@ struct Sprite void (*tick)(Sprite*); void (*event)(Sprite*, StudioEvent); void (*scanline)(tic_mem* tic, s32 row, void* data); - void (*overline)(tic_mem* tic, void* data); }; typedef struct diff --git a/src/studio/editors/world.c b/src/studio/editors/world.c index 549d3b4a4..d6e805756 100644 --- a/src/studio/editors/world.c +++ b/src/studio/editors/world.c @@ -79,9 +79,17 @@ static void drawGrid(World* world) static void tick(World* world) { + tic_mem* tic = world->tic; + if(keyWasPressed(tic_key_tab)) setStudioMode(TIC_MAP_MODE); - memcpy(&world->tic->ram.vram, world->preview, PREVIEW_SIZE); + memcpy(&tic->ram.vram, world->preview, PREVIEW_SIZE); + + OVR(tic) + { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + drawGrid(world); + } } static void scanline(tic_mem* tic, s32 row, void* data) @@ -90,15 +98,6 @@ static void scanline(tic_mem* tic, s32 row, void* data) memcpy(&tic->ram.vram.palette, getBankPalette(false), sizeof(tic_palette)); } -static void overline(tic_mem* tic, void* data) -{ - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - - World* world = (World*)data; - - drawGrid(world); -} - void initWorld(World* world, tic_mem* tic, Map* map) { if(!world->preview) @@ -110,7 +109,6 @@ void initWorld(World* world, tic_mem* tic, Map* map) .map = map, .tick = tick, .preview = world->preview, - .overline = overline, .scanline = scanline, }; diff --git a/src/studio/editors/world.h b/src/studio/editors/world.h index f47600579..c316e371c 100644 --- a/src/studio/editors/world.h +++ b/src/studio/editors/world.h @@ -36,7 +36,6 @@ struct World void (*tick)(World* world); void (*scanline)(tic_mem* tic, s32 row, void* data); - void (*overline)(tic_mem* tic, void* data); }; void initWorld(World* world, tic_mem* tic, Map* map); diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 596e0fb6a..a45d453ed 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2769,10 +2769,11 @@ static s32 createVRamTable(char* buf) {offsetof(tic_ram, vram.screen), "SCREEN"}, {offsetof(tic_ram, vram.palette), "PALETTE"}, {offsetof(tic_ram, vram.mapping), "PALETTE MAP"}, - {offsetof(tic_ram, vram.vars), "BORDER / BLIT SEG"}, + {offsetof(tic_ram, vram.vars), "BORDER COLOR"}, {offsetof(tic_ram, vram.vars.offset), "SCREEN OFFSET"}, {offsetof(tic_ram, vram.vars.cursor), "MOUSE CURSOR"}, - {offsetof(tic_ram, vram.clip), "CLIP"}, + {offsetof(tic_ram, vram.blit), "BLIT SEGMENT"}, + {offsetof(tic_ram, vram.reserved), "... (reserved) "}, {TIC_VRAM_SIZE, ""}, }; diff --git a/src/studio/screens/dialog.c b/src/studio/screens/dialog.c index 29437ff94..38113c3a5 100644 --- a/src/studio/screens/dialog.c +++ b/src/studio/screens/dialog.c @@ -191,6 +191,12 @@ static void tick(Dialog* dlg) tic_mem* tic = dlg->tic; drawBGAnimation(tic, dlg->ticks); + + OVR(tic) + { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + drawDialog(dlg); + } } static void scanline(tic_mem* tic, s32 row, void* data) @@ -200,15 +206,6 @@ static void scanline(tic_mem* tic, s32 row, void* data) drawBGAnimationScanline(tic, row); } -static void overline(tic_mem* tic, void* data) -{ - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - - Dialog* dlg = (Dialog*)data; - - drawDialog(dlg); -} - static void escape(Dialog* dlg) { dlg->callback(false, dlg->data); @@ -223,7 +220,6 @@ void initDialog(Dialog* dlg, tic_mem* tic, const char** text, s32 rows, DialogCa .tic = tic, .tick = tick, .scanline = scanline, - .overline = overline, .escape = escape, .ticks = 0, .callback = callback, diff --git a/src/studio/screens/dialog.h b/src/studio/screens/dialog.h index c42c6dea1..be3b4b3a1 100644 --- a/src/studio/screens/dialog.h +++ b/src/studio/screens/dialog.h @@ -49,7 +49,6 @@ struct Dialog void(*tick)(Dialog* Dialog); void (*scanline)(tic_mem* tic, s32 row, void* data); - void (*overline)(tic_mem* tic, void* data); void(*escape)(Dialog* Dialog); }; diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index 282442554..acbafcf41 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -497,6 +497,21 @@ static void tick(Menu* menu) tic_api_sync(tic, tic_sync_screen, 0, false); else drawBGAnimation(tic, menu->ticks); + + OVR(tic) + { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + + switch(menu->mode) + { + case MAIN_MENU_MODE: + drawMainMenu(menu); + break; + case GAMEPAD_MENU_MODE: + drawGamepadMenu(menu); + break; + } + } } static void scanline(tic_mem* tic, s32 row, void* data) @@ -512,23 +527,6 @@ static void scanline(tic_mem* tic, s32 row, void* data) drawBGAnimationScanline(tic, row); } -static void overline(tic_mem* tic, void* data) -{ - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - - Menu* menu = (Menu*)data; - - switch(menu->mode) - { - case MAIN_MENU_MODE: - drawMainMenu(menu); - break; - case GAMEPAD_MENU_MODE: - drawGamepadMenu(menu); - break; - } -} - void initMenu(Menu* menu, tic_mem* tic, tic_fs* fs) { *menu = (Menu) @@ -539,7 +537,6 @@ void initMenu(Menu* menu, tic_mem* tic, tic_fs* fs) .tic = tic, .tick = tick, .scanline = scanline, - .overline = overline, .ticks = 0, .pos = {0, 0}, .main = diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index 7f922e423..bf56c7bb6 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -62,7 +62,6 @@ struct Menu void(*tick)(Menu* Menu); void (*scanline)(tic_mem* tic, s32 row, void* data); - void (*overline)(tic_mem* tic, void* data); }; void initMenu(Menu* menu, tic_mem* tic, struct tic_fs* fs); diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 4b46d745a..78c54f14f 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -876,6 +876,25 @@ static void tick(Surf* surf) if(cover) memcpy(tic->ram.vram.screen.data, cover->data, sizeof(tic_screen)); } + + OVR(tic) + { + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + + if(surf->menu.count > 0) + { + drawMenu(surf, AnimVar.menuX, (TIC80_HEIGHT - MENU_HEIGHT)/2); + } + else if(!surf->loading) + { + static const char Label[] = "You don't have any files..."; + s32 size = tic_api_print(tic, Label, 0, -TIC_FONT_HEIGHT, tic_color_white, true, 1, false); + tic_api_print(tic, Label, (TIC80_WIDTH - size) / 2, (TIC80_HEIGHT - TIC_FONT_HEIGHT)/2, tic_color_white, true, 1, false); + } + + drawTopToolbar(surf, 0, AnimVar.topBarY - MENU_HEIGHT); + drawBottomToolbar(surf, 0, TIC80_HEIGHT - AnimVar.bottomBarY); + } } static void resume(Surf* surf) @@ -906,27 +925,6 @@ static void scanline(tic_mem* tic, s32 row, void* data) drawBGAnimationScanline(tic, row); } -static void overline(tic_mem* tic, void* data) -{ - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); - - Surf* surf = (Surf*)data; - - if(surf->menu.count > 0) - { - drawMenu(surf, AnimVar.menuX, (TIC80_HEIGHT - MENU_HEIGHT)/2); - } - else if(!surf->loading) - { - static const char Label[] = "You don't have any files..."; - s32 size = tic_api_print(tic, Label, 0, -TIC_FONT_HEIGHT, tic_color_white, true, 1, false); - tic_api_print(tic, Label, (TIC80_WIDTH - size) / 2, (TIC80_HEIGHT - TIC_FONT_HEIGHT)/2, tic_color_white, true, 1, false); - } - - drawTopToolbar(surf, 0, AnimVar.topBarY - MENU_HEIGHT); - drawBottomToolbar(surf, 0, TIC80_HEIGHT - AnimVar.bottomBarY); -} - void initSurf(Surf* surf, tic_mem* tic, struct Console* console) { *surf = (Surf) @@ -948,7 +946,6 @@ void initSurf(Surf* surf, tic_mem* tic, struct Console* console) .items = NULL, .count = 0, }, - .overline = overline, .scanline = scanline, }; diff --git a/src/studio/screens/surf.h b/src/studio/screens/surf.h index af913f52b..3bb6609f4 100644 --- a/src/studio/screens/surf.h +++ b/src/studio/screens/surf.h @@ -50,7 +50,6 @@ struct Surf void(*tick)(Surf* surf); void(*resume)(Surf* surf); void (*scanline)(tic_mem* tic, s32 row, void* data); - void (*overline)(tic_mem* tic, void* data); }; void initSurf(Surf* surf, tic_mem* tic, struct Console* console); diff --git a/src/studio/studio.c b/src/studio/studio.c index 0d9cc658a..a4a4c69bb 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1237,7 +1237,10 @@ void setCursor(tic_cursor id) { tic_mem* tic = impl.studio.tic; - tic->ram.vram.vars.cursor.sprite = id; + VBANK(tic, 0) + { + tic->ram.vram.vars.cursor.sprite = id; + } } #if defined(BUILD_EDITORS) @@ -1742,7 +1745,6 @@ static void recordFrame(u32* pixels) if(impl.video.frame % TIC80_FRAMERATE < TIC80_FRAMERATE / 2) { - const u32* pal = tic_tool_palette_blit(&impl.config->cart->bank0.palette.scn, TIC80_PIXEL_COLOR_RGBA8888); drawRecordLabel(pixels, TIC80_WIDTH-24, 8); } @@ -1798,6 +1800,15 @@ static void renderStudio() } processShortcuts(); + + // clear screen for all the modes except the Run mode + if(impl.mode != TIC_RUN_MODE) + { + OVR(tic) + { + tic_api_cls(tic, 0); + } + } switch(impl.mode) { @@ -2010,14 +2021,14 @@ static void studioTick() tic_blit_callback callback[TIC_MODES_COUNT] = { - [TIC_MENU_MODE] = {impl.menu->scanline, impl.menu->overline, NULL, impl.menu}, + [TIC_MENU_MODE] = {impl.menu->scanline, NULL, NULL, impl.menu}, #if defined(BUILD_EDITORS) - [TIC_SPRITE_MODE] = {sprite->scanline, sprite->overline, NULL, sprite}, - [TIC_MAP_MODE] = {map->scanline, map->overline, NULL, map}, - [TIC_WORLD_MODE] = {impl.world->scanline, impl.world->overline, NULL, impl.world}, - [TIC_DIALOG_MODE] = {impl.dialog->scanline, impl.dialog->overline, NULL, impl.dialog}, - [TIC_SURF_MODE] = {impl.surf->scanline, impl.surf->overline, NULL, impl.surf}, + [TIC_SPRITE_MODE] = {sprite->scanline, NULL, NULL, sprite}, + [TIC_MAP_MODE] = {map->scanline, NULL, NULL, map}, + [TIC_WORLD_MODE] = {impl.world->scanline, NULL, NULL, impl.world}, + [TIC_DIALOG_MODE] = {impl.dialog->scanline, NULL, NULL, impl.dialog}, + [TIC_SURF_MODE] = {impl.surf->scanline, NULL, NULL, impl.surf}, #endif }; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 44623e8e3..8ec9807ed 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -293,20 +293,23 @@ static void setWindowIcon() { enum{ Size = 64, TileSize = 16, ColorKey = 14, Cols = TileSize / TIC_SPRITESIZE, Scale = Size/TileSize}; - DEFER(u32* pixels = SDL_malloc(Size * Size * sizeof(u32)), SDL_free(pixels)) + u32* pixels = SDL_malloc(Size * Size * sizeof(u32)); + SCOPE(SDL_free(pixels)) { - const u32* pal = tic_tool_palette_blit(&platform.studio->config()->cart->bank0.palette.scn, platform.studio->tic->screen_format); + tic_blitpal pal = tic_tool_palette_blit(&platform.studio->config()->cart->bank0.palette.scn, platform.studio->tic->screen_format); for(s32 j = 0, index = 0; j < Size; j++) for(s32 i = 0; i < Size; i++, index++) { u8 color = getSpritePixel(platform.studio->config()->cart->bank0.tiles.data, i/Scale, j/Scale); - pixels[index] = color == ColorKey ? 0 : pal[color]; + pixels[index] = color == ColorKey ? 0 : pal.data[color]; } - DEFER(SDL_Surface* surface = SDL_CreateRGBSurfaceFrom(pixels, Size, Size, + SDL_Surface* surface = SDL_CreateRGBSurfaceFrom(pixels, Size, Size, sizeof(s32) * BITS_IN_BYTE, Size * sizeof(s32), - 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000), SDL_FreeSurface(surface)) + 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); + + SCOPE(SDL_FreeSurface(surface)) { SDL_SetWindowIcon(platform.window, surface); } @@ -1261,7 +1264,6 @@ static void renderGamepad() GPU_BlitScale(platform.gamepad.touch.texture.gpu, &src, platform.screen.renderer.gpu, dest.x, dest.y, (float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); } - else #else { SDL_Rect src = {i * TIC_SPRITESIZE + Left, (tile->press ? TIC_SPRITESIZE : 0) + TIC80_MARGIN_TOP, TIC_SPRITESIZE, TIC_SPRITESIZE}; diff --git a/src/tic.h b/src/tic.h index e4edaf731..ab9bf5ea6 100644 --- a/src/tic.h +++ b/src/tic.h @@ -387,6 +387,11 @@ typedef union u8 data[TIC_PALETTE_SIZE * sizeof(tic_rgb)]; } tic_palette; +typedef struct +{ + u32 data[TIC_PALETTE_SIZE]; +} tic_blitpal; + typedef struct { tic_tile data[TIC_BANK_SPRITES]; @@ -397,10 +402,15 @@ typedef struct u8 data[TIC_FLAGS]; } tic_flags; -typedef struct +typedef union { - tic_palette scn; - tic_palette ovr; + struct + { + tic_palette scn; + tic_palette ovr; + }; + + tic_palette data[2]; } tic_palettes; typedef struct @@ -465,7 +475,7 @@ typedef union struct { u8 border:TIC_PALETTE_BPP; - u8 blit:4; + u8 tmp:4; struct { @@ -478,13 +488,15 @@ typedef union u8 sprite:7; bool system:1; } cursor; - } vars; struct { - u8 l, t, r, b; - } clip; + u8 segment:4; + u8 reserved:4; + } blit; + + u8 reserved[3]; }; u8 data[TIC_VRAM_SIZE]; diff --git a/src/tools.c b/src/tools.c index 5bb94493f..cb8bf8874 100644 --- a/src/tools.c +++ b/src/tools.c @@ -107,13 +107,13 @@ u32 tic_nearest_color(const tic_rgb* palette, const tic_rgb* color, s32 count) return nearest; } -u32* tic_tool_palette_blit(const tic_palette* srcpal, tic80_pixel_color_format fmt) +tic_blitpal tic_tool_palette_blit(const tic_palette* srcpal, tic80_pixel_color_format fmt) { - static u32 pal[TIC_PALETTE_SIZE]; + tic_blitpal pal; const tic_rgb* src = srcpal->colors; const tic_rgb* end = src + TIC_PALETTE_SIZE; - u8* dst = (u8*)pal; + u8* dst = (u8*)pal.data; while(src != end) { diff --git a/src/tools.h b/src/tools.h index 17cbc605b..d86856f89 100644 --- a/src/tools.h +++ b/src/tools.h @@ -79,10 +79,11 @@ inline u32 tic_rgba(const tic_rgb* c) return (0xff << 24) | (c->b << 16) | (c->g << 8) | (c->r << 0); } +tic_blitpal tic_tool_palette_blit(const tic_palette* src, tic80_pixel_color_format fmt); + bool tic_tool_parse_note(const char* noteStr, s32* note, s32* octave); s32 tic_tool_get_pattern_id(const tic_track* track, s32 frame, s32 channel); void tic_tool_set_pattern_id(tic_track* track, s32 frame, s32 channel, s32 id); -u32* tic_tool_palette_blit(const tic_palette* src, tic80_pixel_color_format fmt); bool tic_project_ext(const char* name); bool tic_tool_has_ext(const char* name, const char* ext); s32 tic_tool_get_track_row_sfx(const tic_track_row* row); From a13f380712735fb41df2b938444d6f1f4aa8cad2 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 1 Dec 2021 14:54:14 +0300 Subject: [PATCH 102/379] added --vsync cmd option as well as VSYNC=true option to the config #1652 --- build/assets/config.tic.dat | 2 +- config.lua | 1 + src/studio/config.c | 15 +++++++------- src/studio/studio.c | 5 +++-- src/studio/studio.h | 3 ++- src/studio/system.h | 3 ++- src/system/sdl/main.c | 41 +++++++++++++++---------------------- 7 files changed, 33 insertions(+), 37 deletions(-) diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index a8f67f8c0..73ecdb3fc 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x92, 0x58, 0x16, 0x49, 0x15, 0x49, 0xad, 0x9c, 0x72, 0xb9, 0x68, 0x10, 0x1c, 0x90, 0x88, 0x21, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x13, 0x3b, 0x1d, 0xac, 0x37, 0xce, 0xdb, 0x96, 0x68, 0x27, 0x76, 0x9e, 0xd0, 0x44, 0x1b, 0xe7, 0x9d, 0xad, 0x52, 0xbe, 0xaf, 0x1f, 0x33, 0x3d, 0x33, 0x3d, 0x43, 0x69, 0x2d, 0xdb, 0x1b, 0x86, 0x3d, 0x6c, 0xf5, 0x74, 0x7f, 0xfd, 0x7d, 0xfd, 0xbd, 0xa7, 0xa7, 0x07, 0xa5, 0x51, 0xcb, 0xb2, 0x9e, 0x7b, 0xf7, 0x53, 0xd6, 0x80, 0x41, 0xb9, 0x75, 0xeb, 0xd6, 0xed, 0xc3, 0xc3, 0xc3, 0xdb, 0xd8, 0x42, 0xf7, 0x36, 0xa3, 0x7e, 0x65, 0x6c, 0xe8, 0xdd, 0xba, 0xc5, 0xbc, 0xc3, 0x43, 0xea, 0xdd, 0xfa, 0x0d, 0xea, 0xb1, 0xdb, 0x94, 0xd1, 0xdb, 0x94, 0xaa, 0xca, 0xf1, 0x47, 0x47, 0x47, 0x0b, 0xd9, 0x6c, 0xb6, 0x80, 0x2d, 0x74, 0x0b, 0x80, 0xa7, 0x2a, 0xe2, 0x8f, 0x8e, 0x32, 0x2f, 0x9b, 0xa5, 0xde, 0xe8, 0xab, 0x80, 0x5f, 0xa0, 0x1e, 0x15, 0x75, 0x48, 0x0b, 0x16, 0xe3, 0xf8, 0x80, 0x3b, 0x5b, 0x2e, 0x97, 0x67, 0xb1, 0x85, 0xee, 0x2c, 0x81, 0x0a, 0xb8, 0xb3, 0x12, 0x3f, 0x9b, 0x65, 0x5e, 0xb9, 0x4c, 0xbd, 0x6c, 0x09, 0xf0, 0x67, 0xa9, 0x47, 0xa0, 0xd2, 0x59, 0xc0, 0x9f, 0x95, 0xf8, 0xfd, 0x7e, 0xbf, 0xd5, 0x68, 0x34, 0x5a, 0xd8, 0x42, 0x97, 0x57, 0x62, 0x11, 0x6c, 0x11, 0xbf, 0xdf, 0x67, 0x5e, 0xa3, 0x41, 0xbd, 0xfe, 0x36, 0xe0, 0xb7, 0x80, 0x66, 0x8b, 0x52, 0x0b, 0x2a, 0xb6, 0x5f, 0xbf, 0x7f, 0xff, 0xc5, 0xfb, 0x58, 0x1e, 0x3e, 0xb8, 0x7f, 0xdf, 0xf3, 0xee, 0x3f, 0xf4, 0xbc, 0x07, 0xd8, 0x85, 0x7f, 0x1e, 0x7e, 0xdb, 0xf3, 0x5e, 0x52, 0x70, 0x3e, 0x0e, 0x70, 0x3e, 0x2f, 0x06, 0x7f, 0x20, 0xf1, 0x65, 0x0b, 0xfd, 0x10, 0xfc, 0xa1, 0xa4, 0xff, 0x50, 0xe2, 0x3f, 0x0c, 0xf0, 0xbf, 0xd0, 0x68, 0xfc, 0x44, 0xe3, 0xc6, 0x76, 0xa3, 0xb1, 0x7d, 0x43, 0xd4, 0x7e, 0x9f, 0xb7, 0x30, 0x72, 0x63, 0xb7, 0xdf, 0x7f, 0xc1, 0xce, 0x66, 0x3f, 0x91, 0x1d, 0x7d, 0x35, 0x9b, 0x7d, 0xf5, 0x95, 0xac, 0xde, 0xc2, 0xdd, 0x2b, 0x3f, 0x35, 0x3a, 0xfa, 0xdc, 0xbb, 0x87, 0x87, 0x99, 0xc3, 0x2f, 0xbf, 0x73, 0xc8, 0xeb, 0x3b, 0x5f, 0x3e, 0x54, 0xf7, 0x70, 0xf7, 0xce, 0xaf, 0x7c, 0xe9, 0x4b, 0x23, 0x53, 0xe5, 0xf2, 0x99, 0x72, 0xe9, 0xb5, 0x32, 0xaf, 0xaf, 0x65, 0x41, 0xcb, 0xd8, 0x96, 0xca, 0x25, 0xf8, 0x17, 0x69, 0x73, 0x7b, 0xa3, 0xed, 0xf9, 0xf5, 0x35, 0x7e, 0xff, 0xcb, 0xe0, 0x07, 0xcc, 0xa2, 0xa8, 0xdb, 0x01, 0xbb, 0x6d, 0x31, 0xb0, 0xfd, 0xf0, 0x36, 0xd8, 0xff, 0x50, 0x56, 0xf4, 0x07, 0x8b, 0x0e, 0x3d, 0xc6, 0x3c, 0x8f, 0xdb, 0x1b, 0x6d, 0x9f, 0xbd, 0x0b, 0x2d, 0x5e, 0xd9, 0xec, 0x4f, 0x83, 0x1f, 0xf8, 0xf8, 0x05, 0x4a, 0xc1, 0xf6, 0xbc, 0x16, 0xb2, 0x94, 0x71, 0x3f, 0x18, 0x0d, 0xf0, 0xb9, 0xbd, 0xd1, 0xf6, 0xf7, 0xee, 0xdd, 0x9b, 0x2d, 0xcf, 0xce, 0xe2, 0x3d, 0xd2, 0xf0, 0xf1, 0x67, 0x29, 0x05, 0xdb, 0xd3, 0x7b, 0x50, 0x67, 0xcb, 0x94, 0x71, 0x3f, 0xc8, 0x06, 0xf8, 0xdc, 0xd6, 0x68, 0xfb, 0x06, 0xb6, 0x5f, 0xe1, 0xf7, 0xbf, 0x08, 0x7e, 0xe0, 0xe3, 0xb7, 0x2c, 0x06, 0xb6, 0x1f, 0xb6, 0xc0, 0xfe, 0x0d, 0x59, 0xd1, 0x1f, 0x14, 0x3e, 0x84, 0x81, 0x95, 0xe4, 0x03, 0x38, 0xae, 0xc3, 0xa3, 0x3e, 0x10, 0x86, 0xc7, 0x7d, 0x20, 0x04, 0x37, 0xf8, 0x80, 0x82, 0x27, 0xf9, 0x00, 0x8e, 0x23, 0x3c, 0xc9, 0x07, 0x70, 0x1c, 0xe1, 0x49, 0x3e, 0x80, 0xe3, 0x08, 0x4f, 0xf2, 0x01, 0x1c, 0x37, 0xc6, 0x2f, 0x2f, 0xd9, 0x42, 0x81, 0xdd, 0x35, 0xc5, 0x2f, 0xc0, 0xc1, 0x9e, 0x50, 0xef, 0x42, 0xb5, 0x9e, 0x41, 0xd9, 0xbe, 0xea, 0xbc, 0x60, 0xfd, 0x90, 0x0a, 0x3a, 0x57, 0xac, 0x32, 0xc2, 0x2b, 0xa8, 0xbf, 0x8c, 0x25, 0x06, 0xff, 0xd6, 0x8b, 0xfe, 0x9c, 0xf2, 0x19, 0xcb, 0xe2, 0xf5, 0xfb, 0x8f, 0x1f, 0xf3, 0xf6, 0x1b, 0x2f, 0xde, 0x2f, 0xeb, 0x45, 0xc1, 0xf5, 0x79, 0x5a, 0xb1, 0x3e, 0xe6, 0x25, 0x88, 0x5f, 0x6c, 0xef, 0xb2, 0x78, 0xfc, 0x5a, 0x18, 0xb3, 0x43, 0x88, 0x5d, 0xee, 0x03, 0xd1, 0xf8, 0x7d, 0x16, 0x3c, 0x3c, 0x7a, 0xfc, 0xd8, 0x3a, 0x2d, 0xa7, 0xe5, 0xb4, 0xfc, 0x98, 0x0a, 0x21, 0xa2, 0x42, 0x36, 0xa7, 0x84, 0xf1, 0xaa, 0x17, 0xca, 0x08, 0x80, 0xa0, 0x52, 0xcc, 0x0a, 0x38, 0x89, 0x45, 0x92, 0x2c, 0xc2, 0xe1, 0x62, 0x02, 0x17, 0xdb, 0x30, 0x01, 0xa0, 0xcd, 0x2c, 0x31, 0xce, 0x64, 0x3f, 0x84, 0x2f, 0xc6, 0x38, 0x5c, 0xce, 0x0d, 0xaf, 0xcf, 0x04, 0x7d, 0xb5, 0x06, 0x23, 0xb1, 0xf5, 0x91, 0x7f, 0x81, 0x6f, 0x89, 0xaa, 0x40, 0x90, 0xc4, 0x93, 0x6a, 0xc0, 0x9e, 0x46, 0x1f, 0x2f, 0x62, 0x90, 0x8f, 0xaa, 0xb5, 0x19, 0xbf, 0x0f, 0x8b, 0x17, 0xe8, 0xcc, 0xa4, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x8b, 0xf2, 0x0f, 0xf3, 0x09, 0xe5, 0xd5, 0x88, 0xcf, 0x08, 0xa8, 0x9e, 0xf9, 0x15, 0xfb, 0x21, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x86, 0xe1, 0x3e, 0xdf, 0xca, 0x3e, 0x16, 0x35, 0xd8, 0x97, 0x89, 0xca, 0x6d, 0xc4, 0x0c, 0x4e, 0x42, 0x83, 0x1a, 0xb3, 0xaf, 0x94, 0x91, 0x4a, 0xfb, 0x45, 0x77, 0x05, 0x12, 0x86, 0xfe, 0x63, 0x29, 0x1b, 0x9b, 0xfc, 0x87, 0xd3, 0x36, 0xe1, 0x47, 0xfc, 0x83, 0xc6, 0xfd, 0xc3, 0xd4, 0x6a, 0x13, 0x40, 0x49, 0xa8, 0x5d, 0xfc, 0x43, 0x47, 0x66, 0x71, 0xff, 0x52, 0xf6, 0x95, 0x6d, 0x4c, 0x7a, 0xae, 0x17, 0x03, 0x6f, 0x3a, 0x8f, 0x8c, 0x18, 0x71, 0x71, 0x71, 0xa9, 0x37, 0xc2, 0x63, 0xc8, 0x0a, 0xcb, 0xaf, 0xfc, 0x49, 0xd9, 0x85, 0xc6, 0xb6, 0x55, 0xb8, 0x2e, 0x15, 0x3e, 0x6e, 0x70, 0x1f, 0x1f, 0x9f, 0x26, 0xe0, 0xeb, 0xfe, 0xab, 0x74, 0x1c, 0xa3, 0x4f, 0xa4, 0x7c, 0x44, 0xf2, 0x1b, 0x61, 0x9f, 0xc9, 0x38, 0x63, 0x71, 0xb0, 0xaf, 0x77, 0x69, 0x63, 0x6a, 0xd0, 0xaf, 0xe2, 0x4b, 0xd5, 0x98, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x58, 0x31, 0xff, 0xb4, 0x02, 0x0f, 0x89, 0xfb, 0x1f, 0x09, 0x68, 0xf0, 0x36, 0xa6, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xc4, 0xf8, 0x60, 0xe1, 0xfc, 0x45, 0x45, 0x0e, 0x51, 0x03, 0xc4, 0xbf, 0xa7, 0xda, 0x78, 0x82, 0xda, 0x74, 0xf7, 0x53, 0x35, 0xc9, 0x75, 0x68, 0x92, 0x6b, 0x69, 0x7e, 0xa5, 0xe7, 0x2c, 0x3d, 0xbf, 0xa5, 0xfa, 0x26, 0xb5, 0x64, 0xee, 0x95, 0xa1, 0xc7, 0x54, 0xbe, 0x35, 0x98, 0x96, 0xc5, 0x4d, 0x0c, 0x99, 0x92, 0x40, 0xd6, 0x21, 0x4c, 0xbf, 0x64, 0x5f, 0xcf, 0xaf, 0xd0, 0xc5, 0xec, 0x65, 0x61, 0x1b, 0xca, 0xaf, 0x32, 0xb6, 0x31, 0x43, 0x11, 0xe8, 0x10, 0xdf, 0x86, 0xc4, 0xd7, 0x3d, 0x97, 0x41, 0xf3, 0x8d, 0x70, 0x0c, 0x12, 0xc5, 0x3c, 0x97, 0x13, 0x97, 0x25, 0xba, 0x0b, 0x33, 0x12, 0xc4, 0x9d, 0x7a, 0x8e, 0x91, 0x40, 0x17, 0x84, 0x10, 0x22, 0xa9, 0x84, 0x5b, 0x39, 0xae, 0x3b, 0x0f, 0x15, 0x8c, 0x83, 0x20, 0x8c, 0xa7, 0x89, 0xd3, 0x72, 0x5a, 0x4e, 0x7a, 0xe1, 0x47, 0x64, 0x9e, 0xe7, 0x0d, 0xf1, 0x4d, 0x1f, 0x0b, 0x6f, 0x07, 0x03, 0xd9, 0x7a, 0x12, 0x3c, 0xd0, 0xc1, 0x83, 0x81, 0x98, 0xee, 0x89, 0x36, 0x28, 0x06, 0x3a, 0x11, 0x70, 0x8c, 0xce, 0xa9, 0x05, 0x7e, 0xbc, 0x65, 0x38, 0x40, 0x43, 0x82, 0xdd, 0xa0, 0xa2, 0x81, 0x58, 0xbc, 0x78, 0x5a, 0x19, 0x44, 0x81, 0xca, 0x4f, 0x90, 0x4e, 0x02, 0xbe, 0xf2, 0x13, 0x23, 0xfe, 0xa9, 0x05, 0x3e, 0x46, 0xf1, 0x6f, 0xa8, 0x2c, 0x30, 0xeb, 0x20, 0xa1, 0x9a, 0xf0, 0x31, 0xc0, 0x61, 0x6c, 0xe8, 0x99, 0xf0, 0xf1, 0x5c, 0xc9, 0xc3, 0x3a, 0x48, 0xc2, 0x1f, 0x7a, 0xa2, 0x32, 0x23, 0x3e, 0xe2, 0xf1, 0x7a, 0xec, 0xfa, 0x71, 0x7c, 0x2f, 0x52, 0x0d, 0xf8, 0x9e, 0x5e, 0x53, 0xf9, 0x37, 0xe3, 0xfb, 0xb2, 0x0f, 0xa5, 0x0a, 0x75, 0x7c, 0x5d, 0x76, 0xbc, 0x3f, 0x3e, 0xfe, 0x20, 0xb8, 0x20, 0x6e, 0x64, 0x65, 0x2c, 0x21, 0x40, 0xd9, 0x13, 0x16, 0x3d, 0x98, 0x59, 0xd4, 0xde, 0x66, 0x5e, 0x34, 0x5b, 0xc7, 0x79, 0x91, 0x72, 0x26, 0xe2, 0x4b, 0x1b, 0xa7, 0xe0, 0xb3, 0x61, 0x1a, 0xfe, 0x80, 0xfd, 0x60, 0xf8, 0x9a, 0x9d, 0x92, 0xf0, 0x95, 0xad, 0x7f, 0x90, 0xf5, 0x87, 0x69, 0xf8, 0x83, 0x14, 0xfc, 0x68, 0x19, 0x08, 0x9e, 0x79, 0x1d, 0x3e, 0x41, 0x4d, 0x89, 0xcb, 0x20, 0x3e, 0x9f, 0xc2, 0x39, 0x4c, 0xf1, 0xcf, 0xd2, 0xf3, 0x40, 0x1a, 0xfe, 0x30, 0x0d, 0x7f, 0x70, 0x2c, 0xfe, 0xd0, 0x4b, 0xc3, 0xf7, 0xf3, 0xc7, 0x47, 0x58, 0x3f, 0x14, 0xbf, 0x66, 0x7c, 0x3f, 0xfe, 0x3f, 0x22, 0xff, 0xc3, 0x34, 0x7c, 0x95, 0x07, 0x74, 0xdf, 0x4d, 0x78, 0x7e, 0xea, 0xbe, 0x73, 0x6c, 0x6c, 0x3f, 0x4d, 0x1e, 0x60, 0x49, 0x7e, 0x15, 0xe6, 0xc5, 0xe0, 0x53, 0xc3, 0x48, 0xfc, 0xf8, 0xf9, 0x3a, 0x86, 0xef, 0x69, 0xf9, 0xda, 0x8c, 0x3f, 0x54, 0xf1, 0x37, 0x34, 0xe2, 0xcb, 0x3c, 0x3f, 0x48, 0x5d, 0x3f, 0x05, 0x3f, 0x9e, 0xef, 0x93, 0xf0, 0x43, 0x79, 0x20, 0x8a, 0x9f, 0xbc, 0xfe, 0xd0, 0xd3, 0x72, 0xc0, 0xd0, 0xc4, 0xbf, 0xca, 0x01, 0x83, 0xa7, 0xb0, 0xe5, 0x40, 0xca, 0xf2, 0x89, 0xaf, 0x7e, 0xca, 0xc2, 0xaf, 0x23, 0xef, 0xbd, 0x0c, 0xf5, 0x43, 0xa8, 0xec, 0x65, 0xa8, 0x1f, 0x8a, 0xf6, 0xf1, 0x87, 0xd6, 0x23, 0x0b, 0x00, 0x8f, 0xd4, 0x84, 0xc7, 0xd6, 0x23, 0x00, 0xbc, 0x07, 0x13, 0x1e, 0x31, 0x39, 0xe9, 0xd1, 0x63, 0xfc, 0x13, 0xb7, 0x80, 0xaf, 0x57, 0x09, 0x3e, 0x2d, 0xa7, 0xe5, 0xb4, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xe2, 0xdf, 0x4f, 0xa8, 0x65, 0xa5, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd4, 0x46, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xf8, 0xf1, 0x6b, 0x70, 0xee, 0x4a, 0x55, 0x3f, 0x72, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7e, 0xbe, 0x4c, 0xd3, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1d, 0x1f, 0xfb, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x4b, 0x3e, 0xc3, 0xd5, 0x3f, 0x65, 0x24, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xf8, 0xf9, 0xbd, 0x15, 0xd3, 0x5f, 0x9c, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfe, 0xf9, 0xc2, 0x3f, 0xdf, 0x55, 0x3e, 0x10, 0xfd, 0x3e, 0xc6, 0xfc, 0xef, 0x6b, 0x72, 0x4a, 0x0c, 0x4e, 0xfc, 0xef, 0x6e, 0x84, 0x26, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x62, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x6a, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0x92, 0x75, 0x6e, 0xd2, 0x7f, 0x14, 0x1e, 0xb3, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x08, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x51, 0xfb, 0x0b, 0x58, 0xd0, 0x9a, 0xf1, 0x93, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x4f, 0xf2, 0xaf, 0x10, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x61, 0xd9, 0xa2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd1, 0xff, 0x89, 0x6f, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x54, 0x7f, 0xd1, 0x1a, 0xa5, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x58, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x87, 0xf5, 0x9b, 0xaa, 0x7f, 0x96, 0x1c, 0x1f, 0x61, 0x7c, 0x92, 0x82, 0x1f, 0xd7, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0xc4, 0x95, 0x60, 0xb2, 0x4f, 0x12, 0xff, 0x51, 0x18, 0x89, 0x3f, 0x3f, 0x08, 0x09, 0x74, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xe1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x46, 0xed, 0xaf, 0xe5, 0x96, 0xd8, 0x67, 0x34, 0x16, 0x79, 0xbe, 0xa4, 0x7c, 0x5e, 0x0c, 0x6e, 0xe2, 0xcf, 0x04, 0xff, 0xf9, 0x43, 0x12, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xa8, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x11, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0xc5, 0x13, 0x64, 0x1a, 0xfd, 0xf0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x89, 0x51, 0x66, 0xc8, 0x41, 0x31, 0x01, 0xad, 0x64, 0xff, 0x8c, 0x26, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe3, 0x3f, 0x12, 0xc3, 0xa6, 0x67, 0xc8, 0xf1, 0x39, 0x20, 0x62, 0x1f, 0x9a, 0xf0, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xa3, 0xb6, 0x33, 0xc9, 0x9f, 0x12, 0xff, 0xd1, 0x18, 0x36, 0xf9, 0x72, 0x28, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xff, 0x0d, 0xdd, 0x04, 0x8f, 0xca, 0x4e, 0xd3, 0x72, 0x40, 0x42, 0xfc, 0xd3, 0x84, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0x25, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x96, 0xd3, 0x72, 0x5a, 0x4e, 0x4b, 0x78, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4f, 0x3d, 0x16, 0x49, 0xd9, 0x3f, 0x10, 0xe2, 0xff, 0x84, 0xd2, 0x6f, 0x63, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf4, 0xee, 0x4a, 0x12, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x64, 0x06, 0x23, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x48, 0xd2, 0x21, 0x3b, 0xee, 0x1c, 0x22, 0x72, 0x1c, 0x61, 0xc5, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xf9, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x69, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xb0, 0x8f, 0xc5, 0xf4, 0x46, 0xc2, 0xc7, 0x3c, 0x31, 0xfa, 0x24, 0x1d, 0x3f, 0x8d, 0x3f, 0x2b, 0x25, 0x36, 0x4c, 0xf0, 0x94, 0xe3, 0x99, 0xc4, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0xa9, 0x3f, 0x4f, 0x0c, 0xc9, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6e, 0x4d, 0xf6, 0xf1, 0x8f, 0xd7, 0x12, 0xf0, 0x93, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x22, 0x70, 0x92, 0xb4, 0x7e, 0x42, 0x7e, 0x20, 0xe4, 0x18, 0xf9, 0x22, 0xf9, 0x21, 0xc9, 0xbf, 0xac, 0xf0, 0x4f, 0x03, 0xe3, 0xf4, 0x13, 0x72, 0x65, 0x74, 0xeb, 0x67, 0xa2, 0xcf, 0x22, 0x31, 0x9a, 0xa6, 0x3f, 0x92, 0x60, 0x3f, 0x92, 0xc0, 0x5f, 0xc8, 0x7e, 0x26, 0xfd, 0x45, 0x74, 0x94, 0x64, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x52, 0xfc, 0x47, 0xf5, 0x9b, 0xa4, 0xbf, 0xe3, 0xec, 0x47, 0x8e, 0xd1, 0xbf, 0xcf, 0x63, 0x02, 0x3e, 0x4d, 0xb2, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xcd, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x4c, 0x0c, 0x9b, 0x8e, 0xdf, 0x43, 0xfe, 0x97, 0x60, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x48, 0x9e, 0x88, 0xf2, 0xce, 0xac, 0xe4, 0xf8, 0x8d, 0xe6, 0x00, 0x9a, 0xf0, 0xf3, 0xf0, 0x24, 0xfb, 0x86, 0x72, 0x54, 0x12, 0x7e, 0xc4, 0x8f, 0xac, 0x94, 0x1c, 0x17, 0x3d, 0x23, 0x25, 0x86, 0x18, 0x4a, 0xca, 0xdd, 0x46, 0xfa, 0x24, 0x1c, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xcb, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xe9, 0x39, 0xc0, 0x4a, 0x89, 0x61, 0x6a, 0xa5, 0xe3, 0xb3, 0xa4, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xf9, 0xf1, 0x18, 0x1c, 0x3f, 0x27, 0xed, 0x2f, 0x48, 0xf2, 0xfe, 0x2b, 0x1a, 0xc3, 0xf4, 0x38, 0xb8, 0x95, 0x0c, 0x37, 0xc5, 0x7f, 0x74, 0xff, 0x46, 0x52, 0xe8, 0x27, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x2d, 0xfe, 0x59, 0x42, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd7, 0xef, 0xf3, 0x85, 0x97, 0x2d, 0x7a, 0xc7, 0x74, 0x7d, 0xfb, 0x3b, 0xa6, 0xeb, 0x24, 0xbc, 0x9c, 0xb0, 0x3f, 0x32, 0x5d, 0xc3, 0x87, 0xa6, 0xeb, 0x44, 0xbc, 0x8c, 0xfd, 0x3f, 0xb3, 0xef, 0xd7, 0xdf, 0x8f, 0x5e, 0x68, 0xdf, 0x47, 0x1f, 0x44, 0xaf, 0x53, 0xfb, 0x9e, 0x14, 0xfb, 0xe2, 0x15, 0xb7, 0x2f, 0x5e, 0xa7, 0xf6, 0x3d, 0xb5, 0xef, 0xc7, 0xbd, 0x1c, 0x19, 0xcc, 0x3b, 0xb8, 0x73, 0x64, 0x30, 0xaf, 0x77, 0x22, 0xec, 0x7b, 0x64, 0x30, 0xef, 0xb7, 0x1e, 0x1c, 0x19, 0xcc, 0xfb, 0xe1, 0x83, 0x93, 0x20, 0xef, 0xd7, 0xfe, 0x30, 0x6e, 0xe0, 0xfb, 0x0f, 0xfe, 0xf1, 0x9f, 0xe2, 0x06, 0xbe, 0x7f, 0x22, 0xe4, 0xfd, 0xab, 0x6f, 0x9a, 0xe2, 0xf7, 0xbf, 0xff, 0xe7, 0xc4, 0xe6, 0xe7, 0xc1, 0x1d, 0xfe, 0x27, 0xcb, 0x9d, 0x23, 0x5e, 0x20, 0x58, 0xf9, 0x9f, 0x2c, 0xdf, 0x11, 0xa3, 0x27, 0x22, 0x3f, 0xbf, 0xf7, 0x3e, 0xff, 0x93, 0xe5, 0xfd, 0xa3, 0xa3, 0xbb, 0xf7, 0x8e, 0x8e, 0x1e, 0xfd, 0xf3, 0x07, 0xfc, 0x4f, 0x96, 0x0f, 0x8e, 0x8e, 0xfe, 0xfa, 0x6f, 0x4e, 0x86, 0xbc, 0x47, 0xb1, 0xf2, 0xc7, 0xdf, 0x38, 0x32, 0x94, 0x7f, 0xf9, 0xfe, 0x09, 0x91, 0xf7, 0xdd, 0x5f, 0x0d, 0xc9, 0xf5, 0x95, 0xdf, 0xff, 0xdd, 0xdf, 0xfb, 0x83, 0xaf, 0x1e, 0xfd, 0xda, 0xaf, 0x87, 0x46, 0xff, 0xf6, 0xef, 0xbe, 0xfb, 0xbd, 0xbf, 0xff, 0x87, 0x13, 0x21, 0xef, 0x6f, 0xfe, 0x56, 0x48, 0xb2, 0x3f, 0xfb, 0xf3, 0x3f, 0xf9, 0xd3, 0xbf, 0xf8, 0xcb, 0xa3, 0xdf, 0xfe, 0x9d, 0xd0, 0xe8, 0xbf, 0xff, 0xc7, 0xbf, 0xfe, 0xdb, 0x7f, 0xfe, 0xd7, 0xc8, 0x1d, 0xcb, 0xfa, 0x24, 0xbf, 0x5e, 0x1e, 0xc1, 0xeb, 0x27, 0xf9, 0xc5, 0xef, 0xad, 0x27, 0xb9, 0xf8, 0xff, 0x8e, 0x65, 0x9d, 0xc1, 0xeb, 0x79, 0xb8, 0x5e, 0x80, 0x8b, 0x9c, 0x21, 0x23, 0x56, 0xf8, 0x22, 0x91, 0x4b, 0xa7, 0x70, 0x06, 0x48, 0xfc, 0x92, 0xf5, 0x92, 0xf5, 0xd2, 0x73, 0x2f, 0x3d, 0xf7, 0x64, 0x6b, 0x46, 0xaf, 0xe7, 0x3f, 0xe9, 0xbd, 0x62, 0xad, 0x5f, 0xaa, 0x2e, 0x55, 0x2b, 0x99, 0xb7, 0x33, 0x23, 0xf3, 0x2b, 0x0b, 0x55, 0xbb, 0x92, 0x19, 0x81, 0xdb, 0x91, 0x37, 0x2e, 0xda, 0x58, 0x2a, 0xd3, 0x67, 0x0b, 0xd0, 0xbb, 0xa0, 0x7a, 0x25, 0xec, 0xad, 0xad, 0xaf, 0x2e, 0x2e, 0x5f, 0xb4, 0x2b, 0x33, 0xd8, 0x59, 0xbe, 0xba, 0xf4, 0x46, 0x75, 0x15, 0x40, 0xd3, 0xd8, 0xfb, 0x4c, 0xf5, 0xe7, 0xaf, 0xad, 0xac, 0x2e, 0x54, 0xca, 0xd8, 0x99, 0xbb, 0xb2, 0xc8, 0xb1, 0x38, 0x89, 0xf9, 0x95, 0xa5, 0xa5, 0xea, 0xf2, 0x7a, 0x65, 0x9a, 0x63, 0xad, 0x2d, 0x5e, 0x5c, 0xe6, 0x04, 0xf9, 0xc4, 0xb5, 0xea, 0xe5, 0xea, 0xfc, 0xba, 0x2d, 0x61, 0xf3, 0x57, 0x57, 0xd7, 0x56, 0x80, 0xa2, 0x58, 0xeb, 0xd2, 0xdc, 0xc2, 0xca, 0x35, 0xbb, 0xd2, 0x73, 0xf7, 0x1c, 0x4e, 0xf3, 0xf2, 0xfa, 0xc6, 0x85, 0x15, 0xa0, 0xd3, 0xa8, 0xb5, 0xba, 0x7c, 0x64, 0x69, 0x6e, 0x7d, 0xfe, 0xd2, 0xc6, 0x42, 0xf5, 0xf2, 0xe2, 0xd2, 0xe2, 0x7a, 0x75, 0x75, 0x4d, 0x4d, 0xbd, 0x59, 0xc8, 0x64, 0x46, 0x2e, 0xce, 0x2d, 0x55, 0xaf, 0xcc, 0x2d, 0x48, 0xa1, 0xd6, 0x57, 0xae, 0xce, 0x5f, 0x82, 0x7b, 0xde, 0x01, 0x52, 0x57, 0x2e, 0xcd, 0x55, 0xa6, 0x5f, 0x9f, 0x42, 0x2a, 0x37, 0x05, 0xc6, 0xcd, 0x4c, 0x66, 0xfe, 0x52, 0x75, 0xfe, 0x33, 0x1b, 0xcb, 0xd5, 0x6b, 0x1b, 0x6f, 0x02, 0xb5, 0xc5, 0x95, 0x65, 0x4e, 0x30, 0xb3, 0xbc, 0xb2, 0xb1, 0xb6, 0x72, 0x75, 0x79, 0x41, 0x2c, 0x9c, 0xb9, 0xb8, 0x78, 0x61, 0xe3, 0x72, 0x75, 0xf9, 0xe2, 0xfa, 0xa5, 0x4a, 0x69, 0xca, 0x9e, 0x98, 0xb0, 0x9b, 0x6d, 0xbb, 0xeb, 0xd4, 0x3b, 0xed, 0xad, 0x6e, 0x66, 0x6d, 0xe5, 0xc2, 0xfa, 0xb5, 0xb9, 0xd5, 0xea, 0xc6, 0x6a, 0x75, 0x79, 0xa1, 0x8a, 0xba, 0x92, 0x48, 0xf3, 0xab, 0xeb, 0x1b, 0x4b, 0x2b, 0xcb, 0x8b, 0xeb, 0x2b, 0xab, 0x1a, 0x99, 0xb5, 0xf9, 0xb9, 0xcb, 0xd5, 0x4a, 0x39, 0x73, 0x75, 0x51, 0xde, 0xce, 0x64, 0x32, 0x13, 0xc9, 0x25, 0xd3, 0xd8, 0x6b, 0xd7, 0x7b, 0xcd, 0x4e, 0xdb, 0x5e, 0x5f, 0x9c, 0xcf, 0xe5, 0x33, 0x23, 0xf5, 0x56, 0x17, 0x9b, 0x56, 0xa7, 0x5e, 0x6b, 0xd9, 0xad, 0xda, 0xa6, 0xd3, 0xaa, 0x64, 0xd7, 0x77, 0x9a, 0x5d, 0x1b, 0xfe, 0xba, 0x07, 0xdd, 0x9e, 0x73, 0xdd, 0x06, 0xbe, 0x1a, 0xcd, 0xed, 0x3d, 0xb7, 0xc6, 0xf1, 0xea, 0x35, 0xb7, 0xe7, 0x36, 0xb7, 0xb6, 0x9d, 0xac, 0xc2, 0xea, 0x36, 0xdf, 0x72, 0x2a, 0xbb, 0x6e, 0xb3, 0xdd, 0xcb, 0x71, 0x02, 0x85, 0xa9, 0xc2, 0xc4, 0x39, 0xa0, 0xa9, 0x0f, 0xe5, 0x4a, 0x33, 0x53, 0x13, 0x38, 0x31, 0x3f, 0x39, 0x59, 0x2a, 0xe4, 0xa6, 0xcb, 0xe7, 0x60, 0x0a, 0xdc, 0xe6, 0x33, 0x4e, 0x7b, 0x2b, 0xc3, 0x65, 0x43, 0x63, 0x55, 0x57, 0xb9, 0x2f, 0x81, 0xee, 0xd6, 0xab, 0x9f, 0xad, 0x7c, 0xee, 0x73, 0xa0, 0xdb, 0xd7, 0x6e, 0x38, 0x6e, 0x17, 0x17, 0x9e, 0x9e, 0x9e, 0x82, 0x6e, 0xad, 0x07, 0xab, 0x6f, 0xee, 0xf5, 0x1c, 0xfb, 0x86, 0x53, 0x2f, 0xdb, 0xdb, 0xbb, 0x7b, 0x1b, 0x6f, 0x3a, 0x6e, 0xcf, 0xd9, 0x3f, 0x1f, 0x05, 0x96, 0x38, 0x70, 0xdd, 0xd9, 0x9f, 0xef, 0x74, 0xdc, 0xad, 0x18, 0x78, 0x86, 0x83, 0xe7, 0x3b, 0xad, 0x8e, 0x8b, 0xb0, 0xbd, 0x76, 0xb3, 0xd1, 0x71, 0xaf, 0xdb, 0xd7, 0x6b, 0x3d, 0x01, 0x59, 0xea, 0x6c, 0x39, 0xad, 0x37, 0x9b, 0x4e, 0xff, 0x8a, 0xdb, 0xf9, 0x05, 0x87, 0xeb, 0x6c, 0xa9, 0x06, 0xf8, 0x7c, 0xa1, 0x1b, 0x35, 0xf7, 0xa0, 0xd9, 0xde, 0x16, 0x74, 0xea, 0x8a, 0x86, 0x36, 0x5a, 0xb2, 0x7b, 0xda, 0xc2, 0x37, 0x3a, 0xcd, 0x2d, 0xa0, 0xdc, 0x6c, 0xe7, 0xf0, 0x2e, 0xaf, 0x7c, 0x88, 0x23, 0xda, 0x95, 0x30, 0x23, 0x23, 0x0a, 0x11, 0x00, 0x48, 0x28, 0xa7, 0x4b, 0x91, 0xe7, 0x33, 0xb6, 0x5b, 0x1b, 0x57, 0x3a, 0xdd, 0x26, 0x37, 0x47, 0x25, 0x9d, 0x59, 0x7b, 0x8c, 0xf3, 0x98, 0x0b, 0xf4, 0x54, 0xb0, 0xa7, 0x8b, 0x53, 0x9c, 0xce, 0xcd, 0xcc, 0xc8, 0xe7, 0x3f, 0x0f, 0x9e, 0x7b, 0x65, 0xf1, 0xb3, 0xd5, 0xcb, 0x46, 0x65, 0x4f, 0x4e, 0xee, 0xba, 0x4e, 0xbd, 0xc9, 0x47, 0x76, 0x9a, 0xdb, 0x3b, 0xbb, 0x76, 0xa3, 0xd5, 0xa9, 0xf5, 0x52, 0x65, 0x55, 0x8a, 0xec, 0xd6, 0xae, 0xef, 0xb6, 0x1c, 0xb7, 0xb4, 0x60, 0x77, 0x3b, 0x7b, 0x6e, 0xdd, 0xd1, 0x61, 0x9c, 0x8a, 0xdd, 0x73, 0xb7, 0x37, 0xf6, 0xcd, 0xc3, 0x07, 0xe6, 0xe1, 0xbe, 0x79, 0x78, 0x27, 0x3e, 0xdc, 0xad, 0xbb, 0xa6, 0xd9, 0x38, 0x0c, 0xb3, 0xb9, 0x68, 0x76, 0xf5, 0xfa, 0x5e, 0xab, 0xd6, 0x73, 0xb6, 0x20, 0xfa, 0x76, 0xf7, 0x7a, 0xb6, 0xeb, 0x74, 0x3b, 0xad, 0x3d, 0x54, 0x5d, 0x11, 0xe5, 0x43, 0xb9, 0x60, 0xa8, 0xc2, 0x6d, 0x50, 0x3a, 0x7b, 0xae, 0x38, 0x55, 0x98, 0x9e, 0x99, 0xe1, 0xaa, 0x13, 0xe8, 0x97, 0x6a, 0xee, 0x56, 0xdb, 0xe9, 0x76, 0xed, 0x4e, 0x03, 0xe8, 0xd6, 0xda, 0xad, 0x66, 0xdb, 0x29, 0x0a, 0x90, 0x3d, 0xf1, 0x7a, 0x71, 0x0a, 0x4c, 0xd3, 0xed, 0x34, 0x7a, 0x62, 0x64, 0x62, 0xfa, 0x1c, 0x1f, 0xb9, 0xee, 0x6c, 0x35, 0xf7, 0xae, 0xc3, 0x98, 0xe0, 0x67, 0x07, 0x68, 0xac, 0x01, 0x6e, 0x05, 0x11, 0x4c, 0x84, 0x77, 0x9b, 0xfb, 0x4e, 0xab, 0xcb, 0xf3, 0x43, 0x78, 0x89, 0x89, 0x52, 0x74, 0x85, 0x19, 0x3e, 0x80, 0x14, 0x43, 0xe4, 0xaf, 0x34, 0xf7, 0x2b, 0x13, 0xe5, 0x80, 0xfa, 0x42, 0xb3, 0xbb, 0xdb, 0xaa, 0x1d, 0xd8, 0xfd, 0x9a, 0xbb, 0x2b, 0x69, 0x4d, 0x71, 0xcc, 0x76, 0xa7, 0xed, 0x88, 0x3e, 0x38, 0xc8, 0xa4, 0x10, 0xc0, 0xd9, 0xef, 0xb9, 0xce, 0x75, 0x47, 0xe9, 0x03, 0x71, 0x84, 0x42, 0x70, 0xca, 0xb9, 0x19, 0xd4, 0x09, 0xdc, 0xcc, 0xbc, 0x8e, 0x6a, 0xb1, 0xe5, 0x02, 0x73, 0xd7, 0x3b, 0x7b, 0xed, 0x1e, 0xd7, 0xca, 0x4e, 0x6d, 0xab, 0xd3, 0x07, 0xc7, 0xef, 0x7e, 0xb1, 0xe8, 0xf3, 0x84, 0xbd, 0x85, 0x9a, 0xfb, 0xc5, 0xca, 0x54, 0xf1, 0xec, 0xf9, 0xd0, 0xe8, 0x65, 0xf0, 0xb0, 0x5e, 0x65, 0x1a, 0x87, 0x39, 0xa5, 0x89, 0x67, 0x54, 0x24, 0x5f, 0xdd, 0xd5, 0x8b, 0x6f, 0xd8, 0xbd, 0x8e, 0x7d, 0x19, 0x94, 0x58, 0x73, 0xa5, 0xe8, 0x73, 0xdd, 0xee, 0x1e, 0xba, 0xf1, 0x5e, 0x17, 0xff, 0x15, 0x53, 0x0e, 0x76, 0xc1, 0x27, 0xc0, 0xa5, 0x7b, 0x7b, 0x60, 0x7f, 0xbb, 0x87, 0xc9, 0xb0, 0xbb, 0xd3, 0xd9, 0x6b, 0x6d, 0x81, 0x8a, 0x7a, 0xf6, 0xa6, 0x63, 0xb7, 0x1d, 0x67, 0xcb, 0xd9, 0x0a, 0x44, 0x5a, 0xef, 0x08, 0x9a, 0xd3, 0x39, 0xd1, 0xaf, 0xe7, 0xdf, 0x76, 0x1d, 0xc0, 0x6e, 0xe7, 0xea, 0xb3, 0x20, 0xe6, 0xd4, 0xcc, 0xd4, 0xcc, 0xd9, 0xfc, 0xa7, 0xeb, 0x93, 0xd3, 0xa5, 0xe2, 0xcf, 0x96, 0x7e, 0x6e, 0xb7, 0xd3, 0xcf, 0xe5, 0xea, 0xe3, 0x30, 0x7e, 0xf6, 0x6c, 0x7e, 0x72, 0x1a, 0x9b, 0x42, 0xa9, 0x38, 0x93, 0x3f, 0x7f, 0x53, 0xa8, 0xb9, 0xec, 0xd3, 0xcb, 0xf1, 0x9e, 0x4f, 0x8d, 0x67, 0xbc, 0x5c, 0xb0, 0x58, 0xbd, 0xe8, 0xe6, 0x0b, 0x7a, 0x77, 0x3b, 0xdc, 0xdd, 0xcc, 0x23, 0x4d, 0x21, 0xa7, 0x18, 0x45, 0xf1, 0x51, 0xc6, 0x67, 0x2b, 0xfc, 0x9a, 0xbb, 0xbd, 0x69, 0x12, 0x1d, 0x24, 0x9c, 0x2a, 0x4f, 0x97, 0xa7, 0x5e, 0xff, 0x74, 0x7d, 0x4c, 0x88, 0xce, 0x85, 0x1d, 0x43, 0x05, 0xd4, 0x0b, 0x53, 0xc5, 0x99, 0xe9, 0x73, 0xe7, 0xce, 0xe5, 0x27, 0x84, 0x22, 0x74, 0xe9, 0x91, 0x60, 0x82, 0xec, 0x62, 0x2d, 0x29, 0xb9, 0xea, 0x6c, 0xeb, 0x1d, 0x5d, 0xea, 0x65, 0x90, 0xd9, 0xe9, 0xf6, 0x6c, 0x47, 0x45, 0xba, 0x48, 0x4a, 0xf6, 0x76, 0xf3, 0x86, 0xd3, 0x16, 0x29, 0x01, 0x25, 0xdf, 0xed, 0xc0, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xd6, 0xe6, 0x1a, 0x70, 0x5a, 0xe0, 0xc3, 0x8d, 0xae, 0xd3, 0x53, 0xda, 0x6a, 0x75, 0x3b, 0xf6, 0x5b, 0x8e, 0xdb, 0xf9, 0x19, 0x8c, 0x4c, 0x8c, 0x79, 0xd7, 0x71, 0x54, 0xae, 0x28, 0xdb, 0x17, 0x9c, 0x5e, 0x7d, 0x27, 0xc7, 0xc3, 0x04, 0x28, 0x15, 0xf8, 0x0d, 0x4c, 0xcb, 0xf3, 0x4c, 0x0f, 0x23, 0x15, 0xd4, 0x50, 0xc7, 0xcd, 0xc1, 0xed, 0x18, 0x30, 0x35, 0x8e, 0xb0, 0x71, 0x1e, 0x4b, 0x10, 0x08, 0xa0, 0x8d, 0xb3, 0xf9, 0xfc, 0x24, 0x8c, 0xf3, 0x04, 0x2f, 0x65, 0xf6, 0xfd, 0x60, 0xba, 0x58, 0x82, 0x44, 0x2e, 0xad, 0x52, 0x5a, 0xc8, 0x89, 0x8c, 0x5a, 0x00, 0x52, 0xc5, 0xfd, 0x83, 0x02, 0xcf, 0x2d, 0xf9, 0x22, 0xc8, 0x1f, 0x48, 0x0e, 0x51, 0xde, 0xab, 0xb5, 0xeb, 0x0e, 0x66, 0x0e, 0x5f, 0x7a, 0x99, 0x4c, 0xc0, 0x09, 0xda, 0x52, 0x31, 0x5c, 0x4c, 0x3f, 0xdd, 0x21, 0x92, 0x2f, 0x41, 0xfe, 0x6d, 0x64, 0x5a, 0x72, 0x7b, 0x5e, 0x72, 0x34, 0x91, 0x43, 0xfe, 0x27, 0x7c, 0x49, 0xf2, 0xf9, 0x09, 0x25, 0x42, 0x5e, 0x98, 0x70, 0x64, 0x44, 0xe6, 0x90, 0x05, 0xfb, 0x62, 0x6d, 0xaf, 0xdb, 0x6d, 0xd6, 0xda, 0x81, 0xaf, 0xe0, 0x88, 0x74, 0x14, 0xd4, 0x91, 0xca, 0xc9, 0xb5, 0x96, 0xe3, 0xdb, 0xd9, 0xd9, 0xdf, 0x2d, 0xe5, 0xf8, 0xd0, 0x18, 0xae, 0x8d, 0x6b, 0xf8, 0x42, 0x95, 0x27, 0x7a, 0xb5, 0x5d, 0x9f, 0xac, 0xdd, 0x68, 0xb6, 0x7a, 0x8e, 0x6b, 0xd7, 0x5a, 0x1d, 0xb0, 0xe1, 0x4e, 0xc7, 0x7d, 0xcb, 0x56, 0xf9, 0x91, 0x1b, 0xe4, 0x12, 0x8c, 0x94, 0x03, 0x83, 0x88, 0xc5, 0x7c, 0x8b, 0xf0, 0x29, 0x9b, 0x15, 0x61, 0x35, 0x65, 0xb0, 0xdc, 0x04, 0x78, 0x68, 0x01, 0xe7, 0x88, 0x07, 0xad, 0xf0, 0xc1, 0xe8, 0x24, 0xcc, 0x97, 0xd1, 0x49, 0x5b, 0xb1, 0x49, 0x61, 0x4a, 0x62, 0xf5, 0xad, 0x6e, 0xaf, 0xc2, 0x95, 0x8c, 0x62, 0x15, 0xf9, 0xb3, 0x0f, 0xe5, 0x9a, 0xef, 0xb4, 0xe1, 0xb9, 0x0b, 0x60, 0x65, 0x34, 0xb0, 0x50, 0xdf, 0xc1, 0x6c, 0x58, 0x0c, 0x70, 0xb9, 0x4e, 0x2a, 0x32, 0xa3, 0x6b, 0x34, 0xfb, 0x9b, 0x15, 0xae, 0x56, 0xa0, 0xcd, 0xb9, 0x17, 0xea, 0xd4, 0x27, 0xd4, 0xfd, 0x09, 0x98, 0x74, 0x0c, 0x13, 0xb6, 0x82, 0x09, 0x11, 0x0a, 0xc0, 0xdc, 0xaa, 0xb0, 0x8b, 0x50, 0xb6, 0x1f, 0x42, 0x45, 0xcd, 0x4d, 0x73, 0x9b, 0x63, 0xfd, 0xcd, 0xf1, 0xfa, 0x58, 0xbf, 0x3e, 0xbe, 0x35, 0xd6, 0xdf, 0xca, 0x4f, 0xe6, 0xa0, 0x0b, 0x1d, 0xb8, 0xf5, 0x4d, 0x77, 0xf6, 0xa9, 0x4d, 0x77, 0x36, 0xdd, 0x74, 0xb5, 0x98, 0xe9, 0x4a, 0x71, 0xab, 0xfc, 0xe8, 0xec, 0xcb, 0x27, 0x39, 0xb1, 0x49, 0xa5, 0x1f, 0x95, 0x13, 0xd4, 0x02, 0x27, 0x28, 0x19, 0x6d, 0xfc, 0xc3, 0xf4, 0x12, 0x39, 0xc1, 0x09, 0x26, 0x94, 0x3e, 0x8a, 0x1b, 0xd5, 0xc6, 0xfa, 0xb5, 0xf1, 0xb0, 0x2f, 0x8d, 0x3b, 0x63, 0x7d, 0x07, 0x1d, 0xaa, 0x36, 0xae, 0x7c, 0x6a, 0x1c, 0x06, 0x7c, 0xb7, 0x92, 0x54, 0xd5, 0xde, 0x48, 0x53, 0x98, 0xe0, 0x09, 0xf7, 0x56, 0x89, 0x7e, 0x64, 0x32, 0xc7, 0x81, 0x9e, 0x7f, 0x7d, 0x71, 0x00, 0xa5, 0xa0, 0xb6, 0x6a, 0xc1, 0xe2, 0x73, 0xad, 0x16, 0xec, 0x6e, 0xfc, 0x54, 0xba, 0x03, 0x8f, 0x03, 0xee, 0xc6, 0x3c, 0xc3, 0x3a, 0x8d, 0x06, 0xec, 0xc3, 0x45, 0xca, 0xf5, 0xfd, 0x7a, 0xdd, 0x6d, 0x6a, 0xf9, 0x55, 0xf3, 0x65, 0x91, 0xab, 0x90, 0xc7, 0x09, 0xb5, 0x3b, 0x57, 0x1e, 0x2c, 0x62, 0x01, 0x41, 0xe8, 0x97, 0x21, 0xbf, 0x0d, 0xb0, 0xfc, 0x3d, 0x7d, 0xe0, 0x0f, 0x5c, 0xf4, 0x30, 0x45, 0xdf, 0x15, 0x7c, 0x58, 0x40, 0xd2, 0xf7, 0x82, 0x00, 0xe6, 0xe3, 0x49, 0x75, 0x84, 0xed, 0x13, 0x7a, 0xd4, 0x74, 0x5c, 0xfe, 0xe4, 0xd4, 0x76, 0xc2, 0x80, 0x8f, 0xcf, 0x51, 0x78, 0xbb, 0x13, 0xa3, 0xf8, 0xac, 0x84, 0x78, 0xdf, 0xdd, 0xa9, 0xf9, 0x8f, 0x9b, 0x6b, 0xb0, 0x9b, 0x8c, 0xa8, 0x43, 0x3d, 0x72, 0xc0, 0x7f, 0x90, 0xed, 0xf3, 0x78, 0x02, 0x20, 0xc7, 0xc7, 0xfc, 0x8d, 0xe7, 0x38, 0xb2, 0x57, 0x3c, 0x18, 0xe3, 0xff, 0xe6, 0xc7, 0xf8, 0x46, 0x76, 0xbf, 0xe0, 0x03, 0xf6, 0x39, 0x60, 0x5f, 0x02, 0x0e, 0x42, 0x22, 0x20, 0x1d, 0x78, 0x56, 0x8d, 0xe3, 0xde, 0x53, 0xf1, 0xbf, 0x16, 0xde, 0xa5, 0x72, 0xdd, 0x2e, 0x41, 0x27, 0xce, 0x5a, 0x71, 0x7f, 0xbc, 0x22, 0x96, 0xe6, 0xfb, 0x69, 0x65, 0x08, 0xc4, 0xac, 0xf0, 0xfd, 0x89, 0xda, 0xdb, 0x16, 0x62, 0x37, 0x82, 0x0b, 0x4e, 0xa3, 0xd2, 0x70, 0x6b, 0xf5, 0x9e, 0x60, 0x75, 0xf2, 0x9c, 0xd2, 0x71, 0xb3, 0x21, 0x46, 0x60, 0xd7, 0x54, 0x2e, 0x97, 0xf3, 0x9c, 0x1b, 0xb7, 0xe2, 0x6f, 0x8b, 0xf9, 0x1c, 0x78, 0x78, 0xc3, 0x03, 0x3d, 0x98, 0x88, 0xdb, 0x27, 0x3e, 0x71, 0xdb, 0x34, 0x91, 0x43, 0x36, 0x23, 0x10, 0xa9, 0x07, 0x1c, 0x3c, 0x7f, 0x93, 0x6b, 0x37, 0xf4, 0x7a, 0x9a, 0xb7, 0xb9, 0xac, 0xc1, 0x6b, 0x09, 0xec, 0xdb, 0xa6, 0x64, 0x08, 0xfb, 0x1b, 0xf7, 0x30, 0x45, 0xae, 0x25, 0x48, 0x59, 0x6e, 0xaf, 0x02, 0xef, 0xa5, 0x17, 0xdc, 0xda, 0x36, 0x7f, 0x15, 0x84, 0x8d, 0x89, 0xd8, 0x1a, 0xf0, 0xb7, 0xbc, 0x82, 0x78, 0xab, 0x13, 0xa2, 0xf2, 0xc9, 0xc5, 0x83, 0x0a, 0x7f, 0x19, 0x9b, 0x90, 0x3d, 0xbe, 0xe7, 0x1f, 0x51, 0x2a, 0xaf, 0x70, 0xdf, 0xe0, 0xa0, 0x49, 0x9f, 0x4a, 0x5f, 0x50, 0xd9, 0xc9, 0x8b, 0x57, 0xb0, 0x11, 0x7f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x4f, 0x05, 0xc3, 0x0b, 0xed, 0x35, 0xc6, 0xcd, 0x17, 0xe1, 0xc6, 0x7f, 0x75, 0xf6, 0x71, 0xc4, 0x0b, 0xf6, 0x8c, 0xdc, 0x55, 0xe6, 0xa2, 0xe4, 0xf2, 0x91, 0x37, 0xe5, 0xcc, 0xcd, 0xcc, 0xff, 0x02, 0x43, 0xc1, 0xfc, 0x7e, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x64, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x92, 0x58, 0x16, 0x49, 0x15, 0x49, 0xad, 0xec, 0x72, 0xb9, 0x18, 0x10, 0x1c, 0x90, 0x88, 0x41, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x13, 0x3b, 0x1d, 0xac, 0x37, 0xb6, 0xf3, 0x34, 0x45, 0x3b, 0xef, 0x07, 0x84, 0x68, 0xe3, 0xbc, 0x9c, 0x6c, 0x95, 0xf2, 0x7d, 0xfd, 0x98, 0xe9, 0x99, 0xe9, 0x19, 0x4a, 0x6b, 0xd9, 0xde, 0x30, 0xec, 0x61, 0xab, 0xa7, 0xfb, 0xeb, 0xef, 0xeb, 0xef, 0x3d, 0x3d, 0x3d, 0x28, 0x0d, 0x5b, 0x96, 0xf5, 0xdc, 0xbb, 0x9f, 0xb2, 0x7a, 0x0c, 0xca, 0xed, 0xdb, 0xb7, 0xef, 0x1c, 0x1d, 0x1d, 0xdd, 0xc1, 0x16, 0xba, 0x77, 0x18, 0xf5, 0x2a, 0x63, 0xfd, 0xc1, 0xed, 0xdb, 0x6c, 0x70, 0x74, 0x44, 0x07, 0xb7, 0x7f, 0x83, 0x0e, 0xd8, 0x1d, 0xca, 0xe8, 0x1d, 0x4a, 0x55, 0xe5, 0xf8, 0xc3, 0xc3, 0xc3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x53, 0x15, 0xf1, 0x87, 0x87, 0xd9, 0x20, 0x9d, 0xa6, 0x83, 0xe1, 0x57, 0x01, 0x3f, 0x47, 0x07, 0x54, 0xd4, 0x3e, 0xcd, 0x59, 0x8c, 0xe3, 0x03, 0xee, 0x6c, 0xb1, 0x58, 0x9c, 0xc5, 0x16, 0xba, 0xb3, 0x04, 0x2a, 0xe0, 0xce, 0x4a, 0xfc, 0x74, 0x9a, 0x0d, 0x8a, 0x45, 0x3a, 0x48, 0x17, 0x00, 0x7f, 0x96, 0x0e, 0x08, 0x54, 0x3a, 0x0b, 0xf8, 0xb3, 0x12, 0xbf, 0xdb, 0xed, 0x36, 0x6a, 0xb5, 0x5a, 0x03, 0x5b, 0xe8, 0xf2, 0x4a, 0x2c, 0x82, 0x2d, 0xe2, 0x77, 0xbb, 0x6c, 0x50, 0xab, 0xd1, 0x41, 0x77, 0x1b, 0xf0, 0x1b, 0x40, 0xb3, 0x41, 0xa9, 0x05, 0x15, 0xdb, 0xaf, 0x1f, 0x1f, 0xbf, 0x78, 0x8c, 0xe5, 0xe1, 0x83, 0xe3, 0xe3, 0xc1, 0xe0, 0xf8, 0xe1, 0x60, 0xf0, 0x00, 0xbb, 0xf0, 0xcf, 0xc3, 0xef, 0x0c, 0x06, 0x2f, 0x29, 0x38, 0x1f, 0x07, 0x38, 0x9f, 0x17, 0x81, 0x3f, 0x90, 0xf8, 0xb2, 0x85, 0x7e, 0x00, 0xfe, 0x50, 0xd2, 0x7f, 0x28, 0xf1, 0x1f, 0xfa, 0xf8, 0x3f, 0x5f, 0xab, 0xfd, 0x44, 0xed, 0xe6, 0x76, 0xad, 0xb6, 0x7d, 0x53, 0xd4, 0x6e, 0x97, 0xb7, 0x30, 0x72, 0x73, 0xaf, 0xdb, 0x7d, 0xc1, 0x4e, 0xa7, 0x3f, 0x91, 0x1e, 0x7e, 0x35, 0x9d, 0x7e, 0xf5, 0x95, 0xb4, 0xde, 0xc2, 0xdd, 0x2b, 0x3f, 0x35, 0x3c, 0xfc, 0xdc, 0xbb, 0x47, 0x47, 0xa9, 0xa3, 0x2f, 0xbf, 0x73, 0xc4, 0xeb, 0x3b, 0x5f, 0x3e, 0x52, 0xf7, 0x70, 0xf7, 0xce, 0xaf, 0x7c, 0xe9, 0x4b, 0x43, 0x13, 0xc5, 0xe2, 0x85, 0x62, 0xe1, 0xb5, 0x22, 0xaf, 0xaf, 0xa5, 0x41, 0xcb, 0xd8, 0x16, 0x8a, 0x05, 0xf8, 0x17, 0x69, 0x73, 0x7b, 0xa3, 0xed, 0xf9, 0xf5, 0x35, 0x7e, 0xff, 0xcb, 0xe0, 0x07, 0xcc, 0xa2, 0xa8, 0xdb, 0x1e, 0xbb, 0x63, 0x31, 0xb0, 0x7d, 0xff, 0x0e, 0xd8, 0xff, 0x48, 0x56, 0xf4, 0x07, 0x8b, 0xf6, 0x07, 0x8c, 0x0d, 0x06, 0xdc, 0xde, 0x68, 0xfb, 0xf4, 0x3d, 0x68, 0xf1, 0x4a, 0xa7, 0x7f, 0x1a, 0xfc, 0xc0, 0xc3, 0xcf, 0x51, 0x0a, 0xb6, 0xe7, 0x35, 0x97, 0xa6, 0x8c, 0xfb, 0xc1, 0xb0, 0x8f, 0xcf, 0xed, 0x8d, 0xb6, 0xbf, 0x7f, 0xff, 0xfe, 0x6c, 0x71, 0x76, 0x16, 0xef, 0x91, 0x86, 0x87, 0x3f, 0x4b, 0x29, 0xd8, 0x9e, 0xde, 0x87, 0x3a, 0x5b, 0xa4, 0x8c, 0xfb, 0x41, 0xda, 0xc7, 0xe7, 0xb6, 0x46, 0xdb, 0xd7, 0xb0, 0xfd, 0x0a, 0xbf, 0xff, 0x45, 0xf0, 0x03, 0x0f, 0xbf, 0x61, 0x31, 0xb0, 0x7d, 0xbf, 0x01, 0xf6, 0xaf, 0xc9, 0x8a, 0xfe, 0xa0, 0xf0, 0x21, 0x0c, 0xac, 0x38, 0x1f, 0xc0, 0x71, 0x1d, 0x1e, 0xf6, 0x81, 0x20, 0x3c, 0xea, 0x03, 0x01, 0xb8, 0xc1, 0x07, 0x14, 0x3c, 0xce, 0x07, 0x70, 0x1c, 0xe1, 0x71, 0x3e, 0x80, 0xe3, 0x08, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0xb8, 0x31, 0x7e, 0x79, 0x49, 0xe7, 0x72, 0xec, 0x9e, 0x29, 0x7e, 0x01, 0x0e, 0xf6, 0x84, 0x7a, 0x0f, 0xaa, 0xf5, 0x0c, 0xca, 0xf6, 0x75, 0xe7, 0x05, 0xeb, 0x87, 0x54, 0xd0, 0xb9, 0x22, 0x95, 0x11, 0x5e, 0x41, 0xfd, 0x45, 0x2c, 0x11, 0xf8, 0xb7, 0x5f, 0xf4, 0xe6, 0x14, 0x2f, 0x58, 0x16, 0xaf, 0xdf, 0x7b, 0xfc, 0x98, 0xb7, 0xdf, 0x78, 0xf1, 0xb8, 0xa8, 0x17, 0x05, 0xd7, 0xe7, 0x69, 0xc5, 0xfa, 0x98, 0x17, 0x3f, 0x7e, 0xb1, 0xbd, 0xc7, 0xa2, 0xf1, 0x6b, 0x61, 0xcc, 0xf6, 0x21, 0x76, 0xb9, 0x0f, 0x84, 0xe3, 0xf7, 0x59, 0xf0, 0xf0, 0xe8, 0xf1, 0x63, 0xeb, 0xbc, 0x9c, 0x97, 0xf3, 0xf2, 0x63, 0x2a, 0x84, 0x88, 0x0a, 0xd9, 0x9c, 0x12, 0xc6, 0xab, 0x5e, 0x28, 0x23, 0x00, 0x82, 0x4a, 0x31, 0x2b, 0xe0, 0x24, 0x16, 0x4a, 0xb2, 0x08, 0x87, 0x8b, 0x09, 0x5c, 0x6c, 0x83, 0x04, 0x80, 0x36, 0xb3, 0xc4, 0x38, 0x93, 0xfd, 0x00, 0xbe, 0x18, 0xe3, 0x70, 0x39, 0x37, 0xb8, 0x3e, 0x13, 0xf4, 0xd5, 0x1a, 0x8c, 0x44, 0xd6, 0x47, 0xfe, 0x05, 0xbe, 0x25, 0xaa, 0x02, 0x41, 0x12, 0x8f, 0xab, 0x3e, 0x7b, 0x1a, 0x7d, 0xbc, 0x88, 0x41, 0x3e, 0xaa, 0xd6, 0x66, 0xfc, 0x3e, 0x28, 0x9e, 0xaf, 0x33, 0x93, 0xfe, 0x84, 0x4c, 0x54, 0xe8, 0x8e, 0xeb, 0x2f, 0xcc, 0x3f, 0xcc, 0x27, 0x94, 0x57, 0x23, 0x3e, 0x23, 0xa0, 0x7a, 0xe6, 0x55, 0xec, 0x07, 0xcc, 0x47, 0x09, 0xb2, 0x44, 0xa0, 0x25, 0xd8, 0x52, 0x1a, 0x84, 0x7b, 0x7c, 0x2b, 0xfb, 0x58, 0xd4, 0x60, 0x5f, 0x26, 0x2a, 0xb7, 0x11, 0x33, 0x38, 0x09, 0xf5, 0x6b, 0xc4, 0xbe, 0x52, 0x46, 0x2a, 0xed, 0x17, 0xde, 0x15, 0x48, 0x18, 0xfa, 0x8f, 0xa5, 0x6c, 0x6c, 0xf2, 0x1f, 0x4e, 0xdb, 0x84, 0x1f, 0xf2, 0x0f, 0x1a, 0xf5, 0x0f, 0x53, 0xab, 0x4d, 0x00, 0x25, 0xa1, 0x76, 0xf1, 0x0f, 0x1d, 0x99, 0x45, 0xfd, 0x4b, 0xd9, 0x57, 0xb6, 0x11, 0xe9, 0xb9, 0x5e, 0x0c, 0xbc, 0xe9, 0x3c, 0x32, 0x62, 0xc4, 0xc5, 0xc5, 0xa5, 0xde, 0x08, 0x8f, 0x21, 0x2b, 0x28, 0xbf, 0xf2, 0x27, 0x65, 0x17, 0x1a, 0xd9, 0x56, 0xe1, 0xba, 0x54, 0xf8, 0xb8, 0xc1, 0x7d, 0x3c, 0x7c, 0x1a, 0x83, 0xaf, 0xfb, 0xaf, 0xd2, 0x71, 0x84, 0x3e, 0x91, 0xf2, 0x11, 0xc9, 0x6f, 0x88, 0x7d, 0x26, 0xe3, 0x8c, 0x45, 0xc1, 0x9e, 0xde, 0xa5, 0x8d, 0xa9, 0x41, 0xbf, 0x8a, 0x2f, 0x55, 0x23, 0xba, 0x93, 0xf9, 0x45, 0xf0, 0x62, 0x45, 0xfc, 0xd3, 0xf2, 0x3d, 0x24, 0xea, 0x7f, 0xc4, 0xa7, 0xc1, 0xdb, 0x88, 0x7e, 0xb0, 0xca, 0xfc, 0x45, 0x85, 0x0e, 0x63, 0xe3, 0x83, 0x05, 0xf3, 0x17, 0x15, 0x39, 0x44, 0x0d, 0x10, 0xef, 0x9e, 0x6a, 0xe3, 0x31, 0x6a, 0xd3, 0xdd, 0x4f, 0xd5, 0x38, 0xd7, 0xa1, 0x71, 0xae, 0xa5, 0xf9, 0x95, 0x9e, 0xb3, 0xf4, 0xfc, 0x96, 0xe8, 0x9b, 0xd4, 0x92, 0xb9, 0x57, 0x86, 0x1e, 0x53, 0xf9, 0xd6, 0x60, 0x5a, 0x16, 0x35, 0x31, 0x64, 0x4a, 0x02, 0x59, 0x87, 0x30, 0xfd, 0x92, 0x7d, 0x3d, 0xbf, 0x42, 0x17, 0xb3, 0x97, 0x85, 0x6d, 0x20, 0xbf, 0xca, 0xd8, 0xc6, 0x0c, 0x45, 0xa0, 0x43, 0x3c, 0x1b, 0x12, 0x4f, 0xf7, 0x5c, 0x06, 0xcd, 0x37, 0x82, 0x31, 0x48, 0x14, 0xf3, 0x5c, 0x4e, 0x5c, 0x96, 0xe8, 0x2e, 0xcc, 0x88, 0x1f, 0x77, 0xea, 0x39, 0x46, 0x7c, 0x5d, 0x10, 0x42, 0x88, 0xa4, 0x12, 0x6c, 0xe5, 0xb8, 0xee, 0x3c, 0x54, 0x30, 0x0e, 0x82, 0x30, 0x9e, 0x26, 0xce, 0xcb, 0x79, 0x39, 0xeb, 0x85, 0x1f, 0x91, 0x0d, 0x06, 0x83, 0x3e, 0xbe, 0xe9, 0x63, 0xe1, 0x6d, 0xaf, 0x27, 0xdb, 0x81, 0x04, 0xf7, 0x74, 0x70, 0xaf, 0x27, 0xa6, 0x0f, 0x44, 0xeb, 0x17, 0x03, 0x9d, 0x10, 0x38, 0x42, 0xe7, 0xdc, 0x02, 0x3f, 0xde, 0xd2, 0xef, 0xa1, 0x21, 0xc1, 0x6e, 0x50, 0xd1, 0x40, 0x2c, 0x5a, 0x06, 0x5a, 0xe9, 0x85, 0x81, 0xca, 0x4f, 0x90, 0x4e, 0x0c, 0xbe, 0xf2, 0x13, 0x23, 0xfe, 0xb9, 0x05, 0x3e, 0x46, 0xf1, 0x6f, 0xa8, 0xcc, 0x37, 0x6b, 0x2f, 0xa6, 0x9a, 0xf0, 0x31, 0xc0, 0x61, 0xac, 0x3f, 0x30, 0xe1, 0xe3, 0xb9, 0xd2, 0x00, 0x6b, 0x2f, 0x0e, 0xbf, 0x3f, 0x10, 0x95, 0x19, 0xf1, 0x11, 0x8f, 0xd7, 0x53, 0xd7, 0x8f, 0xe2, 0x0f, 0x42, 0xd5, 0x80, 0x3f, 0xd0, 0x6b, 0x22, 0xff, 0x66, 0x7c, 0x4f, 0xf6, 0xbe, 0x54, 0xa1, 0x8e, 0xaf, 0xcb, 0x8e, 0xf7, 0xa7, 0xc7, 0x1f, 0x04, 0x17, 0xc4, 0x8d, 0xac, 0x8c, 0xc5, 0x04, 0x28, 0x7b, 0xc2, 0xa2, 0x07, 0x33, 0x0b, 0xdb, 0xdb, 0xcc, 0x8b, 0x66, 0xeb, 0x28, 0x2f, 0x52, 0xce, 0x58, 0x7c, 0x69, 0xe3, 0x04, 0x7c, 0xd6, 0x4f, 0xc2, 0xef, 0xb1, 0x1f, 0x0c, 0x5f, 0xb3, 0x53, 0x1c, 0xbe, 0xb2, 0xf5, 0x0f, 0xb2, 0x7e, 0x3f, 0x09, 0xbf, 0x97, 0x80, 0x1f, 0x2e, 0x3d, 0xc1, 0x33, 0xaf, 0xfd, 0x27, 0xa8, 0x09, 0x71, 0xe9, 0xc7, 0xe7, 0x53, 0x38, 0x87, 0x29, 0xfe, 0x59, 0x72, 0x1e, 0x48, 0xc2, 0xef, 0x27, 0xe1, 0xf7, 0x4e, 0xc5, 0xef, 0x0f, 0x92, 0xf0, 0xbd, 0xfc, 0xf1, 0x11, 0xd6, 0x0f, 0xc4, 0xaf, 0x19, 0xdf, 0x8b, 0xff, 0x8f, 0xc8, 0x7f, 0x3f, 0x09, 0x5f, 0xe5, 0x01, 0xdd, 0x77, 0x63, 0x9e, 0x9f, 0xba, 0xef, 0x9c, 0x1a, 0xdb, 0x4f, 0x93, 0x07, 0x58, 0x9c, 0x5f, 0x05, 0x79, 0x31, 0xf8, 0x54, 0x3f, 0x14, 0x3f, 0x5e, 0xbe, 0x8e, 0xe0, 0x0f, 0xb4, 0x7c, 0x6d, 0xc6, 0xef, 0xab, 0xf8, 0xeb, 0x1b, 0xf1, 0x65, 0x9e, 0xef, 0x25, 0xae, 0x9f, 0x80, 0x1f, 0xcd, 0xf7, 0x71, 0xf8, 0x81, 0x3c, 0x10, 0xc6, 0x8f, 0x5f, 0xbf, 0x3f, 0xd0, 0x72, 0x40, 0xdf, 0xc4, 0xbf, 0xca, 0x01, 0xbd, 0xa7, 0xb0, 0x65, 0x4f, 0xca, 0xf2, 0x89, 0xaf, 0x7e, 0xca, 0xc2, 0xaf, 0x23, 0xef, 0xbd, 0x0c, 0xf5, 0x43, 0xa8, 0xec, 0x65, 0xa8, 0x1f, 0x8a, 0xf6, 0xf1, 0x87, 0xd6, 0x23, 0x0b, 0x00, 0x8f, 0xd4, 0x84, 0xc7, 0xd6, 0x23, 0x00, 0xbc, 0x07, 0x13, 0x1e, 0x31, 0x39, 0xe9, 0xd1, 0x63, 0xfc, 0x13, 0xb7, 0x80, 0xaf, 0x57, 0x09, 0x3e, 0x2f, 0xe7, 0xe5, 0xbc, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xa2, 0xdf, 0x4f, 0xa8, 0x65, 0x25, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd0, 0x86, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xe8, 0xf1, 0xab, 0x7f, 0xee, 0x4a, 0x55, 0x3f, 0x74, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7a, 0xbe, 0x4c, 0x93, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1c, 0x1f, 0x7b, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x8b, 0x3f, 0xc3, 0xd5, 0x3f, 0x65, 0xc4, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xe8, 0xf9, 0xbd, 0x15, 0xd1, 0x5f, 0x94, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfa, 0xf9, 0xc2, 0x3b, 0xdf, 0x55, 0x3e, 0x10, 0xfe, 0x3e, 0xc6, 0xbc, 0xef, 0x6b, 0x72, 0x4a, 0x04, 0x4e, 0xbc, 0xef, 0x6e, 0x84, 0xc6, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x22, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x68, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0xe2, 0x75, 0x6e, 0xd2, 0x7f, 0x18, 0x1e, 0xb1, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x00, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x61, 0xfb, 0x0b, 0x98, 0xdf, 0x9a, 0xf1, 0xe3, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x8f, 0xf3, 0xaf, 0x00, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x41, 0xd9, 0xc2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0x44, 0x95, 0x60, 0xb2, 0x4f, 0x1c, 0xff, 0x61, 0x18, 0x89, 0x3e, 0x3f, 0x08, 0xf1, 0x75, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xc1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x86, 0xed, 0xaf, 0xe5, 0x96, 0xc8, 0x67, 0x34, 0x16, 0x7a, 0xbe, 0x24, 0x7c, 0x5e, 0xf4, 0x6f, 0xa2, 0xcf, 0x04, 0xef, 0xf9, 0x43, 0x62, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xb0, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x21, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0x45, 0x13, 0x64, 0x12, 0xfd, 0xe0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x8a, 0x51, 0x66, 0xc8, 0x41, 0x11, 0x01, 0xad, 0x78, 0xff, 0x0c, 0x27, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe2, 0x3f, 0x14, 0xc3, 0xa6, 0x67, 0xc8, 0xe9, 0x39, 0x20, 0x64, 0x1f, 0x1a, 0xf3, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xc3, 0xb6, 0x33, 0xc9, 0x9f, 0x10, 0xff, 0xe1, 0x18, 0x36, 0xf9, 0x72, 0x20, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xf7, 0x0d, 0xdd, 0x04, 0x0f, 0xcb, 0x4e, 0x93, 0x72, 0x40, 0x4c, 0xfc, 0xd3, 0x98, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0xc5, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x97, 0xf3, 0x72, 0x5e, 0xce, 0x4b, 0x70, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4d, 0x3d, 0x16, 0x49, 0xd8, 0x3f, 0x10, 0xe2, 0xfd, 0x84, 0xd2, 0x6b, 0x23, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf0, 0xee, 0x4a, 0x62, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x78, 0x06, 0x43, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x88, 0xd3, 0x21, 0x3b, 0xed, 0x1c, 0x22, 0x74, 0x1c, 0x61, 0x45, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xfe, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x49, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xa0, 0x8f, 0x45, 0xf4, 0x46, 0x82, 0xc7, 0x3c, 0x11, 0xfa, 0x24, 0x19, 0x3f, 0x89, 0x3f, 0x2b, 0x21, 0x36, 0x4c, 0xf0, 0x84, 0xe3, 0x99, 0xd8, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0x89, 0x3f, 0x4f, 0x0c, 0xc8, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6c, 0x4d, 0xf6, 0xf1, 0x8e, 0xd7, 0x62, 0xf0, 0xe3, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x42, 0x70, 0x12, 0xb7, 0x7e, 0x4c, 0x7e, 0x20, 0xe4, 0x14, 0xf9, 0x42, 0xf9, 0x21, 0xce, 0xbf, 0xac, 0xe0, 0x4f, 0x03, 0xa3, 0xf4, 0x63, 0x72, 0x65, 0x78, 0xeb, 0x67, 0xa2, 0xcf, 0x42, 0x31, 0x9a, 0xa4, 0x3f, 0x12, 0x63, 0x3f, 0x12, 0xc3, 0x5f, 0xc0, 0x7e, 0x26, 0xfd, 0x85, 0x74, 0x14, 0x67, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x5c, 0xfc, 0x87, 0xf5, 0x1b, 0xa7, 0xbf, 0xd3, 0xec, 0x47, 0x4e, 0xd1, 0xbf, 0xc7, 0x63, 0x0c, 0x3e, 0x8d, 0xb3, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xce, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x4a, 0x0c, 0x9b, 0x8e, 0xdf, 0x03, 0xfe, 0x17, 0x63, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x50, 0x9e, 0x08, 0xf3, 0xce, 0xac, 0xf8, 0xf8, 0x0d, 0xe7, 0x00, 0x1a, 0xf3, 0xf3, 0xf0, 0x38, 0xfb, 0x06, 0x72, 0x54, 0x1c, 0x7e, 0xc8, 0x8f, 0xac, 0x84, 0x1c, 0x17, 0x3e, 0x23, 0x25, 0x86, 0x18, 0x8a, 0xcb, 0xdd, 0x46, 0xfa, 0x24, 0x18, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xca, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xc9, 0x39, 0xc0, 0x4a, 0x88, 0x61, 0x6a, 0x25, 0xe3, 0xb3, 0xb8, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xfe, 0xf1, 0xe8, 0x1f, 0x3f, 0xc7, 0xed, 0x2f, 0x48, 0xfc, 0xfe, 0x2b, 0x1c, 0xc3, 0xf4, 0x34, 0xb8, 0x15, 0x0f, 0x37, 0xc5, 0x7f, 0x78, 0xff, 0x46, 0x12, 0xe8, 0xc7, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x2d, 0x7a, 0xd7, 0x74, 0x7d, 0xe7, 0xbb, 0xa6, 0xeb, 0x2c, 0xbc, 0x9c, 0xb0, 0x3f, 0x32, 0x5d, 0xfd, 0x87, 0xa6, 0xeb, 0x4c, 0xbc, 0x8c, 0xfd, 0x3f, 0xb3, 0xef, 0xd7, 0xdf, 0x0f, 0x5f, 0x68, 0xdf, 0x47, 0x1f, 0x84, 0xaf, 0x73, 0xfb, 0x9e, 0x15, 0xfb, 0xe2, 0x15, 0xb5, 0x2f, 0x5e, 0xe7, 0xf6, 0x3d, 0xb7, 0xef, 0xc7, 0xbd, 0x9c, 0x18, 0xcc, 0xdb, 0xbb, 0x7b, 0x62, 0x30, 0xef, 0xe0, 0x4c, 0xd8, 0xf7, 0xc4, 0x60, 0xde, 0x6f, 0x3f, 0x38, 0x31, 0x98, 0xf7, 0xc3, 0x07, 0x67, 0x41, 0xde, 0xaf, 0xfd, 0x61, 0xd4, 0xc0, 0xc7, 0x0f, 0xfe, 0xe9, 0x9f, 0xa3, 0x06, 0x3e, 0x3e, 0x13, 0xf2, 0xfe, 0xc5, 0x5f, 0x9a, 0xe2, 0xf7, 0xbf, 0xff, 0xe7, 0xcc, 0xe6, 0xe7, 0xde, 0x5d, 0xfe, 0x27, 0xcb, 0xdd, 0x13, 0x5e, 0x20, 0x58, 0xf9, 0x9f, 0x2c, 0xdf, 0x15, 0xa3, 0x67, 0x22, 0x3f, 0xbf, 0xf7, 0x3e, 0xff, 0x93, 0xe5, 0xfd, 0x93, 0x93, 0x7b, 0xf7, 0x4f, 0x4e, 0x1e, 0xfd, 0xcb, 0x07, 0xfc, 0x4f, 0x96, 0x0f, 0x4e, 0x4e, 0xfe, 0xea, 0xaf, 0xcf, 0x86, 0xbc, 0x27, 0x91, 0xf2, 0xc7, 0xdf, 0x38, 0x31, 0x94, 0x7f, 0xfd, 0xde, 0x19, 0x91, 0xf7, 0xdd, 0x5f, 0x0d, 0xc8, 0xf5, 0x95, 0xdf, 0xff, 0xdd, 0xdf, 0xfb, 0x83, 0xaf, 0x9e, 0xfc, 0xda, 0xaf, 0x07, 0x46, 0xff, 0xee, 0xef, 0xff, 0xe6, 0x6f, 0xff, 0xe1, 0x1f, 0xcf, 0x84, 0xbc, 0xbf, 0xf9, 0x5b, 0x01, 0xc9, 0xfe, 0xe4, 0x4f, 0xbf, 0xf9, 0xad, 0x3f, 0xfb, 0xf3, 0x93, 0xdf, 0xfe, 0x9d, 0xc0, 0xe8, 0x7f, 0xfc, 0xe7, 0xbf, 0xfd, 0xfb, 0x7f, 0x7d, 0x7f, 0xe8, 0xae, 0x65, 0x7d, 0x92, 0x5f, 0x2f, 0x0f, 0xe1, 0xf5, 0x93, 0xfc, 0xe2, 0xf7, 0xd6, 0x93, 0x5c, 0xfc, 0x7f, 0xc7, 0xb2, 0x2e, 0xe0, 0xf5, 0x3c, 0x5c, 0x2f, 0xc0, 0x45, 0x2e, 0x90, 0x21, 0x2b, 0x78, 0x91, 0xd0, 0xa5, 0x53, 0xb8, 0x00, 0x24, 0x7e, 0xc9, 0x7a, 0xc9, 0x7a, 0xe9, 0xb9, 0x97, 0x9e, 0x7b, 0xb2, 0x35, 0xc3, 0xd7, 0xf3, 0x9f, 0xfc, 0xfe, 0x2b, 0xd6, 0xfa, 0x95, 0xf2, 0x52, 0xb9, 0x94, 0x7a, 0x3b, 0x35, 0x34, 0xbf, 0xb2, 0x50, 0xb6, 0x4b, 0xa9, 0x21, 0xb8, 0x1d, 0x7a, 0xe3, 0xb2, 0x8d, 0xa5, 0x34, 0x39, 0x9d, 0x83, 0xde, 0x25, 0xd5, 0x2b, 0x60, 0x6f, 0x6d, 0x7d, 0x75, 0x71, 0xf9, 0xb2, 0x5d, 0x9a, 0xc2, 0xce, 0xf2, 0xf5, 0xa5, 0x37, 0xca, 0xab, 0x00, 0x9a, 0xc4, 0xde, 0x67, 0xca, 0x9f, 0xbb, 0xb1, 0xb2, 0xba, 0x50, 0x2a, 0x62, 0x67, 0xee, 0xda, 0x22, 0xc7, 0xe2, 0x24, 0xe6, 0x57, 0x96, 0x96, 0xca, 0xcb, 0xeb, 0xa5, 0x49, 0x8e, 0xb5, 0xb6, 0x78, 0x79, 0x99, 0x13, 0xe4, 0x13, 0xd7, 0xca, 0x57, 0xcb, 0xf3, 0xeb, 0xb6, 0x84, 0xcd, 0x5f, 0x5f, 0x5d, 0x5b, 0x01, 0x8a, 0x62, 0xad, 0x2b, 0x73, 0x0b, 0x2b, 0x37, 0xec, 0x52, 0xc7, 0xdd, 0x77, 0x38, 0xcd, 0xab, 0xeb, 0x1b, 0x97, 0x56, 0x80, 0x4e, 0xad, 0xd2, 0x68, 0xf3, 0x91, 0xa5, 0xb9, 0xf5, 0xf9, 0x2b, 0x1b, 0x0b, 0xe5, 0xab, 0x8b, 0x4b, 0x8b, 0xeb, 0xe5, 0xd5, 0x35, 0x35, 0xf5, 0x56, 0x2e, 0x95, 0x1a, 0xba, 0x3c, 0xb7, 0x54, 0xbe, 0x36, 0xb7, 0x20, 0x85, 0x5a, 0x5f, 0xb9, 0x3e, 0x7f, 0x05, 0xee, 0x79, 0x07, 0x48, 0x5d, 0xbb, 0x32, 0x57, 0x9a, 0x7c, 0x7d, 0x02, 0xa9, 0xdc, 0x12, 0x18, 0xb7, 0x52, 0xa9, 0xf9, 0x2b, 0xe5, 0xf9, 0xcf, 0x6c, 0x2c, 0x97, 0x6f, 0x6c, 0xbc, 0x09, 0xd4, 0x16, 0x57, 0x96, 0x39, 0xc1, 0xd4, 0xf2, 0xca, 0xc6, 0xda, 0xca, 0xf5, 0xe5, 0x05, 0xb1, 0x70, 0xea, 0xf2, 0xe2, 0xa5, 0x8d, 0xab, 0xe5, 0xe5, 0xcb, 0xeb, 0x57, 0x4a, 0x85, 0x09, 0x7b, 0x6c, 0xcc, 0xae, 0x37, 0xed, 0xb6, 0x53, 0x6d, 0x35, 0xb7, 0xda, 0xa9, 0xb5, 0x95, 0x4b, 0xeb, 0x37, 0xe6, 0x56, 0xcb, 0x1b, 0xab, 0xe5, 0xe5, 0x85, 0x32, 0xea, 0x4a, 0x22, 0xbd, 0xb9, 0xf6, 0xb9, 0xe5, 0x79, 0x41, 0x6e, 0x7e, 0x75, 0x7d, 0x63, 0x69, 0x65, 0x79, 0x71, 0x7d, 0x65, 0x55, 0xa3, 0xb8, 0x36, 0x3f, 0x77, 0xb5, 0x5c, 0x2a, 0xa6, 0xae, 0x2f, 0xca, 0xdb, 0xa9, 0x54, 0x6a, 0x2c, 0xbe, 0xa4, 0x6a, 0xfb, 0xcd, 0x6a, 0xa7, 0xde, 0x6a, 0xda, 0xeb, 0x8b, 0xf3, 0x99, 0x6c, 0x6a, 0xa8, 0xda, 0x68, 0x63, 0xd3, 0x68, 0x55, 0x2b, 0x0d, 0xbb, 0x51, 0xd9, 0x74, 0x1a, 0xa5, 0xf4, 0xfa, 0x4e, 0xbd, 0x6d, 0xc3, 0x5f, 0xfb, 0xb0, 0xdd, 0x71, 0x76, 0x6d, 0x60, 0xb1, 0x56, 0xdf, 0xde, 0x77, 0x2b, 0x1c, 0xaf, 0x5a, 0x71, 0x3b, 0x6e, 0x7d, 0x6b, 0xdb, 0x49, 0x2b, 0xac, 0x76, 0xfd, 0x2d, 0xa7, 0xb4, 0xe7, 0xd6, 0x9b, 0x9d, 0x0c, 0x27, 0x90, 0x9b, 0xc8, 0x8d, 0xcd, 0x00, 0x4d, 0x7d, 0x28, 0x53, 0x98, 0x9a, 0x18, 0xc3, 0x89, 0xd9, 0xf1, 0xf1, 0x42, 0x2e, 0x33, 0x59, 0x9c, 0x81, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xcd, 0xad, 0x14, 0x97, 0x0d, 0xed, 0x56, 0x5e, 0xe5, 0x6e, 0x05, 0x6a, 0x5c, 0x2f, 0x7f, 0xb6, 0xf4, 0xf9, 0xcf, 0x83, 0x9a, 0x5f, 0xbb, 0xe9, 0xb8, 0x6d, 0x5c, 0x78, 0x72, 0x72, 0x02, 0xba, 0x95, 0x0e, 0xac, 0xbe, 0xb9, 0xdf, 0x71, 0xec, 0x9b, 0x4e, 0xb5, 0x68, 0x6f, 0xef, 0xed, 0x6f, 0xbc, 0xe9, 0xb8, 0x1d, 0xe7, 0xe0, 0x62, 0x18, 0x58, 0xe0, 0xc0, 0x75, 0xe7, 0x60, 0xbe, 0xd5, 0x72, 0xb7, 0x22, 0xe0, 0x29, 0x0e, 0x9e, 0x6f, 0x35, 0x5a, 0x2e, 0xc2, 0xf6, 0x9b, 0xf5, 0x5a, 0xcb, 0xdd, 0xb5, 0x77, 0x2b, 0x1d, 0x01, 0x59, 0x6a, 0x6d, 0x39, 0x8d, 0x37, 0xeb, 0x4e, 0xf7, 0x9a, 0xdb, 0xfa, 0x05, 0x87, 0xeb, 0x6c, 0xa9, 0x02, 0xf8, 0x7c, 0xa1, 0x9b, 0x15, 0xf7, 0xb0, 0xde, 0xdc, 0x16, 0x74, 0xaa, 0x8a, 0x86, 0x36, 0x5a, 0xb0, 0x3b, 0xda, 0xc2, 0x37, 0x5b, 0xf5, 0x2d, 0xa0, 0x5c, 0x6f, 0x66, 0xf0, 0x2e, 0xab, 0xdc, 0x89, 0x23, 0xda, 0xa5, 0x20, 0x23, 0x43, 0x0a, 0x11, 0x00, 0x48, 0x28, 0xa3, 0x4b, 0x91, 0xe5, 0x33, 0xb6, 0x1b, 0x1b, 0xd7, 0x5a, 0xed, 0x3a, 0x37, 0x47, 0x29, 0x99, 0x59, 0x7b, 0x84, 0xf3, 0x98, 0xf1, 0xf5, 0x94, 0xb3, 0x27, 0xf3, 0x13, 0x9c, 0xce, 0xad, 0xd4, 0xd0, 0x17, 0xbe, 0x00, 0x4e, 0x7c, 0x6d, 0xf1, 0xb3, 0xe5, 0xab, 0x46, 0x65, 0x8f, 0x8f, 0xef, 0xb9, 0x4e, 0xb5, 0xce, 0x47, 0x76, 0xea, 0xdb, 0x3b, 0x7b, 0x76, 0xad, 0xd1, 0xaa, 0x74, 0x12, 0x65, 0x55, 0x8a, 0x6c, 0x57, 0x76, 0xf7, 0x1a, 0x8e, 0x5b, 0x58, 0xb0, 0xdb, 0xad, 0x7d, 0xb7, 0xea, 0xe8, 0x30, 0x4e, 0xc5, 0xee, 0xb8, 0xdb, 0x1b, 0x07, 0xe6, 0xe1, 0x43, 0xf3, 0x70, 0xd7, 0x3c, 0xbc, 0x13, 0x1d, 0x6e, 0x57, 0x5d, 0xd3, 0x6c, 0x1c, 0x86, 0xd9, 0x5c, 0x34, 0xbb, 0xbc, 0xbb, 0xdf, 0xa8, 0x74, 0x9c, 0x2d, 0x08, 0xc4, 0xbd, 0xfd, 0x8e, 0xed, 0x3a, 0xed, 0x56, 0x63, 0x1f, 0x55, 0x97, 0x47, 0xf9, 0x50, 0x2e, 0x18, 0x2a, 0x71, 0x1b, 0x14, 0xa6, 0x67, 0xf2, 0x13, 0xb9, 0xc9, 0xa9, 0x29, 0xae, 0x3a, 0x81, 0x7e, 0xa5, 0xe2, 0x6e, 0x35, 0x9d, 0x76, 0xdb, 0x6e, 0xd5, 0x80, 0x6e, 0xa5, 0xd9, 0xa8, 0x37, 0x9d, 0xbc, 0x00, 0xd9, 0x63, 0xaf, 0xe7, 0x27, 0xc0, 0x34, 0xed, 0x56, 0xad, 0x23, 0x46, 0xc6, 0x26, 0x67, 0xf8, 0xc8, 0xae, 0xb3, 0x55, 0xdf, 0xdf, 0x85, 0x31, 0xc1, 0xcf, 0x0e, 0xd0, 0x58, 0x03, 0xdc, 0x12, 0x22, 0x98, 0x08, 0xef, 0xd5, 0x0f, 0x9c, 0x46, 0x9b, 0xa7, 0x8a, 0xe0, 0x12, 0x63, 0x85, 0xf0, 0x0a, 0x53, 0x7c, 0x00, 0x29, 0x06, 0xc8, 0x5f, 0xab, 0x1f, 0x94, 0xc6, 0x8a, 0x3e, 0xf5, 0x85, 0x7a, 0x7b, 0xaf, 0x51, 0x39, 0xb4, 0xbb, 0x15, 0x77, 0x4f, 0xd2, 0x9a, 0xe0, 0x98, 0xcd, 0x56, 0xd3, 0x11, 0x7d, 0x70, 0x90, 0x71, 0x21, 0x80, 0x73, 0xd0, 0x71, 0x9d, 0x5d, 0x47, 0xe9, 0x03, 0x71, 0x84, 0x42, 0x70, 0xca, 0xcc, 0x14, 0xea, 0x04, 0x6e, 0xa6, 0x5e, 0x47, 0xb5, 0xd8, 0x72, 0x81, 0xb9, 0xdd, 0xd6, 0x7e, 0xb3, 0xc3, 0xb5, 0xb2, 0x53, 0xd9, 0x6a, 0x75, 0xc1, 0xf1, 0xdb, 0x5f, 0xcc, 0x7b, 0x3c, 0x61, 0x6f, 0xa1, 0xe2, 0x7e, 0xb1, 0x34, 0x91, 0x9f, 0xbe, 0x18, 0x18, 0xbd, 0x0a, 0x1e, 0xd6, 0x29, 0x4d, 0xe2, 0x30, 0xa7, 0x34, 0xf6, 0x8c, 0x8a, 0xe4, 0xab, 0xbd, 0x7a, 0xf9, 0x0d, 0xbb, 0xd3, 0xb2, 0xaf, 0x82, 0x12, 0x2b, 0xae, 0x14, 0x7d, 0xae, 0xdd, 0xde, 0x47, 0x37, 0xde, 0x6f, 0xe3, 0xbf, 0x62, 0xca, 0xe1, 0x1e, 0xf8, 0x04, 0xb8, 0x74, 0x67, 0x1f, 0xec, 0x6f, 0x77, 0x30, 0x19, 0xb6, 0x77, 0x5a, 0xfb, 0x8d, 0x2d, 0x50, 0x51, 0xc7, 0xde, 0x74, 0xec, 0xa6, 0xe3, 0x6c, 0x39, 0x5b, 0xbe, 0x48, 0xeb, 0x2d, 0x41, 0x73, 0x32, 0x23, 0xfa, 0xd5, 0xec, 0xdb, 0xae, 0x03, 0xd8, 0xcd, 0x4c, 0x75, 0x16, 0xc4, 0x9c, 0x98, 0x9a, 0x98, 0x9a, 0xce, 0x7e, 0xba, 0x3a, 0x3e, 0x59, 0xc8, 0xff, 0x6c, 0xe1, 0xe7, 0xf6, 0x5a, 0xdd, 0x4c, 0xa6, 0x3a, 0x0a, 0xe3, 0xd3, 0xd3, 0xd9, 0xf1, 0x49, 0x6c, 0x72, 0x85, 0xfc, 0x54, 0xf6, 0xe2, 0x2d, 0xa1, 0xe6, 0xa2, 0x47, 0x2f, 0xc3, 0x7b, 0x1e, 0x35, 0x9e, 0xf1, 0x32, 0xfe, 0x62, 0xd5, 0xbc, 0x9b, 0xcd, 0xe9, 0xdd, 0xed, 0x60, 0x77, 0x33, 0x8b, 0x34, 0x85, 0x9c, 0x62, 0x14, 0xc5, 0x47, 0x19, 0x9f, 0xad, 0xf0, 0x6b, 0xee, 0xf6, 0xa6, 0x49, 0x74, 0x90, 0x70, 0xa2, 0x38, 0x59, 0x9c, 0x78, 0xfd, 0xd3, 0xd5, 0x11, 0x21, 0x3a, 0x17, 0x76, 0x04, 0x15, 0x50, 0xcd, 0x4d, 0xe4, 0xa7, 0x26, 0x67, 0x66, 0x66, 0xb2, 0x63, 0x42, 0x11, 0xba, 0xf4, 0x48, 0x30, 0x46, 0x76, 0xb1, 0x96, 0x94, 0x5c, 0x75, 0xb6, 0xf5, 0x8e, 0x2e, 0xf5, 0x32, 0xc8, 0xec, 0xb4, 0x3b, 0xb6, 0xa3, 0x22, 0x5d, 0x24, 0x25, 0x7b, 0xbb, 0x7e, 0xd3, 0x69, 0x8a, 0x94, 0x80, 0x92, 0xef, 0xb5, 0xe0, 0x41, 0x05, 0xff, 0xca, 0x94, 0x5a, 0x69, 0x72, 0x0d, 0x38, 0x0d, 0xf0, 0xe1, 0x5a, 0xdb, 0xe9, 0x28, 0x6d, 0x35, 0xda, 0x2d, 0xfb, 0x2d, 0xc7, 0x6d, 0xfd, 0x0c, 0x46, 0x26, 0xc6, 0xbc, 0xeb, 0x38, 0x2a, 0x57, 0x14, 0xed, 0x4b, 0x4e, 0xa7, 0xba, 0x93, 0xe1, 0x61, 0x02, 0x94, 0x72, 0xfc, 0x06, 0xa6, 0x65, 0x79, 0xa6, 0x87, 0x91, 0x12, 0x6a, 0xa8, 0xe5, 0x66, 0xe0, 0x76, 0x04, 0x98, 0x1a, 0x45, 0xd8, 0x28, 0x8f, 0x25, 0x08, 0x04, 0xd0, 0xc6, 0x74, 0x36, 0x3b, 0x0e, 0xe3, 0x3c, 0xc1, 0x4b, 0x99, 0x3d, 0x3f, 0x98, 0xcc, 0x17, 0x20, 0x91, 0x4b, 0xab, 0x14, 0x16, 0x32, 0x22, 0xa3, 0xe6, 0x80, 0x54, 0xfe, 0xe0, 0x30, 0xc7, 0x73, 0x4b, 0x36, 0x0f, 0xf2, 0xfb, 0x92, 0x43, 0x94, 0x77, 0x2a, 0xcd, 0xaa, 0x83, 0x99, 0xc3, 0x93, 0x5e, 0x26, 0x13, 0x70, 0x82, 0xa6, 0x54, 0x0c, 0x17, 0xd3, 0x4b, 0x77, 0x88, 0xe4, 0x49, 0x90, 0x7d, 0x1b, 0x99, 0x96, 0xdc, 0x5e, 0x94, 0x1c, 0x8d, 0x65, 0x90, 0xff, 0x31, 0x4f, 0x92, 0x6c, 0x76, 0x4c, 0x89, 0x90, 0x15, 0x26, 0x1c, 0x1a, 0x92, 0x39, 0x64, 0xc1, 0xbe, 0x5c, 0xd9, 0x6f, 0xb7, 0xeb, 0x95, 0xa6, 0xef, 0x2b, 0x38, 0x22, 0x1d, 0x05, 0x75, 0xa4, 0x72, 0x72, 0xa5, 0xe1, 0x78, 0x76, 0x76, 0x0e, 0xf6, 0x0a, 0x19, 0x3e, 0x34, 0x82, 0x6b, 0xe3, 0x1a, 0x9e, 0x50, 0xc5, 0xb1, 0x4e, 0x65, 0xcf, 0x23, 0x6b, 0xd7, 0xea, 0x8d, 0x8e, 0xe3, 0xda, 0x95, 0x46, 0x0b, 0x6c, 0xb8, 0xd3, 0x72, 0xdf, 0xb2, 0x55, 0x7e, 0xe4, 0x06, 0xb9, 0x02, 0x23, 0x45, 0xdf, 0x20, 0x62, 0x31, 0xcf, 0x22, 0x7c, 0xca, 0x66, 0x49, 0x58, 0x4d, 0x19, 0x2c, 0x33, 0x06, 0x1e, 0x9a, 0xc3, 0x39, 0xe2, 0x41, 0x2b, 0x7c, 0x30, 0x3c, 0x09, 0xf3, 0x65, 0x78, 0xd2, 0x56, 0x64, 0x52, 0x90, 0x92, 0x58, 0x7d, 0xab, 0xdd, 0x29, 0x71, 0x25, 0xa3, 0x58, 0x79, 0xfe, 0xec, 0x43, 0xb9, 0xe6, 0x5b, 0x4d, 0x78, 0xee, 0x02, 0x58, 0x19, 0x0d, 0x2c, 0xd4, 0x75, 0x30, 0x1b, 0xe6, 0x7d, 0x5c, 0xae, 0x93, 0x92, 0xcc, 0xe8, 0x1a, 0xcd, 0xee, 0x66, 0x89, 0xab, 0x15, 0x68, 0x73, 0xee, 0x85, 0x3a, 0xf5, 0x09, 0x55, 0x6f, 0x02, 0x26, 0x1d, 0xc3, 0x84, 0x2d, 0x7f, 0x42, 0x88, 0x02, 0x30, 0xb7, 0x2a, 0xec, 0x22, 0x94, 0xed, 0x85, 0x50, 0x5e, 0x73, 0xd3, 0xcc, 0xe6, 0x48, 0x77, 0x73, 0xb4, 0x3a, 0xd2, 0xad, 0x8e, 0x6e, 0x8d, 0x74, 0xb7, 0xb2, 0xe3, 0x19, 0xe8, 0x42, 0x07, 0x6e, 0x3d, 0xd3, 0x4d, 0x3f, 0xb5, 0xe9, 0xa6, 0x93, 0x4d, 0x57, 0x89, 0x98, 0xae, 0x10, 0xb5, 0xca, 0x8f, 0xce, 0xbe, 0x7c, 0x92, 0x13, 0x99, 0x54, 0xf8, 0x51, 0x39, 0x41, 0xc5, 0x77, 0x82, 0x82, 0xd1, 0xc6, 0x3f, 0x4c, 0x2f, 0x91, 0x13, 0x1c, 0x7f, 0x42, 0xe1, 0xa3, 0xb8, 0x51, 0x65, 0xa4, 0x5b, 0x19, 0x0d, 0xfa, 0xd2, 0xa8, 0x33, 0xd2, 0x75, 0xd0, 0xa1, 0x2a, 0xa3, 0xca, 0xa7, 0x46, 0x61, 0xc0, 0x73, 0x2b, 0x49, 0x55, 0xed, 0x8d, 0x34, 0x85, 0x09, 0x9e, 0x70, 0x6f, 0x15, 0xeb, 0x47, 0x26, 0x73, 0x1c, 0xea, 0xf9, 0xd7, 0x13, 0x07, 0x50, 0x72, 0x6a, 0xab, 0xe6, 0x2f, 0x3e, 0xd7, 0x68, 0xc0, 0xee, 0xc6, 0x4b, 0xa5, 0x3b, 0xf0, 0x38, 0xe0, 0x6e, 0xcc, 0x33, 0xac, 0x53, 0xab, 0xc1, 0x3e, 0x5c, 0xa4, 0x5c, 0xcf, 0xaf, 0xd7, 0xdd, 0xba, 0x96, 0x5f, 0x35, 0x5f, 0x16, 0xb9, 0x0a, 0x79, 0x1c, 0x53, 0xbb, 0x73, 0xe5, 0xc1, 0x22, 0x16, 0x10, 0x84, 0x7e, 0x19, 0xf0, 0x5b, 0x1f, 0xcb, 0xdb, 0xd3, 0xfb, 0xfe, 0xc0, 0x45, 0x0f, 0x52, 0xf4, 0x5c, 0xc1, 0x83, 0xf9, 0x24, 0x3d, 0x2f, 0xf0, 0x61, 0x1e, 0x9e, 0x54, 0x47, 0xd0, 0x3e, 0x81, 0x47, 0x4d, 0xcb, 0xe5, 0x4f, 0x4e, 0x6d, 0x27, 0x0c, 0xf8, 0xf8, 0x1c, 0x85, 0xb7, 0x3b, 0x31, 0x8a, 0xcf, 0x4a, 0x88, 0xf7, 0xbd, 0x9d, 0x8a, 0xf7, 0xb8, 0xb9, 0x01, 0xbb, 0xc9, 0x90, 0x3a, 0xd4, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x88, 0x87, 0x01, 0x72, 0x7c, 0xc4, 0xdb, 0x78, 0x8e, 0x22, 0x7b, 0xf9, 0xc3, 0x11, 0xfe, 0x6f, 0x76, 0x84, 0x6f, 0x64, 0x0f, 0x72, 0x1e, 0xe0, 0x80, 0x03, 0x0e, 0x24, 0xe0, 0x30, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x28, 0xee, 0x3d, 0x15, 0xff, 0x6b, 0xc1, 0x5d, 0x2a, 0xd7, 0xed, 0x12, 0x74, 0xa2, 0xac, 0xe5, 0x0f, 0x46, 0x4b, 0x62, 0x69, 0xbe, 0x9f, 0x56, 0x86, 0x40, 0xcc, 0x12, 0xdf, 0x9f, 0xa8, 0xbd, 0x6d, 0x2e, 0x72, 0x23, 0xb8, 0xe0, 0x34, 0x4a, 0x35, 0xb7, 0x52, 0xed, 0x08, 0x56, 0xc7, 0x67, 0x94, 0x8e, 0xeb, 0x35, 0x31, 0x02, 0xbb, 0xa6, 0x62, 0xb1, 0x98, 0xe5, 0xdc, 0xb8, 0x25, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0xdb, 0xa6, 0x89, 0x1c, 0xb2, 0x19, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xc5, 0x5b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xcd, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x21, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0x3b, 0x25, 0x78, 0x2f, 0xbd, 0xe4, 0x56, 0xb6, 0xf9, 0xab, 0x20, 0x6c, 0x4c, 0xc4, 0xd6, 0x80, 0xbf, 0xe5, 0xe5, 0xc4, 0x5b, 0x9d, 0x10, 0x95, 0x4f, 0xce, 0x1f, 0x96, 0xf8, 0xcb, 0xd8, 0x98, 0xec, 0xf1, 0x3d, 0xff, 0x90, 0x52, 0x79, 0x89, 0xfb, 0x06, 0x07, 0x8d, 0x7b, 0x54, 0xba, 0x82, 0xca, 0x4e, 0x56, 0xbc, 0x82, 0x0d, 0x79, 0xcb, 0xc1, 0x9b, 0x33, 0xee, 0x7e, 0x4a, 0x18, 0x5e, 0x68, 0xaf, 0x11, 0x6e, 0xbe, 0x10, 0x37, 0xde, 0xab, 0xb3, 0x87, 0x23, 0x5e, 0xb0, 0xa7, 0xe4, 0xae, 0x32, 0x13, 0x26, 0x97, 0x0d, 0xbd, 0x29, 0xa7, 0x6e, 0xa5, 0xfe, 0x17, 0x5c, 0x2e, 0x00, 0x32, \ No newline at end of file diff --git a/config.lua b/config.lua index e1ba4b069..e0a2e8544 100644 --- a/config.lua +++ b/config.lua @@ -30,6 +30,7 @@ CHECK_NEW_VERSION=true NO_SOUND=false GIF_LENGTH=20 -- in seconds SOFTWARE_RENDERING=false +VSYNC=true CRT_MONITOR=false GIF_SCALE=3 UI_SCALE=4 diff --git a/src/studio/config.c b/src/studio/config.c index e403f5432..23ad2d5a2 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -188,16 +188,17 @@ static void readConfig(Config* config) { if(luaL_loadstring(lua, config->cart->code.data) == LUA_OK && lua_pcall(lua, 0, LUA_MULTRET, 0) == LUA_OK) { - readGlobalInteger(lua, "GIF_LENGTH", &config->data.gifLength); - readGlobalInteger(lua, "GIF_SCALE", &config->data.gifScale); - readGlobalBool(lua, "CHECK_NEW_VERSION", &config->data.checkNewVersion); - readGlobalBool(lua, "NO_SOUND", &config->data.noSound); + readGlobalInteger(lua, "GIF_LENGTH", &config->data.gifLength); + readGlobalInteger(lua, "GIF_SCALE", &config->data.gifScale); + readGlobalBool(lua, "CHECK_NEW_VERSION", &config->data.checkNewVersion); + readGlobalBool(lua, "NO_SOUND", &config->data.noSound); + readGlobalInteger(lua, "UI_SCALE", &config->data.uiScale); + readGlobalBool(lua, "VSYNC", &config->data.vsync); + readGlobalBool(lua, "SOFTWARE_RENDERING", &config->data.soft); #if defined(CRT_SHADER_SUPPORT) - readGlobalBool(lua, "SOFTWARE_RENDERING", &config->data.soft); - readGlobalBool(lua, "CRT_MONITOR", &config->data.crt); + readGlobalBool(lua, "CRT_MONITOR", &config->data.crt); readConfigCrtShader(config, lua); #endif - readGlobalInteger(lua, "UI_SCALE", &config->data.uiScale); readTheme(config, lua); } diff --git a/src/studio/studio.c b/src/studio/studio.c index a4a4c69bb..0d379ec5a 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -2220,11 +2220,12 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.uiScale = args.scale; #if defined(CRT_SHADER_SUPPORT) - impl.config->data.soft |= args.soft; - impl.config->data.crt |= args.crt; + impl.config->data.crt |= args.crt; #endif impl.config->data.goFullscreen |= args.fullscreen; + impl.config->data.soft |= args.soft; + impl.config->data.vsync |= args.vsync; impl.config->data.noSound |= args.nosound; impl.config->data.cli |= args.cli; diff --git a/src/studio/studio.h b/src/studio/studio.h index 670a00780..8d4416e1e 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -64,7 +64,6 @@ #if defined(CRT_SHADER_SUPPORT) # define CRT_CMD_PARAM(macro) \ - macro(soft, bool, BOOLEAN, "", "use software rendering") \ macro(crt, bool, BOOLEAN, "", "enable CRT monitor effect") #else # define CRT_CMD_PARAM(macro) @@ -75,6 +74,8 @@ macro(nosound, bool, BOOLEAN, "", "disable sound output") \ macro(cli, bool, BOOLEAN, "", "console only output") \ macro(fullscreen, bool, BOOLEAN, "", "enable fullscreen mode") \ + macro(vsync, bool, BOOLEAN, "", "enable VSYNC") \ + macro(soft, bool, BOOLEAN, "", "use software rendering") \ macro(fs, char*, STRING, "=", "path to the file system folder") \ macro(scale, s32, INTEGER, "=", "main window scale") \ macro(cmd, char*, STRING, "=", "run commands in the console") \ diff --git a/src/studio/system.h b/src/studio/system.h index fddd0c0cb..656e63337 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -106,9 +106,9 @@ typedef struct bool checkNewVersion; bool noSound; bool cli; + bool soft; #if defined(CRT_SHADER_SUPPORT) - bool soft; bool crt; struct { @@ -118,6 +118,7 @@ typedef struct #endif bool goFullscreen; + bool vsync; const tic_cartridge* cart; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 8ec9807ed..4cab50ad8 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -494,15 +494,18 @@ static void initTouchGamepad() static void initGPU() { + bool vsync = platform.studio->config()->vsync; + bool soft = platform.studio->config()->soft; + #if defined(CRT_SHADER_SUPPORT) - if(!platform.studio->config()->soft) + if(!soft) { s32 w, h; SDL_GetWindowSize(platform.window, &w, &h); GPU_SetInitWindow(SDL_GetWindowID(platform.window)); - platform.screen.renderer.gpu = GPU_Init(w, h, GPU_INIT_DISABLE_VSYNC); + platform.screen.renderer.gpu = GPU_Init(w, h, vsync ? GPU_INIT_ENABLE_VSYNC : GPU_INIT_DISABLE_VSYNC); GPU_SetWindowResolution(w, h); GPU_SetVirtualResolution(platform.screen.renderer.gpu, w, h); @@ -518,9 +521,10 @@ static void initGPU() #if defined(CRT_SHADER_SUPPORT) SDL_RENDERER_SOFTWARE #else - SDL_RENDERER_ACCELERATED + (soft ? SDL_RENDERER_SOFTWARE : SDL_RENDERER_ACCELERATED) #endif - ); + | (!soft && vsync ? SDL_RENDERER_PRESENTVSYNC : 0) + ); platform.screen.texture.sdl = SDL_CreateTexture(platform.screen.renderer.sdl, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); @@ -1539,12 +1543,6 @@ static void gpuTick() static void emsGpuTick() { - static double nextTick = -1.0; - - if(nextTick < 0.0) - nextTick = emscripten_get_now(); - - nextTick += 1000.0/TIC80_FRAMERATE; gpuTick(); EM_ASM( @@ -1555,15 +1553,6 @@ static void emsGpuTick() FS.syncfs(false,function(){}); } }); - - double delay = nextTick - emscripten_get_now(); - - if(delay < 0.0) - { - nextTick -= delay; - } - else - emscripten_set_main_loop_timing(EM_TIMING_SETTIMEOUT, delay); } #endif @@ -1613,27 +1602,29 @@ static s32 start(s32 argc, char **argv, const char* folder) SDL_PauseAudioDevice(platform.audio.device, 0); #if defined(__EMSCRIPTEN__) - emscripten_set_main_loop(emsGpuTick, 0, 1); + emscripten_set_main_loop(emsGpuTick, platform.studio->config()->vsync ? 0 : TIC80_FRAMERATE, 1); #else { - u64 nextTick = SDL_GetPerformanceCounter(); + u64 nextTick = 0; const u64 Delta = SDL_GetPerformanceFrequency() / TIC80_FRAMERATE; while (!platform.studio->quit) { - nextTick += Delta; - gpuTick(); + if(nextTick == 0) + nextTick = SDL_GetPerformanceCounter(); + else { s64 delay = nextTick - SDL_GetPerformanceCounter(); - if(delay >= 0) + if(delay > 0) SDL_Delay((u32)(delay * 1000 / SDL_GetPerformanceFrequency())); } + + nextTick += Delta; } } - #endif #if defined(TOUCH_INPUT_SUPPORT) From 4f53c21a673d3c751a43fc6c35bc19a7020fbb36 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 2 Dec 2021 16:21:40 +0300 Subject: [PATCH 103/379] OVR renamed to VBANK1, OVR() callback compatibility logic moved to one place #1508 --- build/tools/xplode.c | 8 ++-- src/api.h | 16 +++---- src/api/fennel.c | 6 --- src/api/js.c | 36 +++++++-------- src/api/lua.c | 46 +++++++------------ src/api/moonscript.c | 6 --- src/api/squirrel.c | 82 ++++++++++++++++------------------ src/api/wren.c | 40 +++++++---------- src/cart.c | 6 +-- src/core/core.c | 86 ++++++++++++++---------------------- src/core/core.h | 12 +++++ src/core/draw.c | 4 +- src/studio/editors/map.c | 20 ++++----- src/studio/editors/sprite.c | 50 ++++++++++----------- src/studio/editors/sprite.h | 2 +- src/studio/editors/world.c | 4 +- src/studio/screens/console.c | 24 +++++----- src/studio/screens/dialog.c | 4 +- src/studio/screens/menu.c | 6 +-- src/studio/screens/surf.c | 8 ++-- src/studio/studio.c | 26 +++++------ src/studio/studio.h | 2 +- src/system/sdl/main.c | 8 ++-- src/tic.h | 11 ++--- 24 files changed, 225 insertions(+), 288 deletions(-) diff --git a/build/tools/xplode.c b/build/tools/xplode.c index 94ac28f04..1e139945d 100644 --- a/build/tools/xplode.c +++ b/build/tools/xplode.c @@ -92,7 +92,7 @@ s32 main(s32 argc, char** argv) for(s32 i = 0; i < TIC80_WIDTH * TIC80_HEIGHT; i++) data[i] = tic_tool_peek4(cart->bank0.screen.data, i); - if(gif_write_data(buffer.data, &buffer.size, TIC80_WIDTH, TIC80_HEIGHT, data, (gif_color*)cart->bank0.palette.scn.colors, TIC_PALETTE_BPP)) + if(gif_write_data(buffer.data, &buffer.size, TIC80_WIDTH, TIC80_HEIGHT, data, (gif_color*)cart->bank0.palette.vbank0.colors, TIC_PALETTE_BPP)) { writeFile("cover.gif", buffer); printf("cover.gif successfully exported\n"); @@ -108,7 +108,7 @@ s32 main(s32 argc, char** argv) png_img img = {TIC80_WIDTH, TIC80_HEIGHT, malloc(TIC80_WIDTH * TIC80_HEIGHT * sizeof(png_rgba))}; for(s32 i = 0; i < TIC80_WIDTH * TIC80_HEIGHT; i++) - ((u32*)img.data)[i] = tic_rgba(&cart->bank0.palette.scn.colors[tic_tool_peek4(cart->bank0.screen.data, i)]); + ((u32*)img.data)[i] = tic_rgba(&cart->bank0.palette.vbank0.colors[tic_tool_peek4(cart->bank0.screen.data, i)]); png_buffer png = png_write(img); writeFile("cover.png", (FileBuffer){png.size, png.data}); @@ -156,7 +156,7 @@ s32 main(s32 argc, char** argv) const tic_tile* tile = &cart->bank0.tiles.data[x / TIC_SPRITESIZE + y / TIC_SPRITESIZE * (TIC_SPRITESHEET_SIZE / TIC_SPRITESIZE)]; u8 index = tic_tool_peek4(tile->data, (x % TIC_SPRITESIZE) + (y % TIC_SPRITESIZE) * TIC_SPRITESIZE); - ((u32*)img.data)[x + y * TIC_SPRITESHEET_SIZE] = tic_rgba(&cart->bank0.palette.scn.colors[index]); + ((u32*)img.data)[x + y * TIC_SPRITESHEET_SIZE] = tic_rgba(&cart->bank0.palette.vbank0.colors[index]); } png_buffer png = png_write(img); @@ -177,7 +177,7 @@ s32 main(s32 argc, char** argv) const tic_tile* tile = &cart->bank0.tiles.data[x / TIC_SPRITESIZE + y / TIC_SPRITESIZE * (TIC_SPRITESHEET_SIZE / TIC_SPRITESIZE)] + TIC_BANK_SPRITES; u8 index = tic_tool_peek4(tile->data, (x % TIC_SPRITESIZE) + (y % TIC_SPRITESIZE) * TIC_SPRITESIZE); - ((u32*)img.data)[x + y * TIC_SPRITESHEET_SIZE] = tic_rgba(&cart->bank0.palette.scn.colors[index]); + ((u32*)img.data)[x + y * TIC_SPRITESHEET_SIZE] = tic_rgba(&cart->bank0.palette.vbank0.colors[index]); } png_buffer png = png_write(img); diff --git a/src/api.h b/src/api.h index ca72f25cc..4c3f2f1d4 100644 --- a/src/api.h +++ b/src/api.h @@ -53,7 +53,6 @@ typedef struct tic_mem tic_mem; typedef void(*tic_tick)(tic_mem* memory); typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data); typedef void(*tic_border)(tic_mem* memory, s32 row, void* data); -typedef void(*tic_overline)(tic_mem* memory, void* data); typedef struct { @@ -64,7 +63,6 @@ typedef struct typedef struct { tic_scanline scanline; - tic_overline overline; tic_border border; void* data; } tic_blit_callback; @@ -143,9 +141,7 @@ enum macro(SCN_FN, SCN_FN "(row)", "Allows you to execute code between the drawing of each scanline, " \ "for example, to manipulate the palette.") \ macro(BDR_FN, BDR_FN "(row)", "Allows you to execute code between the drawing of each fullscreen scanline, " \ - "for example, to manipulate the palette.") \ - macro(OVR_FN, OVR_FN "()", "Called after each frame;" \ - "draw calls from this function ignore palette swap and screen offset.") + "for example, to manipulate the palette.") // API DEFINITION TABLE // macro @@ -661,7 +657,7 @@ enum "VRAM contains 2x16K memory chips, use vbank(0) or vbank(1) to switch between them.", \ 1, \ s32, \ - tic_mem*, s32 ovr) \ + tic_mem*, s32 bank) \ \ \ macro(reset, \ @@ -769,8 +765,6 @@ typedef struct u64 tick_counter; } tic80_local; -#define VBANK(tic, ovr) \ - bool MACROVAR(_ovr_) = tic_api_vbank(tic, ovr); \ - SCOPE(tic_api_vbank(tic, MACROVAR(_ovr_))) - -#define OVR(tic) VBANK(tic, 1) +#define VBANK(tic, bank) \ + bool MACROVAR(_bank_) = tic_api_vbank(tic, bank); \ + SCOPE(tic_api_vbank(tic, MACROVAR(_bank_))) diff --git a/src/api/fennel.c b/src/api/fennel.c index 6c7a9795f..d34ca836d 100644 --- a/src/api/fennel.c +++ b/src/api/fennel.c @@ -166,7 +166,6 @@ tic_script_config FennelSyntaxConfig = { .scanline = callLuaScanline, .border = callLuaBorder, - .overline = callLuaOverline, }, .getOutline = getFennelOutline, @@ -184,11 +183,6 @@ tic_script_config FennelSyntaxConfig = .keywordsCount = COUNT_OF(FennelKeywords), }; -const tic_script_config* get_fennel_script_config() -{ - return &FennelSyntaxConfig; -} - #endif /* defined(TIC_BUILD_WITH_FENNEL) */ #endif \ No newline at end of file diff --git a/src/api/js.c b/src/api/js.c index f5199c3a7..226440bbe 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -1017,6 +1017,21 @@ static void callJavascriptTick(tic_mem* tic) if(duk_pcall(duk, 0) != DUK_EXEC_SUCCESS) { core->data->error(core->data->data, duk_safe_to_stacktrace(duk, -1)); + return; + } + + // call OVR() callback for backward compatibility + { + if(duk_get_global_string(duk, OVR_FN)) + { + OVR(tic) + { + if(duk_pcall(duk, 0) != 0) + core->data->error(core->data->data, duk_safe_to_stacktrace(duk, -1)); + } + } + + duk_pop(duk); } } else core->data->error(core->data->data, "'function TIC()...' isn't found :("); @@ -1054,21 +1069,6 @@ static void callJavascriptBorder(tic_mem* tic, s32 row, void* data) callJavascriptScanlineName(tic, row, data, BDR_FN); } -static void callJavascriptOverline(tic_mem* tic, void* data) -{ - tic_core* core = (tic_core*)tic; - duk_context* duk = core->currentVM; - - if(duk_get_global_string(duk, OVR_FN)) - { - tic_api_cls(tic, 0); - if(duk_pcall(duk, 0) != 0) - core->data->error(core->data->data, duk_safe_to_stacktrace(duk, -1)); - } - - duk_pop(duk); -} - static const char* const JsKeywords [] = { "break", "do", "instanceof", "typeof", "case", "else", "new", @@ -1156,7 +1156,6 @@ const tic_script_config JsSyntaxConfig = { .scanline = callJavascriptScanline, .border = callJavascriptBorder, - .overline = callJavascriptOverline, }, .getOutline = getJsOutline, @@ -1174,9 +1173,4 @@ const tic_script_config JsSyntaxConfig = .keywordsCount = COUNT_OF(JsKeywords), }; -const tic_script_config* get_js_script_config() -{ - return &JsSyntaxConfig; -} - #endif /* defined(TIC_BUILD_WITH_JS) */ diff --git a/src/api/lua.c b/src/api/lua.c index c8444c553..eb60d8e98 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1526,7 +1526,24 @@ void callLuaTick(tic_mem* tic) if(lua_isfunction(lua, -1)) { if(docall(lua, 0, 0) != LUA_OK) + { core->data->error(core->data->data, lua_tostring(lua, -1)); + return; + } + + // call OVR() callback for backward compatibility + { + lua_getglobal(lua, OVR_FN); + if(lua_isfunction(lua, -1)) + { + OVR(tic) + { + if(docall(lua, 0, 0) != LUA_OK) + core->data->error(core->data->data, lua_tostring(lua, -1)); + } + } + else lua_pop(lua, 1); + } } else { @@ -1567,27 +1584,6 @@ void callLuaBorder(tic_mem* tic, s32 row, void* data) callLuaScanlineName(tic, row, data, BDR_FN); } -void callLuaOverline(tic_mem* tic, void* data) -{ - tic_core* core = (tic_core*)tic; - lua_State* lua = core->currentVM; - - if (lua) - { - const char* OvrFunc = OVR_FN; - - lua_getglobal(lua, OvrFunc); - if(lua_isfunction(lua, -1)) - { - tic_api_cls(tic, 0); - if(docall(lua, 0, 0) != LUA_OK) - core->data->error(core->data->data, lua_tostring(lua, -1)); - } - else lua_pop(lua, 1); - } - -} - static const char* const LuaKeywords [] = { "and", "break", "do", "else", "elseif", @@ -1685,7 +1681,6 @@ tic_script_config LuaSyntaxConfig = { .scanline = callLuaScanline, .border = callLuaBorder, - .overline = callLuaOverline, }, .getOutline = getLuaOutline, @@ -1703,11 +1698,4 @@ tic_script_config LuaSyntaxConfig = .keywordsCount = COUNT_OF(LuaKeywords), }; -const tic_script_config* get_lua_script_config() -{ - return &LuaSyntaxConfig; -} - - - #endif /* defined(TIC_BUILD_WITH_LUA) */ diff --git a/src/api/moonscript.c b/src/api/moonscript.c index 66204db60..6a116bcc2 100644 --- a/src/api/moonscript.c +++ b/src/api/moonscript.c @@ -158,7 +158,6 @@ tic_script_config MoonSyntaxConfig = { .scanline = callLuaScanline, .border = callLuaBorder, - .overline = callLuaOverline, }, .getOutline = getMoonOutline, @@ -176,11 +175,6 @@ tic_script_config MoonSyntaxConfig = .keywordsCount = COUNT_OF(MoonKeywords), }; -const tic_script_config* get_moon_script_config() -{ - return &MoonSyntaxConfig; -} - #endif /* defined(TIC_BUILD_WITH_MOON) */ #endif /* defined(TIC_BUILD_WITH_LUA) */ \ No newline at end of file diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 80e5eeb89..41d24b987 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1598,6 +1598,22 @@ static bool initSquirrel(tic_mem* tic, const char* code) return true; } +static void errorReport(tic_mem* tic) +{ + tic_core* core = (tic_core*)tic; + + HSQUIRRELVM vm = core->currentVM; + + sq_getlasterror(vm); + sq_tostring(vm, -1); + const SQChar* errorString = "unknown error"; + sq_getstring(vm, -1, &errorString); + + if (core->data) + core->data->error(core->data->data, errorString); + sq_pop(vm, 3); // remove string, error and root table. +} + static void callSquirrelTick(tic_mem* tic) { tic_core* core = (tic_core*)tic; @@ -1614,14 +1630,28 @@ static void callSquirrelTick(tic_mem* tic) sq_pushroottable(vm); if(SQ_FAILED(sq_call(vm, 1, SQFalse, SQTrue))) { - sq_getlasterror(vm); - sq_tostring(vm, -1); - const SQChar* errorString = "unknown error"; - sq_getstring(vm, -1, &errorString); + errorReport(tic); + return; + } - if (core->data) - core->data->error(core->data->data, errorString); - sq_pop(vm, 3); // remove string, error and root table. + // call OVR() callback for backward compatibility + { + sq_pushroottable(vm); + sq_pushstring(vm, OVR_FN, -1); + + if(SQ_SUCCEEDED(sq_get(vm, -2))) + { + OVR(tic) + { + sq_pushroottable(vm); + + if(SQ_FAILED(sq_call(vm, 1, SQFalse, SQTrue))) + { + errorReport(tic); + } + } + } + else sq_poptop(vm); } } else @@ -1676,38 +1706,6 @@ static void callSquirrelBorder(tic_mem* tic, s32 row, void* data) callSquirrelScanlineName(tic, row, data, BDR_FN); } -static void callSquirrelOverline(tic_mem* tic, void* data) -{ - tic_core* core = (tic_core*)tic; - HSQUIRRELVM vm = core->currentVM; - - if (vm) - { - const char* OvrFunc = OVR_FN; - - sq_pushroottable(vm); - sq_pushstring(vm, OvrFunc, -1); - - if(SQ_SUCCEEDED(sq_get(vm, -2))) - { - tic_api_cls(tic, 0); - sq_pushroottable(vm); - if(SQ_FAILED(sq_call(vm, 1, SQFalse, SQTrue))) - { - sq_getlasterror(vm); - sq_tostring(vm, -1); - const SQChar* errorString = "unknown error"; - sq_getstring(vm, -1, &errorString); - if (core->data) - core->data->error(core->data->data, errorString); - sq_pop(vm, 3); - } - } - else sq_poptop(vm); - } - -} - static const char* const SquirrelKeywords [] = { "base", "break", "case", "catch", "class", "clone", @@ -1821,7 +1819,6 @@ tic_script_config SquirrelSyntaxConfig = { .scanline = callSquirrelScanline, .border = callSquirrelBorder, - .overline = callSquirrelOverline, }, .getOutline = getSquirrelOutline, @@ -1839,9 +1836,4 @@ tic_script_config SquirrelSyntaxConfig = .keywordsCount = COUNT_OF(SquirrelKeywords), }; -const tic_script_config* get_squirrel_script_config() -{ - return &SquirrelSyntaxConfig; -} - #endif /* defined(TIC_BUILD_WITH_SQUIRREL) */ diff --git a/src/api/wren.c b/src/api/wren.c index fcaa21a7b..69e67f5c0 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -32,12 +32,12 @@ #include "tools.h" #include "wren.h" -static WrenHandle* game_class; -static WrenHandle* new_handle; -static WrenHandle* update_handle; -static WrenHandle* scanline_handle; -static WrenHandle* border_handle; -static WrenHandle* overline_handle; +static WrenHandle* game_class = NULL; +static WrenHandle* new_handle = NULL; +static WrenHandle* update_handle = NULL; +static WrenHandle* scanline_handle = NULL; +static WrenHandle* border_handle = NULL; +static WrenHandle* overline_handle = NULL; static bool loaded = false; @@ -1586,19 +1586,17 @@ static void callWrenBorder(tic_mem* tic, s32 row, void* data) wrenSetSlotHandle(vm, 0, game_class); wrenSetSlotDouble(vm, 1, row); wrenCall(vm, border_handle); - } -} - -static void callWrenOverline(tic_mem* tic, void* data) -{ - tic_core* core = (tic_core*)tic; - WrenVM* vm = core->currentVM; - if (vm && game_class) - { - wrenEnsureSlots(vm, 1); - wrenSetSlotHandle(vm, 0, game_class); - wrenCall(vm, overline_handle); + // call OVR() callback for backward compatibility + if(overline_handle) + { + OVR(tic) + { + wrenEnsureSlots(vm, 1); + wrenSetSlotHandle(vm, 0, game_class); + wrenCall(vm, overline_handle); + } + } } } @@ -1689,7 +1687,6 @@ tic_script_config WrenSyntaxConfig = { .scanline = callWrenScanline, .border = callWrenBorder, - .overline = callWrenOverline, }, .getOutline = getWrenOutline, @@ -1707,9 +1704,4 @@ tic_script_config WrenSyntaxConfig = .keywordsCount = COUNT_OF(WrenKeywords), }; -const tic_script_config* get_wren_script_config() -{ - return &WrenSyntaxConfig; -} - #endif /* defined(TIC_BUILD_WITH_WREN) */ diff --git a/src/cart.c b/src/cart.c index fb9719497..239bd2111 100644 --- a/src/cart.c +++ b/src/cart.c @@ -105,10 +105,10 @@ void tic_cart_load(tic_cartridge* cart, const u8* buffer, s32 size) #if defined(DEPRECATED_CHUNKS) // workaround to support ancient carts without palette // load DB16 palette if it not exists - if (EMPTY(cart->bank0.palette.scn.data)) + if (EMPTY(cart->bank0.palette.vbank0.data)) { static const u8 DB16[] = { 0x14, 0x0c, 0x1c, 0x44, 0x24, 0x34, 0x30, 0x34, 0x6d, 0x4e, 0x4a, 0x4e, 0x85, 0x4c, 0x30, 0x34, 0x65, 0x24, 0xd0, 0x46, 0x48, 0x75, 0x71, 0x61, 0x59, 0x7d, 0xce, 0xd2, 0x7d, 0x2c, 0x85, 0x95, 0xa1, 0x6d, 0xaa, 0x2c, 0xd2, 0xaa, 0x99, 0x6d, 0xc2, 0xca, 0xda, 0xd4, 0x5e, 0xde, 0xee, 0xd6 }; - memcpy(cart->bank0.palette.scn.data, DB16, sizeof DB16); + memcpy(cart->bank0.palette.vbank0.data, DB16, sizeof DB16); } #endif } @@ -150,7 +150,7 @@ void tic_cart_load(tic_cartridge* cart, const u8* buffer, s32 size) if(image->width == TIC80_WIDTH && image->height == TIC80_HEIGHT) for (s32 i = 0; i < TIC80_WIDTH * TIC80_HEIGHT; i++) tic_tool_poke4(cart->bank0.screen.data, i, - tic_nearest_color(cart->bank0.palette.scn.colors, (const tic_rgb*)&image->palette[image->buffer[i]], TIC_PALETTE_SIZE)); + tic_nearest_color(cart->bank0.palette.vbank0.colors, (const tic_rgb*)&image->palette[image->buffer[i]], TIC_PALETTE_SIZE)); gif_close(image); } diff --git a/src/core/core.c b/src/core/core.c index 62b803357..29a0e5401 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -298,7 +298,7 @@ static void resetVbank(tic_mem* memory) static const u8 DefaultMapping[] = { 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe }; memcpy(memory->ram.vram.mapping, DefaultMapping, sizeof DefaultMapping); - memory->ram.vram.palette = memory->cart.bank0.palette.scn; + memory->ram.vram.palette = memory->cart.bank0.palette.vbank0; } void tic_api_reset(tic_mem* memory) @@ -307,17 +307,17 @@ void tic_api_reset(tic_mem* memory) resetVbank(memory); - OVR(memory) + VBANK(memory, 1) { resetVbank(memory); - // clear OVR memmask + // clear BANK1 memmask ZEROMEM(core->state.vbank.memmask); - // init OVR palette with SCN if it's empty + // init VBANK1 palette with VBANK0 palette if it's empty // for backward compatibility - if(!EMPTY(memory->cart.bank0.palette.ovr.data)) - memcpy(&memory->ram.vram.palette, &memory->cart.bank0.palette.ovr, sizeof(tic_palette)); + if(!EMPTY(memory->cart.bank0.palette.vbank1.data)) + memcpy(&memory->ram.vram.palette, &memory->cart.bank0.palette.vbank1, sizeof(tic_palette)); } memory->ram.input.mouse.relative = 0; @@ -398,24 +398,20 @@ static bool tic_init_vm(tic_core* core, const char* code, const tic_script_confi return done; } -s32 tic_api_vbank(tic_mem* tic, s32 ovr) +s32 tic_api_vbank(tic_mem* tic, s32 bank) { tic_core* core = (tic_core*)tic; s32 prev = core->state.vbank.id; - switch(ovr) + switch(bank) { case 0: case 1: - if(core->state.vbank.id != ovr) + if(core->state.vbank.id != bank) { SWAP(tic->ram.vram, core->state.vbank.mem, tic_vram); - core->state.vbank.id = ovr; - - // border color and mouse cursor is the same in both modes - tic->ram.vram.vars.border = core->state.vbank.mem.vars.border; - tic->ram.vram.vars.cursor = core->state.vbank.mem.vars.cursor; + core->state.vbank.id = bank; } } @@ -470,12 +466,6 @@ void tic_core_tick(tic_mem* tic, tic_tick_data* data) tic_api_vbank(tic, 0); core->state.tick(tic); - - OVR(tic) - { - // call OVR(tic) callback for backward compatibility - core->state.callback.overline(tic, core->state.callback.data); - } } void tic_core_pause(tic_mem* memory) @@ -573,18 +563,18 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) { tic_core* core = (tic_core*)tic; tic80_pixel_color_format fmt = tic->screen_format; - const tic_vram* vram = &tic->ram.vram; - const tic_vram* ovr = &core->state.vbank.mem; + const tic_vram* vbank0 = &tic->ram.vram; + const tic_vram* vbank1 = &core->state.vbank.mem; tic_api_vbank(tic, 0); -#define UPDBRD() \ - if(clb.border) \ - { \ - clb.border(tic, row, clb.data); \ - tic_api_vbank(tic, 0); \ - pal = tic_tool_palette_blit(&vram->palette, fmt); \ - ovrpal = tic_tool_palette_blit(&ovr->palette, fmt); \ +#define UPDBRD() \ + if(clb.border) \ + { \ + clb.border(tic, row, clb.data); \ + tic_api_vbank(tic, 0); \ + pal0 = tic_tool_palette_blit(&vbank0->palette, fmt); \ + pal1 = tic_tool_palette_blit(&vbank1->palette, fmt); \ } if (clb.scanline) @@ -593,8 +583,8 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) tic_api_vbank(tic, 0); } - tic_blitpal pal = tic_tool_palette_blit(&vram->palette, fmt); - tic_blitpal ovrpal = tic_tool_palette_blit(&ovr->palette, fmt); + tic_blitpal pal0 = tic_tool_palette_blit(&vbank0->palette, fmt); + tic_blitpal pal1 = tic_tool_palette_blit(&vbank1->palette, fmt); s32 row = 0; u32* rowPtr = tic->screen; @@ -602,30 +592,30 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) for(; row != TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) { UPDBRD(); - memset4(rowPtr, pal.data[vram->vars.border], TIC80_FULLWIDTH); + memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_FULLWIDTH); } for (; row < TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row) { UPDBRD(); - memset4(rowPtr, pal.data[vram->vars.border], TIC80_MARGIN_LEFT); + memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_MARGIN_LEFT); rowPtr += TIC80_MARGIN_LEFT; enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; - s32 start = (row - vram->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; - s32 ovrstart = (row - ovr->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 start0 = (row - vbank0->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 start1 = (row - vbank1->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) { - s32 ovrpix = (x - ovr->vars.offset.x) % TIC80_WIDTH + ovrstart; + s32 offset = (x - vbank1->vars.offset.x) % TIC80_WIDTH + start1; - *rowPtr++ = core->state.vbank.memmask[ovrpix] - ? ovrpal.data[tic_tool_peek4(ovr->screen.data, ovrpix)] - : pal.data[tic_tool_peek4(vram->screen.data, (x - vram->vars.offset.x) % TIC80_WIDTH + start)]; + *rowPtr++ = core->state.vbank.memmask[offset] + ? pal1.data[tic_tool_peek4(vbank1->screen.data, offset)] + : pal0.data[tic_tool_peek4(vbank0->screen.data, (x - vbank0->vars.offset.x) % TIC80_WIDTH + start0)]; } - memset4(rowPtr, pal.data[vram->vars.border], TIC80_MARGIN_RIGHT); + memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_MARGIN_RIGHT); rowPtr += TIC80_MARGIN_RIGHT; @@ -633,15 +623,15 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) { clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), clb.data); tic_api_vbank(tic, 0); - pal = tic_tool_palette_blit(&vram->palette, fmt); - ovrpal = tic_tool_palette_blit(&ovr->palette, fmt); + pal0 = tic_tool_palette_blit(&vbank0->palette, fmt); + pal1 = tic_tool_palette_blit(&vbank1->palette, fmt); } } for(; row != TIC80_FULLHEIGHT; ++row, rowPtr += TIC80_FULLWIDTH) { UPDBRD(); - memset4(rowPtr, pal.data[vram->vars.border], TIC80_FULLWIDTH); + memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_FULLWIDTH); } #undef UPDBRD @@ -663,17 +653,9 @@ static inline void border(tic_mem* memory, s32 row, void* data) core->state.callback.border(memory, row, data); } -static inline void overline(tic_mem* memory, void* data) -{ - tic_core* core = (tic_core*)memory; - - if (core->state.initialized) - core->state.callback.overline(memory, data); -} - void tic_core_blit(tic_mem* tic) { - tic_core_blit_ex(tic, (tic_blit_callback){scanline, overline, border, NULL}); + tic_core_blit_ex(tic, (tic_blit_callback){scanline, /*overline,*/ border, NULL}); } tic_mem* tic_core_create(s32 samplerate) diff --git a/src/core/core.h b/src/core/core.h index 51e9e25a7..6601b95f3 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -196,3 +196,15 @@ typedef struct void tic_core_tick_io(tic_mem* memory); void tic_core_sound_tick_start(tic_mem* memory); void tic_core_sound_tick_end(tic_mem* memory); + +// border color and mouse cursor is the same in both modes +// for backward compatibility +#define OVR_COMPAT(TIC, BANK) \ + tic_api_vbank(TIC, BANK), \ + TIC->ram.vram.vars.border = ((tic_core*)TIC)->state.vbank.mem.vars.border, \ + TIC->ram.vram.vars.cursor = ((tic_core*)TIC)->state.vbank.mem.vars.cursor + +#define OVR(TIC) \ + OVR_COMPAT(TIC, 1); \ + tic_api_cls(TIC, 0); \ + SCOPE(OVR_COMPAT(TIC, 0)) diff --git a/src/core/draw.c b/src/core/draw.c index 44a0215f3..2d500ef30 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -381,7 +381,7 @@ void tic_api_cls(tic_mem* memory, u8 color) { memset(&vram->screen, (color & 0xf) | (color << TIC_PALETTE_BPP), sizeof(tic_screen)); - // clear OVR memmask + // clear BANK1 memmask if(core->state.vbank.id) ZEROMEM(core->state.vbank.memmask); } @@ -391,7 +391,7 @@ void tic_api_cls(tic_mem* memory, u8 color) tic_api_rect(memory, rect.x, rect.y, rect.w, rect.h, color); - // clear OVR memmask + // clear BANK1 memmask if(core->state.vbank.id) { for(u8 *ptr = core->state.vbank.memmask + rect.x + rect.y * TIC80_WIDTH, diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index 0e33931bc..6472bc3f4 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -380,7 +380,7 @@ static void drawMapToolbar(Map* map, s32 x, s32 y) } } -static void drawSheetOvr(Map* map, s32 x, s32 y) +static void drawSheetVBank1(Map* map, s32 x, s32 y) { if(!sheetVisible(map))return; @@ -562,7 +562,7 @@ static void drawTileCursor(Map* map) } } -static void drawTileCursorOvr(Map* map) +static void drawTileCursorVBank1(Map* map) { if(map->scroll.active) return; @@ -734,7 +734,7 @@ static void drawPasteData(Map* map) } } -static void drawPasteDataOvr(Map* map) +static void drawPasteDataVBank1(Map* map) { tic_mem* tic = map->tic; s32 w = map->paste[0]; @@ -995,7 +995,7 @@ static void processMouseFillMode(Map* map) } } -static void drawSelectionOvr(Map* map) +static void drawSelectionVBank1(Map* map) { tic_rect* sel = &map->select.rect; @@ -1247,9 +1247,9 @@ static void tick(Map* map) drawMapReg(map); drawSheetReg(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE); - OVR(tic) + VBANK(tic, 1) { - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); tic_api_clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (sheetVisible(map) ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE); { @@ -1261,7 +1261,7 @@ static void tick(Map* map) } tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); - drawSheetOvr(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE); + drawSheetVBank1(map, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, TOOLBAR_SIZE); { tic_rect rect = {MAP_X, MAP_Y, MAP_WIDTH, MAP_HEIGHT}; @@ -1271,11 +1271,11 @@ static void tick(Map* map) { case MAP_DRAW_MODE: case MAP_FILL_MODE: - drawTileCursorOvr(map); + drawTileCursorVBank1(map); break; case MAP_SELECT_MODE: if(map->paste) - drawPasteDataOvr(map); + drawPasteDataVBank1(map); break; default: break; @@ -1284,7 +1284,7 @@ static void tick(Map* map) } if(!sheetVisible(map)) - drawSelectionOvr(map); + drawSelectionVBank1(map); drawMapToolbar(map, TIC80_WIDTH, 1); drawToolbar(map->tic, false); diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index 664b4d0fa..67b4dd78c 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -414,7 +414,7 @@ static void drawBrushSlider(Sprite* sprite, s32 x, s32 y) tic_api_rect(tic, x+1, offset+1, Size-2, Size-2, (over ? tic_color_white : tic_color_grey)); } -static void drawCanvasOvr(Sprite* sprite, s32 x, s32 y) +static void drawCanvasVBank1(Sprite* sprite, s32 x, s32 y) { tic_mem* tic = sprite->tic; @@ -900,7 +900,7 @@ static void drawRGBSlider(Sprite* sprite, s32 x, s32 y, u8* value) static void pasteColor(Sprite* sprite) { - bool ovr = sprite->palette.ovr; + bool ovr = sprite->palette.vbank1; if(!fromClipboard(&getBankPalette(ovr)->colors[sprite->color], sizeof(tic_rgb), false, true)) fromClipboard(getBankPalette(ovr)->data, sizeof(tic_palette), false, true); } @@ -926,7 +926,7 @@ static void drawRGBTools(Sprite* sprite, s32 x, s32 y) down = true; if(checkMouseClick(&rect, tic_mouse_left)) - toClipboard(getBankPalette(sprite->palette.ovr)->data, sizeof(tic_palette), false); + toClipboard(getBankPalette(sprite->palette.vbank1)->data, sizeof(tic_palette), false); } if(down) @@ -987,7 +987,7 @@ static void drawRGBSliders(Sprite* sprite, s32 x, s32 y) Height = TIC_FONT_HEIGHT + 1 }; - u8* data = &getBankPalette(sprite->palette.ovr)->data[sprite->color * Rows]; + u8* data = &getBankPalette(sprite->palette.vbank1)->data[sprite->color * Rows]; { tic_rect rect = {x - 20, y - 3, TIC_FONT_WIDTH * Cols + 1, TIC_FONT_HEIGHT * Rows + 1}; @@ -1056,7 +1056,7 @@ static tic_palette_dimensions getPaletteDimensions(Sprite* sprite) return (tic_palette_dimensions){cell_w, cell_h, cols, rows, cols*rows}; } -static void drawPaletteOvr(Sprite* sprite, s32 x, s32 y) +static void drawPaletteVBank1(Sprite* sprite, s32 x, s32 y) { tic_mem* tic = sprite->tic; tic_rect rect = {x, y, PALETTE_WIDTH-1, PALETTE_HEIGHT-1}; @@ -1120,7 +1120,7 @@ static void drawPaletteOvr(Sprite* sprite, s32 x, s32 y) if(sprite->advanced) { - tic_rect rect = {x - 15, y + 1, 11, 5}; + tic_rect rect = {x - 22, y + 1, 19, 5}; bool down = false; bool over = false; @@ -1129,27 +1129,27 @@ static void drawPaletteOvr(Sprite* sprite, s32 x, s32 y) setCursor(tic_cursor_hand); over = true; - showTooltip("SCANLINE PALETTE"); + showTooltip("VBANK0 PALETTE"); if(checkMouseDown(&rect, tic_mouse_left)) down = true; if(checkMouseClick(&rect, tic_mouse_left)) - sprite->palette.ovr = false; + sprite->palette.vbank1 = false; } { - static const char* Label = "SCN"; - if(!sprite->palette.ovr) + static const char* Label = "bank0"; + if(!sprite->palette.vbank1) tic_api_print(tic, Label, rect.x, rect.y + 1, tic_color_black, false, 1, true); - tic_api_print(tic, Label, rect.x, rect.y, sprite->palette.ovr ? tic_color_dark_grey : tic_color_white, false, 1, true); + tic_api_print(tic, Label, rect.x, rect.y, sprite->palette.vbank1 ? tic_color_dark_grey : tic_color_white, false, 1, true); } } if(sprite->advanced) { - tic_rect rect = {x - 15, y + 9, 11, 5}; + tic_rect rect = {x - 22, y + 9, 19, 5}; bool down = false; bool over = false; @@ -1158,21 +1158,21 @@ static void drawPaletteOvr(Sprite* sprite, s32 x, s32 y) setCursor(tic_cursor_hand); over = true; - showTooltip("OVERLINE PALETTE"); + showTooltip("VBANK1 PALETTE"); if(checkMouseDown(&rect, tic_mouse_left)) down = true; if(checkMouseClick(&rect, tic_mouse_left)) - sprite->palette.ovr = true; + sprite->palette.vbank1 = true; } { - static const char* Label = "OVR"; - if(sprite->palette.ovr) + static const char* Label = "bank1"; + if(sprite->palette.vbank1) tic_api_print(tic, Label, rect.x, rect.y + 1, tic_color_black, false, 1, true); - tic_api_print(tic, Label, rect.x, rect.y, sprite->palette.ovr ? tic_color_white : tic_color_dark_grey, false, 1, true); + tic_api_print(tic, Label, rect.x, rect.y, sprite->palette.vbank1 ? tic_color_white : tic_color_dark_grey, false, 1, true); } } @@ -1246,7 +1246,7 @@ static void updateSpriteSize(Sprite* sprite, s32 size) } } -static void drawSheetOvr(Sprite* sprite, s32 x, s32 y) +static void drawSheetVBank1(Sprite* sprite, s32 x, s32 y) { tic_mem* tic = sprite->tic; @@ -1661,7 +1661,7 @@ static void processKeyboard(Sprite* sprite) if(isxdigit(sym)) { - u8* data = &getBankPalette(sprite->palette.ovr)->data[sprite->color * Rows + row]; + u8* data = &getBankPalette(sprite->palette.vbank1)->data[sprite->color * Rows + row]; char buf[sizeof "FF"]; sprintf(buf, "%02X", *data); buf[col] = toupper(sym); @@ -1820,7 +1820,7 @@ static void scanline(tic_mem* tic, s32 row, void* data) Sprite* sprite = (Sprite*)data; if(row == 0) - memcpy(&tic->ram.vram.palette, getBankPalette(sprite->palette.ovr), sizeof(tic_palette)); + memcpy(&tic->ram.vram.palette, getBankPalette(sprite->palette.vbank1), sizeof(tic_palette)); } static void drawAdvancedButton(Sprite* sprite, s32 x, s32 y) @@ -1881,7 +1881,7 @@ static void tick(Sprite* sprite) drawPalette(sprite, PaletteX, PaletteY); drawSheet(sprite, SheetX, SheetY); - OVR(tic) + VBANK(tic, 1) { static const tic_rect bg[] = { @@ -1897,12 +1897,12 @@ static void tick(Sprite* sprite) {0, PaletteY + PaletteH, SheetX, TIC80_HEIGHT - PaletteY - PaletteH}, }; - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); for(const tic_rect* r = bg; r < bg + COUNT_OF(bg); r++) tic_api_rect(tic, r->x, r->y, r->w, r->h, tic_color_grey); - drawCanvasOvr(sprite, 24, 20); + drawCanvasVBank1(sprite, 24, 20); drawMoveButtons(sprite); if(sprite->advanced) @@ -1919,8 +1919,8 @@ static void tick(Sprite* sprite) ? drawRGBSliders(sprite, 24, 91) : drawTools(sprite, 12, 96); - drawPaletteOvr(sprite, 24, 112); - drawSheetOvr(sprite, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, 7); + drawPaletteVBank1(sprite, 24, 112); + drawSheetVBank1(sprite, TIC80_WIDTH - TIC_SPRITESHEET_SIZE - 1, 7); drawAdvancedButton(sprite, 4, 11); drawSpriteToolbar(sprite); diff --git a/src/studio/editors/sprite.h b/src/studio/editors/sprite.h index b84679534..94626f74a 100644 --- a/src/studio/editors/sprite.h +++ b/src/studio/editors/sprite.h @@ -49,7 +49,7 @@ struct Sprite struct { bool edit; - bool ovr; + bool vbank1; s32 focus; } palette; diff --git a/src/studio/editors/world.c b/src/studio/editors/world.c index d6e805756..14a98d091 100644 --- a/src/studio/editors/world.c +++ b/src/studio/editors/world.c @@ -85,9 +85,9 @@ static void tick(World* world) memcpy(&tic->ram.vram, world->preview, PREVIEW_SIZE); - OVR(tic) + VBANK(tic, 1) { - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); drawGrid(world); } } diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index a45d453ed..b24c418c6 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -96,7 +96,7 @@ macro(y) \ macro(w) \ macro(h) \ - macro(ovr) + macro(vbank) #define EXPORT_CMD_LIST(macro) \ macro(win) \ @@ -122,7 +122,7 @@ #define EXPORT_KEYS_LIST(macro) \ macro(bank) \ - macro(ovr) \ + macro(vbank) \ macro(id) \ ALONE_KEY(macro) @@ -1539,11 +1539,11 @@ static inline tic_bank* getBank(Console* console, s32 bank) return &console->tic->cart.banks[bank]; } -static inline const tic_palette* getPalette(Console* console, s32 bank, s32 ovr) +static inline const tic_palette* getPalette(Console* console, s32 bank, s32 vbank) { - return ovr - ? &getBank(console, bank)->palette.ovr - : &getBank(console, bank)->palette.scn; + return vbank + ? &getBank(console, bank)->palette.vbank1 + : &getBank(console, bank)->palette.vbank0; } static void onImportTilesBase(Console* console, const char* name, const void* buffer, s32 size, tic_tile* base, ImportParams params) @@ -1555,7 +1555,7 @@ static void onImportTilesBase(Console* console, const char* name, const void* bu if(img.data) SCOPE(free(img.data)) { - const tic_palette* pal = getPalette(console, params.bank, params.ovr); + const tic_palette* pal = getPalette(console, params.bank, params.vbank); for(s32 j = 0, y = params.y, h = y + (params.h ? params.h : img.height); y < h; ++y, ++j) for(s32 i = 0, x = params.x, w = x + (params.w ? params.w : img.width); x < w; ++x, ++i) @@ -1626,7 +1626,7 @@ static void onImport_screen(Console* console, const char* name, const void* buff if(img.width == TIC80_WIDTH && img.height == TIC80_HEIGHT) { tic_bank* bank = getBank(console, params.bank); - const tic_palette* pal = getPalette(console, params.bank, params.ovr); + const tic_palette* pal = getPalette(console, params.bank, params.vbank); s32 i = 0; for(const png_rgba *pix = img.pixels, *end = pix + (TIC80_WIDTH * TIC80_HEIGHT); pix < end; pix++) @@ -1733,7 +1733,7 @@ static void exportSprites(Console* console, const char* filename, tic_tile* base SCOPE(free(img.data)) { - const tic_palette* pal = getPalette(console, params.bank, params.ovr); + const tic_palette* pal = getPalette(console, params.bank, params.vbank); for(s32 i = 0; i < TIC_SPRITESHEET_SIZE * TIC_SPRITESHEET_SIZE; i++) img.values[i] = tic_rgba(&pal->colors[getSpritePixel(base, i % TIC_SPRITESHEET_SIZE, i / TIC_SPRITESHEET_SIZE)]); @@ -2074,7 +2074,7 @@ static void onExport_screen(Console* console, const char* param, const char* nam SCOPE(free(img.data)) { - const tic_palette* pal = getPalette(console, params.bank, params.ovr); + const tic_palette* pal = getPalette(console, params.bank, params.vbank); tic_bank* bank = getBank(console, params.bank); for(s32 i = 0; i < TIC80_WIDTH * TIC80_HEIGHT; i++) @@ -2185,7 +2185,7 @@ static CartSaveResult saveCartName(Console* console, const char* name) enum{PaddingLeft = 8, PaddingTop = 8}; const tic_bank* bank = &tic->cart.bank0; - const tic_rgb* pal = bank->palette.scn.colors; + const tic_rgb* pal = bank->palette.vbank0.colors; const u8* screen = bank->screen.data; u32* ptr = img.values + PaddingTop * CoverWidth + PaddingLeft; @@ -2215,7 +2215,7 @@ static CartSaveResult saveCartName(Console* console, const char* name) u32* ptr = img.values + PaddingTop * CoverWidth + PaddingLeft; const u8* screen = tic->ram.vram.screen.data; - const tic_rgb* pal = getConfig()->cart->bank0.palette.scn.colors; + const tic_rgb* pal = getConfig()->cart->bank0.palette.vbank0.colors; for(s32 y = 0; y < Height; y++) for(s32 x = 0; x < Width; x++) diff --git a/src/studio/screens/dialog.c b/src/studio/screens/dialog.c index 38113c3a5..07e3c354a 100644 --- a/src/studio/screens/dialog.c +++ b/src/studio/screens/dialog.c @@ -192,9 +192,9 @@ static void tick(Dialog* dlg) tic_mem* tic = dlg->tic; drawBGAnimation(tic, dlg->ticks); - OVR(tic) + VBANK(tic, 1) { - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); drawDialog(dlg); } } diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index acbafcf41..bbd069180 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -498,9 +498,9 @@ static void tick(Menu* menu) else drawBGAnimation(tic, menu->ticks); - OVR(tic) + VBANK(tic, 1) { - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); switch(menu->mode) { @@ -521,7 +521,7 @@ static void scanline(tic_mem* tic, s32 row, void* data) if(menu->cover) { if(row == 0) - memcpy(&tic->ram.vram.palette, tic->cart.bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(&tic->ram.vram.palette, tic->cart.bank0.palette.vbank0.data, sizeof(tic_palette)); } else drawBGAnimationScanline(tic, row); diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 78c54f14f..13feb7df0 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -537,9 +537,9 @@ static void loadCover(Surf* surf) else tic_cart_load(cart, data, size); - if(!EMPTY(cart->bank0.screen.data) && !EMPTY(cart->bank0.palette.scn.data)) + if(!EMPTY(cart->bank0.screen.data) && !EMPTY(cart->bank0.palette.vbank0.data)) { - memcpy((item->palette = malloc(sizeof(tic_palette))), &cart->bank0.palette.scn, sizeof(tic_palette)); + memcpy((item->palette = malloc(sizeof(tic_palette))), &cart->bank0.palette.vbank0, sizeof(tic_palette)); memcpy((item->cover = malloc(sizeof(tic_screen))), &cart->bank0.screen, sizeof(tic_screen)); } @@ -877,9 +877,9 @@ static void tick(Surf* surf) memcpy(tic->ram.vram.screen.data, cover->data, sizeof(tic_screen)); } - OVR(tic) + VBANK(tic, 1) { - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); if(surf->menu.count > 0) { diff --git a/src/studio/studio.c b/src/studio/studio.c index 0d379ec5a..dc45b3574 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -515,10 +515,10 @@ tic_map* getBankMap() return &impl.studio.tic->cart.banks[impl.bank.index.map].map; } -tic_palette* getBankPalette(bool ovr) +tic_palette* getBankPalette(bool vbank) { tic_bank* bank = &impl.studio.tic->cart.banks[impl.bank.index.sprites]; - return ovr ? &bank->palette.ovr : &bank->palette.scn; + return vbank ? &bank->palette.vbank1 : &bank->palette.vbank0; } tic_flags* getBankFlags() @@ -850,7 +850,7 @@ static void drawPopup() for(s32 i = 0, y = 0; y < (Height + anim); y++, dst += TIC80_MARGIN_RIGHT + TIC80_MARGIN_LEFT) for(s32 x = 0; x < Width; x++) - *dst++ = tic_rgba(&bank->palette.scn.colors[tic_tool_peek4(tic->ram.vram.screen.data, i++)]); + *dst++ = tic_rgba(&bank->palette.vbank0.colors[tic_tool_peek4(tic->ram.vram.screen.data, i++)]); } } } @@ -1720,7 +1720,7 @@ static void drawBitIconRaw(u32* frame, s32 sx, s32 sy, s32 id, tic_color color) for(s32 src = 0; src != TIC_SPRITESIZE * TIC_SPRITESIZE; dst += TIC80_FULLWIDTH - TIC_SPRITESIZE) for(s32 i = 0; i != TIC_SPRITESIZE; ++i, ++dst) if(tic_tool_peek4(&bank->tiles.data[id].data, src++)) - *dst = tic_rgba(&bank->palette.scn.colors[color]); + *dst = tic_rgba(&bank->palette.vbank0.colors[color]); } static void drawRecordLabel(u32* frame, s32 sx, s32 sy) @@ -1804,7 +1804,7 @@ static void renderStudio() // clear screen for all the modes except the Run mode if(impl.mode != TIC_RUN_MODE) { - OVR(tic) + VBANK(tic, 1) { tic_api_cls(tic, 0); } @@ -1982,7 +1982,7 @@ static void blitCursor() }[tic->ram.vram.vars.cursor.sprite]; } - const tic_palette* pal = &bank->palette.scn; + const tic_palette* pal = &bank->palette.vbank0; const tic_tile* tile = &bank->sprites.data[tic->ram.vram.vars.cursor.sprite]; tic_point s = {m->x - hot.x, m->y - hot.y}; @@ -2021,20 +2021,20 @@ static void studioTick() tic_blit_callback callback[TIC_MODES_COUNT] = { - [TIC_MENU_MODE] = {impl.menu->scanline, NULL, NULL, impl.menu}, + [TIC_MENU_MODE] = {impl.menu->scanline, NULL, impl.menu}, #if defined(BUILD_EDITORS) - [TIC_SPRITE_MODE] = {sprite->scanline, NULL, NULL, sprite}, - [TIC_MAP_MODE] = {map->scanline, NULL, NULL, map}, - [TIC_WORLD_MODE] = {impl.world->scanline, NULL, NULL, impl.world}, - [TIC_DIALOG_MODE] = {impl.dialog->scanline, NULL, NULL, impl.dialog}, - [TIC_SURF_MODE] = {impl.surf->scanline, NULL, NULL, impl.surf}, + [TIC_SPRITE_MODE] = {sprite->scanline, NULL, sprite}, + [TIC_MAP_MODE] = {map->scanline, NULL, map}, + [TIC_WORLD_MODE] = {impl.world->scanline, NULL, impl.world}, + [TIC_DIALOG_MODE] = {impl.dialog->scanline, NULL, impl.dialog}, + [TIC_SURF_MODE] = {impl.surf->scanline, NULL, impl.surf}, #endif }; if(impl.mode != TIC_RUN_MODE) { - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); tic->ram.font = impl.systemFont; } diff --git a/src/studio/studio.h b/src/studio/studio.h index 8d4416e1e..8f4bd23cc 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -248,7 +248,7 @@ void drawBGAnimation(tic_mem* tic, s32 ticks); void drawBGAnimationScanline(tic_mem* tic, s32 row); tic_tiles* getBankTiles(); -tic_palette* getBankPalette(bool ovr); +tic_palette* getBankPalette(bool bank); tic_flags* getBankFlags(); tic_map* getBankMap(); diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 4cab50ad8..dbb14d6e0 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -296,7 +296,7 @@ static void setWindowIcon() u32* pixels = SDL_malloc(Size * Size * sizeof(u32)); SCOPE(SDL_free(pixels)) { - tic_blitpal pal = tic_tool_palette_blit(&platform.studio->config()->cart->bank0.palette.scn, platform.studio->tic->screen_format); + tic_blitpal pal = tic_tool_palette_blit(&platform.studio->config()->cart->bank0.palette.vbank0, platform.studio->tic->screen_format); for(s32 j = 0, index = 0; j < Size; j++) for(s32 i = 0; i < Size; i++, index++) @@ -396,7 +396,7 @@ static void initTouchKeyboard() { tic_mem* tic = platform.studio->tic; - memcpy(tic->ram.vram.palette.data, platform.studio->config()->cart->bank0.palette.scn.data, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, platform.studio->config()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); tic_api_cls(tic, 0); map2ram(); @@ -447,7 +447,7 @@ static void initTouchGamepad() const tic_bank* bank = &platform.studio->config()->cart->bank0; { - memcpy(tic->ram.vram.palette.data, &bank->palette.scn, sizeof(tic_palette)); + memcpy(tic->ram.vram.palette.data, &bank->palette.vbank0, sizeof(tic_palette)); memcpy(tic->ram.tiles.data, &bank->tiles, sizeof(tic_tiles)); tic_api_spr(tic, 0, 0, 0, TIC_SPRITESHEET_COLS, TIC_SPRITESHEET_COLS, NULL, 0, 1, tic_no_flip, tic_no_rotate); } @@ -457,7 +457,7 @@ static void initTouchGamepad() tic_core_blit(tic); for(u32* pix = tic->screen, *end = pix + TIC80_FULLWIDTH * TIC80_FULLHEIGHT; pix != end; ++pix) - if(*pix == tic_rgba(&bank->palette.scn.colors[0])) + if(*pix == tic_rgba(&bank->palette.vbank0.colors[0])) *pix = 0; memcpy(platform.gamepad.touch.pixels, tic->screen, TIC80_FULLWIDTH * TIC80_FULLHEIGHT * sizeof(u32)); diff --git a/src/tic.h b/src/tic.h index ab9bf5ea6..9feb60f1a 100644 --- a/src/tic.h +++ b/src/tic.h @@ -402,15 +402,10 @@ typedef struct u8 data[TIC_FLAGS]; } tic_flags; -typedef union +typedef struct { - struct - { - tic_palette scn; - tic_palette ovr; - }; - - tic_palette data[2]; + tic_palette vbank0; + tic_palette vbank1; } tic_palettes; typedef struct From 22b7e774af779cb4299c2e58f5b9c067647a760f Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 08:54:26 +0300 Subject: [PATCH 104/379] OVR() fix for wren #1660 --- src/api/wren.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/api/wren.c b/src/api/wren.c index 69e67f5c0..3de633b7f 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -1558,6 +1558,17 @@ static void callWrenTick(tic_mem* tic) wrenEnsureSlots(vm, 1); wrenSetSlotHandle(vm, 0, game_class); wrenCall(vm, update_handle); + + // call OVR() callback for backward compatibility + if(overline_handle) + { + OVR(tic) + { + wrenEnsureSlots(vm, 1); + wrenSetSlotHandle(vm, 0, game_class); + wrenCall(vm, overline_handle); + } + } } } @@ -1586,17 +1597,6 @@ static void callWrenBorder(tic_mem* tic, s32 row, void* data) wrenSetSlotHandle(vm, 0, game_class); wrenSetSlotDouble(vm, 1, row); wrenCall(vm, border_handle); - - // call OVR() callback for backward compatibility - if(overline_handle) - { - OVR(tic) - { - wrenEnsureSlots(vm, 1); - wrenSetSlotHandle(vm, 0, game_class); - wrenCall(vm, overline_handle); - } - } } } From 895643e1dd8bacdecfae41e5c11c3e7bdc1f1ebe Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 11:50:50 +0300 Subject: [PATCH 105/379] Surf palette fix + SCN() callback optimization #1660 --- src/core/core.c | 76 ++++++++++++++++++--------------------- src/studio/screens/surf.c | 2 ++ 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index 29a0e5401..4841f280f 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -559,47 +559,52 @@ static inline void memset4(void* dst, u32 val, u32 dwords) #endif } -void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) +static inline void updpal(tic_mem* tic, const tic_vram* vbank0, const tic_vram* vbank1, tic_blitpal* pal0, tic_blitpal* pal1) { - tic_core* core = (tic_core*)tic; - tic80_pixel_color_format fmt = tic->screen_format; - const tic_vram* vbank0 = &tic->ram.vram; - const tic_vram* vbank1 = &core->state.vbank.mem; - tic_api_vbank(tic, 0); + *pal0 = tic_tool_palette_blit(&vbank0->palette, tic->screen_format); + *pal1 = tic_tool_palette_blit(&vbank1->palette, tic->screen_format); +} -#define UPDBRD() \ - if(clb.border) \ - { \ - clb.border(tic, row, clb.data); \ - tic_api_vbank(tic, 0); \ - pal0 = tic_tool_palette_blit(&vbank0->palette, fmt); \ - pal1 = tic_tool_palette_blit(&vbank1->palette, fmt); \ - } +static inline void updbdr(tic_mem* tic, s32 row, u32* ptr, tic_blit_callback clb, + const tic_vram* vbank0, const tic_vram* vbank1, tic_blitpal* pal0, tic_blitpal* pal1) +{ + tic_core* core = (tic_core*)tic; + + if(clb.border) clb.border(tic, row, clb.data); - if (clb.scanline) + if(clb.scanline) { - clb.scanline(tic, 0, clb.data); - tic_api_vbank(tic, 0); + if(row == 0) clb.scanline(tic, 0, clb.data); + else if(row > TIC80_MARGIN_TOP && row < (TIC80_HEIGHT + TIC80_MARGIN_TOP)) + clb.scanline(tic, row - TIC80_MARGIN_TOP, clb.data); } - tic_blitpal pal0 = tic_tool_palette_blit(&vbank0->palette, fmt); - tic_blitpal pal1 = tic_tool_palette_blit(&vbank1->palette, fmt); + if(clb.border || clb.scanline) + updpal(tic, vbank0, vbank1, pal0, pal1); + + memset4(ptr, pal0->data[vbank0->vars.border], TIC80_FULLWIDTH); +} + +void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) +{ + tic_core* core = (tic_core*)tic; + const tic_vram* vbank0 = &tic->ram.vram; + const tic_vram* vbank1 = &core->state.vbank.mem; + + tic_blitpal pal0, pal1; + updpal(tic, vbank0, vbank1, &pal0, &pal1); s32 row = 0; u32* rowPtr = tic->screen; +#define UPDBDR() updbdr(tic, row, rowPtr, clb, vbank0, vbank1, &pal0, &pal1) + for(; row != TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) - { - UPDBRD(); - memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_FULLWIDTH); - } + UPDBDR(); - for (; row < TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row) + for(; UPDBDR(), row != TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row) { - UPDBRD(); - memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_MARGIN_LEFT); - rowPtr += TIC80_MARGIN_LEFT; enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; @@ -615,26 +620,13 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) : pal0.data[tic_tool_peek4(vbank0->screen.data, (x - vbank0->vars.offset.x) % TIC80_WIDTH + start0)]; } - memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_MARGIN_RIGHT); - rowPtr += TIC80_MARGIN_RIGHT; - - if (clb.scanline && (row < TIC80_HEIGHT + TIC80_MARGIN_TOP - 1)) - { - clb.scanline(tic, row - (TIC80_MARGIN_TOP - 1), clb.data); - tic_api_vbank(tic, 0); - pal0 = tic_tool_palette_blit(&vbank0->palette, fmt); - pal1 = tic_tool_palette_blit(&vbank1->palette, fmt); - } } for(; row != TIC80_FULLHEIGHT; ++row, rowPtr += TIC80_FULLWIDTH) - { - UPDBRD(); - memset4(rowPtr, pal0.data[vbank0->vars.border], TIC80_FULLWIDTH); - } + UPDBDR(); -#undef UPDBRD +#undef UPDBDR } static inline void scanline(tic_mem* memory, s32 row, void* data) diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 13feb7df0..439f9dc7e 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -867,6 +867,8 @@ static void tick(Surf* surf) } } + if (getStudioMode() != TIC_SURF_MODE) return; + if (surf->menu.count > 0) { loadCover(surf); From 9e0fac3238ad04b6d42d34c419037c7bbec1942a Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 19:47:50 +0300 Subject: [PATCH 106/379] removed memmask usage #1660 --- src/api.h | 2 +- src/api/js.c | 2 +- src/api/lua.c | 2 +- src/api/squirrel.c | 2 +- src/api/wren.c | 2 +- src/core/core.c | 34 +++++---------- src/core/core.h | 29 ++++++------- src/core/draw.c | 85 +++++++++++++++---------------------- src/studio/editors/map.c | 4 +- src/studio/editors/sprite.c | 2 + src/studio/editors/world.c | 1 + src/studio/screens/dialog.c | 2 +- src/studio/screens/menu.c | 7 ++- src/studio/screens/surf.c | 1 + src/tic.h | 9 +++- 15 files changed, 85 insertions(+), 99 deletions(-) diff --git a/src/api.h b/src/api.h index 4c3f2f1d4..fc4d07790 100644 --- a/src/api.h +++ b/src/api.h @@ -752,8 +752,8 @@ void tic_core_resume(tic_mem* memory); void tic_core_tick_start(tic_mem* memory); void tic_core_tick(tic_mem* memory, tic_tick_data* data); void tic_core_tick_end(tic_mem* memory); -void tic_core_blit(tic_mem* tic); void tic_core_synth_sound(tic_mem* tic); +void tic_core_blit(tic_mem* tic); void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb); const tic_script_config* tic_core_script_config(tic_mem* memory); diff --git a/src/api/js.c b/src/api/js.c index 226440bbe..5e47dcaab 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -1024,7 +1024,7 @@ static void callJavascriptTick(tic_mem* tic) { if(duk_get_global_string(duk, OVR_FN)) { - OVR(tic) + OVR(core) { if(duk_pcall(duk, 0) != 0) core->data->error(core->data->data, duk_safe_to_stacktrace(duk, -1)); diff --git a/src/api/lua.c b/src/api/lua.c index eb60d8e98..da71f4d8d 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1536,7 +1536,7 @@ void callLuaTick(tic_mem* tic) lua_getglobal(lua, OVR_FN); if(lua_isfunction(lua, -1)) { - OVR(tic) + OVR(core) { if(docall(lua, 0, 0) != LUA_OK) core->data->error(core->data->data, lua_tostring(lua, -1)); diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 41d24b987..998e9fba4 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1641,7 +1641,7 @@ static void callSquirrelTick(tic_mem* tic) if(SQ_SUCCEEDED(sq_get(vm, -2))) { - OVR(tic) + OVR(core) { sq_pushroottable(vm); diff --git a/src/api/wren.c b/src/api/wren.c index 3de633b7f..b1f4138c3 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -1562,7 +1562,7 @@ static void callWrenTick(tic_mem* tic) // call OVR() callback for backward compatibility if(overline_handle) { - OVR(tic) + OVR(core) { wrenEnsureSlots(vm, 1); wrenSetSlotHandle(vm, 0, game_class); diff --git a/src/core/core.c b/src/core/core.c index 4841f280f..aeb633a18 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -77,20 +77,6 @@ void tic_api_poke(tic_mem* memory, s32 address, u8 value, s32 bits) case 4: if(address < RamBits / 4) tic_tool_poke4(ram, address, value); break; case 8: if(address < RamBits / 8) ram[address] = value; break; } - - if(core->state.vbank.id) - { - enum{ScreenBits = sizeof(tic_screen) * BITS_IN_BYTE}; - - u8* mmask = core->state.vbank.memmask; - switch(bits) - { - case 1: if(address < ScreenBits / 1) {mmask[address >> 2] = 1;} break; - case 2: if(address < ScreenBits / 2) {mmask[address >> 1] = 1;} break; - case 4: if(address < ScreenBits / 4) {mmask[address >> 0] = 1;} break; - case 8: if(address < ScreenBits / 8) {*(u16*)&mmask[address << 1] = 0x0101;} break; - } - } } u8 tic_api_peek4(tic_mem* memory, s32 address) @@ -292,27 +278,27 @@ static void soundClear(tic_mem* memory) static void resetVbank(tic_mem* memory) { - memset(&memory->ram.vram.vars, 0, sizeof memory->ram.vram.vars); - memory->ram.vram.blit.segment = TIC_DEFAULT_BLIT_MODE; - tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + ZEROMEM(memory->ram.vram.vars); static const u8 DefaultMapping[] = { 0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe }; memcpy(memory->ram.vram.mapping, DefaultMapping, sizeof DefaultMapping); memory->ram.vram.palette = memory->cart.bank0.palette.vbank0; + memory->ram.vram.blit.segment = TIC_DEFAULT_BLIT_MODE; } void tic_api_reset(tic_mem* memory) { tic_core* core = (tic_core*)memory; + tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + resetVbank(memory); VBANK(memory, 1) { resetVbank(memory); - // clear BANK1 memmask - ZEROMEM(core->state.vbank.memmask); + ZEROMEM(memory->ram.vram.screen); // init VBANK1 palette with VBANK0 palette if it's empty // for backward compatibility @@ -603,8 +589,9 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) for(; row != TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) UPDBDR(); - for(; UPDBDR(), row != TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row) + for(; row != TIC80_FULLHEIGHT - TIC80_MARGIN_BOTTOM; ++row) { + UPDBDR(); rowPtr += TIC80_MARGIN_LEFT; enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; @@ -612,11 +599,12 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) s32 start1 = (row - vbank1->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) - { + { s32 offset = (x - vbank1->vars.offset.x) % TIC80_WIDTH + start1; + u8 pix = tic_tool_peek4(vbank1->screen.data, offset); - *rowPtr++ = core->state.vbank.memmask[offset] - ? pal1.data[tic_tool_peek4(vbank1->screen.data, offset)] + *rowPtr++ = pix != vbank1->vars.clear + ? pal1.data[pix] : pal0.data[tic_tool_peek4(vbank0->screen.data, (x - vbank0->vars.offset.x) % TIC80_WIDTH + start0)]; } diff --git a/src/core/core.h b/src/core/core.h index 6601b95f3..76386807e 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -152,13 +152,13 @@ typedef struct { s32 id; tic_vram mem; - u8 memmask[sizeof(tic_screen) << 1]; - struct - { - u8 l, t, r, b; - } clip; } vbank; + struct + { + u8 l, t, r, b; + } clip; + bool initialized; } tic_core_state_data; @@ -197,14 +197,13 @@ void tic_core_tick_io(tic_mem* memory); void tic_core_sound_tick_start(tic_mem* memory); void tic_core_sound_tick_end(tic_mem* memory); -// border color and mouse cursor is the same in both modes +// mouse cursor is the same in both modes // for backward compatibility -#define OVR_COMPAT(TIC, BANK) \ - tic_api_vbank(TIC, BANK), \ - TIC->ram.vram.vars.border = ((tic_core*)TIC)->state.vbank.mem.vars.border, \ - TIC->ram.vram.vars.cursor = ((tic_core*)TIC)->state.vbank.mem.vars.cursor - -#define OVR(TIC) \ - OVR_COMPAT(TIC, 1); \ - tic_api_cls(TIC, 0); \ - SCOPE(OVR_COMPAT(TIC, 0)) +#define OVR_COMPAT(CORE, BANK) \ + tic_api_vbank(&CORE->memory, BANK), \ + CORE->memory.ram.vram.vars.cursor = CORE->state.vbank.mem.vars.cursor + +#define OVR(CORE) \ + OVR_COMPAT(CORE, 1); \ + tic_api_cls(&CORE->memory, 0); \ + SCOPE(OVR_COMPAT(CORE, 0)) diff --git a/src/core/draw.c b/src/core/draw.c index 2d500ef30..6f57e494f 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -62,7 +62,7 @@ static void setPixel(tic_core* core, s32 x, s32 y, u8 color) { const tic_vram* vram = &core->memory.ram.vram; - if (x < core->state.vbank.clip.l || y < core->state.vbank.clip.t || x >= core->state.vbank.clip.r || y >= core->state.vbank.clip.b) return; + if (x < core->state.clip.l || y < core->state.clip.t || x >= core->state.clip.r || y >= core->state.clip.b) return; tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } @@ -74,20 +74,20 @@ static u8 getPixel(tic_core* core, s32 x, s32 y) #define EARLY_CLIP(x, y, width, height) \ ( \ - (((y)+(height)-1) < core->state.vbank.clip.t) \ - || (((x)+(width)-1) < core->state.vbank.clip.l) \ - || ((y) >= core->state.vbank.clip.b) \ - || ((x) >= core->state.vbank.clip.r) \ + (((y)+(height)-1) < core->state.clip.t) \ + || (((x)+(width)-1) < core->state.clip.l) \ + || ((y) >= core->state.clip.b) \ + || ((x) >= core->state.clip.r) \ ) static void drawHLine(tic_core* core, s32 x, s32 y, s32 width, u8 color) { const tic_vram* vram = &core->memory.ram.vram; - if (y < core->state.vbank.clip.t || core->state.vbank.clip.b <= y) return; + if (y < core->state.clip.t || core->state.clip.b <= y) return; - s32 xl = MAX(x, core->state.vbank.clip.l); - s32 xr = MIN(x + width, core->state.vbank.clip.r); + s32 xl = MAX(x, core->state.clip.l); + s32 xr = MIN(x + width, core->state.clip.r); s32 start = y * TIC80_WIDTH; for(s32 i = start + xl, end = start + xr; i < end; ++i) @@ -98,7 +98,7 @@ static void drawVLine(tic_core* core, s32 x, s32 y, s32 height, u8 color) { const tic_vram* vram = &core->memory.ram.vram; - if (x < core->state.vbank.clip.l || core->state.vbank.clip.r <= x) return; + if (x < core->state.clip.l || core->state.clip.r <= x) return; s32 yl = y < 0 ? 0 : y; s32 yr = y + height >= TIC80_HEIGHT ? TIC80_HEIGHT : y + height; @@ -152,10 +152,10 @@ static void drawTile(tic_core* core, tic_tileptr* tile, s32 x, s32 y, u8* colors if (scale == 1) { // the most common path s32 sx, sy, ex, ey; - sx = core->state.vbank.clip.l - x; if (sx < 0) sx = 0; - sy = core->state.vbank.clip.t - y; if (sy < 0) sy = 0; - ex = core->state.vbank.clip.r - x; if (ex > TIC_SPRITESIZE) ex = TIC_SPRITESIZE; - ey = core->state.vbank.clip.b - y; if (ey > TIC_SPRITESIZE) ey = TIC_SPRITESIZE; + sx = core->state.clip.l - x; if (sx < 0) sx = 0; + sy = core->state.clip.t - y; if (sy < 0) sy = 0; + ex = core->state.clip.r - x; if (ex > TIC_SPRITESIZE) ex = TIC_SPRITESIZE; + ey = core->state.clip.b - y; if (ey > TIC_SPRITESIZE) ey = TIC_SPRITESIZE; y += sy; x += sx; switch (orientation) { @@ -352,15 +352,15 @@ void tic_api_clip(tic_mem* memory, s32 x, s32 y, s32 width, s32 height) tic_core* core = (tic_core*)memory; tic_vram* vram = &memory->ram.vram; - core->state.vbank.clip.l = x; - core->state.vbank.clip.t = y; - core->state.vbank.clip.r = x + width; - core->state.vbank.clip.b = y + height; + core->state.clip.l = x; + core->state.clip.t = y; + core->state.clip.r = x + width; + core->state.clip.b = y + height; - if (core->state.vbank.clip.l < 0) core->state.vbank.clip.l = 0; - if (core->state.vbank.clip.t < 0) core->state.vbank.clip.t = 0; - if (core->state.vbank.clip.r > TIC80_WIDTH) core->state.vbank.clip.r = TIC80_WIDTH; - if (core->state.vbank.clip.b > TIC80_HEIGHT) core->state.vbank.clip.b = TIC80_HEIGHT; + if (core->state.clip.l < 0) core->state.clip.l = 0; + if (core->state.clip.t < 0) core->state.clip.t = 0; + if (core->state.clip.r > TIC80_WIDTH) core->state.clip.r = TIC80_WIDTH; + if (core->state.clip.b > TIC80_HEIGHT) core->state.clip.b = TIC80_HEIGHT; } void tic_api_rect(tic_mem* memory, s32 x, s32 y, s32 width, s32 height, u8 color) @@ -377,28 +377,11 @@ void tic_api_cls(tic_mem* memory, u8 color) static const u8 EmptyClip[] = { 0, 0, TIC80_WIDTH, TIC80_HEIGHT }; - if (memcmp(&core->state.vbank.clip, &EmptyClip, sizeof EmptyClip) == 0) - { + if (memcmp(&core->state.clip, &EmptyClip, sizeof EmptyClip) == 0) memset(&vram->screen, (color & 0xf) | (color << TIC_PALETTE_BPP), sizeof(tic_screen)); - - // clear BANK1 memmask - if(core->state.vbank.id) - ZEROMEM(core->state.vbank.memmask); - } else - { - tic_rect rect = {core->state.vbank.clip.l, core->state.vbank.clip.t, core->state.vbank.clip.r - core->state.vbank.clip.l, core->state.vbank.clip.b - core->state.vbank.clip.t}; - - tic_api_rect(memory, rect.x, rect.y, rect.w, rect.h, color); - - // clear BANK1 memmask - if(core->state.vbank.id) - { - for(u8 *ptr = core->state.vbank.memmask + rect.x + rect.y * TIC80_WIDTH, - *end = ptr + (rect.w - 1) + (rect.h - 1) * TIC80_WIDTH; ptr < end; ptr += TIC80_WIDTH) - memset(ptr, 0, rect.w); - } - } + tic_api_rect(memory, core->state.clip.l, core->state.clip.t, + core->state.clip.r - core->state.clip.l, core->state.clip.b - core->state.clip.t, color); } s32 tic_api_font(tic_mem* memory, const char* text, s32 x, s32 y, u8 chromakey, s32 w, s32 h, bool fixed, s32 scale, bool alt) @@ -570,13 +553,13 @@ static void drawSidesBuffer(tic_mem* memory, s32 y0, s32 y1, u8 color) tic_vram* vram = &memory->ram.vram; tic_core* core = (tic_core*)memory; - s32 yt = MAX(core->state.vbank.clip.t, y0); - s32 yb = MIN(core->state.vbank.clip.b, y1 + 1); + s32 yt = MAX(core->state.clip.t, y0); + s32 yb = MIN(core->state.clip.b, y1 + 1); u8 final_color = mapColor(&core->memory, color); for (s32 y = yt; y < yb; y++) { - s32 xl = MAX(SidesBuffer.Left[y], core->state.vbank.clip.l); - s32 xr = MIN(SidesBuffer.Right[y] + 1, core->state.vbank.clip.r); + s32 xl = MAX(SidesBuffer.Left[y], core->state.clip.l); + s32 xr = MIN(SidesBuffer.Right[y] + 1, core->state.clip.r); s32 start = y * TIC80_WIDTH; for(s32 i = start + xl, end = start + xr; i < end; ++i) @@ -763,7 +746,7 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f // if it's backwards skip it s32 width = SidesBuffer.Right[y] - SidesBuffer.Left[y]; // if it's off top or bottom , skip this line - if ((y < core->state.vbank.clip.t) || (y > core->state.vbank.clip.b)) + if ((y < core->state.clip.t) || (y > core->state.clip.b)) width = 0; if (width > 0) { @@ -772,15 +755,15 @@ static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, f s32 left = SidesBuffer.Left[y]; s32 right = SidesBuffer.Right[y]; // check right edge, and CLAMP it - if (right > core->state.vbank.clip.r) - right = core->state.vbank.clip.r; + if (right > core->state.clip.r) + right = core->state.clip.r; // check left edge and offset UV's if we are off the left - if (left < core->state.vbank.clip.l) + if (left < core->state.clip.l) { - s32 dist = core->state.vbank.clip.l - SidesBuffer.Left[y]; + s32 dist = core->state.clip.l - SidesBuffer.Left[y]; u += dudxs * dist; v += dvdxs * dist; - left = core->state.vbank.clip.l; + left = core->state.clip.l; } // are we drawing from the map . ok then at least check before the inner loop if (use_map == true) diff --git a/src/studio/editors/map.c b/src/studio/editors/map.c index 6472bc3f4..010777596 100644 --- a/src/studio/editors/map.c +++ b/src/studio/editors/map.c @@ -1249,6 +1249,8 @@ static void tick(Map* map) VBANK(tic, 1) { + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_dark_blue); + memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); tic_api_clip(tic, 0, TOOLBAR_SIZE, TIC80_WIDTH - (sheetVisible(map) ? TIC_SPRITESHEET_SIZE+2 : 0), TIC80_HEIGHT - TOOLBAR_SIZE); @@ -1287,7 +1289,7 @@ static void tick(Map* map) drawSelectionVBank1(map); drawMapToolbar(map, TIC80_WIDTH, 1); - drawToolbar(map->tic, false); + drawToolbar(map->tic, false); } } diff --git a/src/studio/editors/sprite.c b/src/studio/editors/sprite.c index 67b4dd78c..0b975e8fe 100644 --- a/src/studio/editors/sprite.c +++ b/src/studio/editors/sprite.c @@ -1883,6 +1883,8 @@ static void tick(Sprite* sprite) VBANK(tic, 1) { + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_dark_blue); + static const tic_rect bg[] = { {0, ToolbarH, SheetX, CanvasY-ToolbarH}, diff --git a/src/studio/editors/world.c b/src/studio/editors/world.c index 14a98d091..c7aacc8c1 100644 --- a/src/studio/editors/world.c +++ b/src/studio/editors/world.c @@ -87,6 +87,7 @@ static void tick(World* world) VBANK(tic, 1) { + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_black); memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); drawGrid(world); } diff --git a/src/studio/screens/dialog.c b/src/studio/screens/dialog.c index 07e3c354a..962ca6b62 100644 --- a/src/studio/screens/dialog.c +++ b/src/studio/screens/dialog.c @@ -142,7 +142,6 @@ static void drawDialog(Dialog* dlg) dlg->drag.active = false; } - tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, tic_color_dark_grey); tic_api_rectb(tic, rect.x, rect.y, rect.w, rect.h, tic_color_white); tic_api_line(tic, rect.x, rect.y+Height, rect.x+Width-1, rect.y+Height, tic_color_black); tic_api_rect(tic, rect.x, rect.y-(TOOLBAR_SIZE-2), rect.w, TOOLBAR_SIZE-2, tic_color_white); @@ -194,6 +193,7 @@ static void tick(Dialog* dlg) VBANK(tic, 1) { + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_yellow); memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); drawDialog(dlg); } diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index bbd069180..c070aae2c 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -128,7 +128,9 @@ static void drawDialog(Menu* menu) rect = getRect(menu); - tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, tic_color_dark_grey); + if(menu->cover) + tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, tic_color_dark_grey); + tic_api_rectb(tic, rect.x, rect.y, rect.w, rect.h, tic_color_white); tic_api_line(tic, rect.x, rect.y+DIALOG_HEIGHT, rect.x+DIALOG_WIDTH-1, rect.y+DIALOG_HEIGHT, tic_color_black); tic_api_rect(tic, rect.x, rect.y-(TOOLBAR_SIZE-2), rect.w, TOOLBAR_SIZE-2, tic_color_white); @@ -493,6 +495,8 @@ static void tick(Menu* menu) break; } + if (getStudioMode() != TIC_MENU_MODE) return; + if(menu->cover) tic_api_sync(tic, tic_sync_screen, 0, false); else @@ -500,6 +504,7 @@ static void tick(Menu* menu) VBANK(tic, 1) { + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_yellow); memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); switch(menu->mode) diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 439f9dc7e..2c28009bc 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -881,6 +881,7 @@ static void tick(Surf* surf) VBANK(tic, 1) { + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_yellow); memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); if(surf->menu.count > 0) diff --git a/src/tic.h b/src/tic.h index 9feb60f1a..f9fd118f3 100644 --- a/src/tic.h +++ b/src/tic.h @@ -469,8 +469,13 @@ typedef union struct { - u8 border:TIC_PALETTE_BPP; - u8 tmp:4; + union + { + u8 border:TIC_PALETTE_BPP; + + // clear color for the BANK1 + u8 clear:TIC_PALETTE_BPP; + }; struct { From 65f425b2175f1d9b2d5679b53d772960c2b72db6 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 20:52:08 +0300 Subject: [PATCH 107/379] fixed editors flickering when click on the toolbar + game menu is transparent now --- src/studio/screens/menu.c | 19 ++----------------- src/studio/screens/menu.h | 1 - src/studio/studio.c | 11 +++++++++-- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index c070aae2c..6b6c191e4 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -128,9 +128,6 @@ static void drawDialog(Menu* menu) rect = getRect(menu); - if(menu->cover) - tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, tic_color_dark_grey); - tic_api_rectb(tic, rect.x, rect.y, rect.w, rect.h, tic_color_white); tic_api_line(tic, rect.x, rect.y+DIALOG_HEIGHT, rect.x+DIALOG_WIDTH-1, rect.y+DIALOG_HEIGHT, tic_color_black); tic_api_rect(tic, rect.x, rect.y-(TOOLBAR_SIZE-2), rect.w, TOOLBAR_SIZE-2, tic_color_white); @@ -497,10 +494,7 @@ static void tick(Menu* menu) if (getStudioMode() != TIC_MENU_MODE) return; - if(menu->cover) - tic_api_sync(tic, tic_sync_screen, 0, false); - else - drawBGAnimation(tic, menu->ticks); + drawBGAnimation(tic, menu->ticks); VBANK(tic, 1) { @@ -521,15 +515,7 @@ static void tick(Menu* menu) static void scanline(tic_mem* tic, s32 row, void* data) { - Menu* menu = (Menu*)data; - - if(menu->cover) - { - if(row == 0) - memcpy(&tic->ram.vram.palette, tic->cart.bank0.palette.vbank0.data, sizeof(tic_palette)); - } - else - drawBGAnimationScanline(tic, row); + drawBGAnimationScanline(tic, row); } void initMenu(Menu* menu, tic_mem* tic, tic_fs* fs) @@ -537,7 +523,6 @@ void initMenu(Menu* menu, tic_mem* tic, tic_fs* fs) *menu = (Menu) { .init = false, - .cover = !EMPTY(tic->cart.bank0.screen.data), .fs = fs, .tic = tic, .tick = tick, diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index bf56c7bb6..55f7c2325 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -32,7 +32,6 @@ struct Menu struct tic_fs* fs; bool init; - bool cover; s32 ticks; struct diff --git a/src/studio/studio.c b/src/studio/studio.c index dc45b3574..b0f5df91b 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -112,6 +112,7 @@ static struct EditorMode mode; EditorMode prevMode; + EditorMode toolbarMode; struct { @@ -882,7 +883,7 @@ void drawToolbar(tic_mem* tic, bool bg) showTooltip(Tips[i]); if(checkMouseClick(&rect, tic_mouse_left)) - setStudioMode(Modes[i]); + impl.toolbarMode = Modes[i]; } if(getStudioMode() == Modes[i]) mode = i; @@ -2007,7 +2008,13 @@ static void studioTick() checkChanges(); tic_net_start(impl.net); #endif - + + if(impl.toolbarMode) + { + setStudioMode(impl.toolbarMode); + impl.toolbarMode = 0; + } + processMouseStates(); processGamepadMapping(); From ed3fdf202d9b385a4c9ec796d7ae57e116298f36 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 21:12:55 +0300 Subject: [PATCH 108/379] reverted to real memcpy/memset #1660 --- src/core/core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index aeb633a18..4e350d1d8 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -121,8 +121,8 @@ void tic_api_memcpy(tic_mem* memory, s32 dst, s32 src, s32 size) && dst <= bound && src <= bound) { - for(s32 end = dst + size; dst != end;) - tic_api_poke(memory, dst++, tic_api_peek(memory, src++, 8), 8); + u8* base = (u8*)&memory->ram; + memcpy(base + dst, base + src, size); } } @@ -136,8 +136,8 @@ void tic_api_memset(tic_mem* memory, s32 dst, u8 val, s32 size) && dst >= 0 && dst <= bound) { - for(s32 end = dst + size; dst != end;) - tic_api_poke(memory, dst++, val, 8); + u8* base = (u8*)&memory->ram; + memset(base + dst, val, size); } } From 50fef6ca49af280d67224b0ee84f57bfb8ea3017 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 21:51:11 +0300 Subject: [PATCH 109/379] enable CRT shader in the exported builds --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb5d07508..effba11be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1035,6 +1035,10 @@ if(BUILD_STUB) target_include_directories(tic80${SCRIPT} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + if(BUILD_SDLGPU) + target_compile_definitions(tic80studio PUBLIC CRT_SHADER_SUPPORT) + endif() + if(MINGW) target_link_libraries(tic80${SCRIPT} mingw32) target_link_options(tic80${SCRIPT} PRIVATE -static -mconsole) From d2b99ae3e9afe3d815a4d4dd4d3724adb8d00dd3 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 22:14:45 +0300 Subject: [PATCH 110/379] enable CRT shader in the exported builds, fix --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index effba11be..c66322168 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1036,7 +1036,7 @@ if(BUILD_STUB) target_include_directories(tic80${SCRIPT} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(BUILD_SDLGPU) - target_compile_definitions(tic80studio PUBLIC CRT_SHADER_SUPPORT) + target_compile_definitions(tic80${SCRIPT} PRIVATE CRT_SHADER_SUPPORT) endif() if(MINGW) From 56ce22cea85c0da2385bc6f2dfcbeda035422da7 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 22:41:47 +0300 Subject: [PATCH 111/379] vbank rendering optimization #1660 --- src/core/core.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index 4e350d1d8..041ced59f 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -450,7 +450,6 @@ void tic_core_tick(tic_mem* tic, tic_tick_data* data) else return; } - tic_api_vbank(tic, 0); core->state.tick(tic); } @@ -545,15 +544,24 @@ static inline void memset4(void* dst, u32 val, u32 dwords) #endif } -static inline void updpal(tic_mem* tic, const tic_vram* vbank0, const tic_vram* vbank1, tic_blitpal* pal0, tic_blitpal* pal1) +static inline tic_vram* vbank0(tic_core* core) { - tic_api_vbank(tic, 0); - *pal0 = tic_tool_palette_blit(&vbank0->palette, tic->screen_format); - *pal1 = tic_tool_palette_blit(&vbank1->palette, tic->screen_format); + return core->state.vbank.id ? &core->state.vbank.mem : &core->memory.ram.vram; } -static inline void updbdr(tic_mem* tic, s32 row, u32* ptr, tic_blit_callback clb, - const tic_vram* vbank0, const tic_vram* vbank1, tic_blitpal* pal0, tic_blitpal* pal1) +static inline tic_vram* vbank1(tic_core* core) +{ + return core->state.vbank.id ? &core->memory.ram.vram : &core->state.vbank.mem; +} + +static inline void updpal(tic_mem* tic, tic_blitpal* pal0, tic_blitpal* pal1) +{ + tic_core* core = (tic_core*)tic; + *pal0 = tic_tool_palette_blit(&vbank0(core)->palette, tic->screen_format); + *pal1 = tic_tool_palette_blit(&vbank1(core)->palette, tic->screen_format); +} + +static inline void updbdr(tic_mem* tic, s32 row, u32* ptr, tic_blit_callback clb, tic_blitpal* pal0, tic_blitpal* pal1) { tic_core* core = (tic_core*)tic; @@ -567,24 +575,22 @@ static inline void updbdr(tic_mem* tic, s32 row, u32* ptr, tic_blit_callback clb } if(clb.border || clb.scanline) - updpal(tic, vbank0, vbank1, pal0, pal1); + updpal(tic, pal0, pal1); - memset4(ptr, pal0->data[vbank0->vars.border], TIC80_FULLWIDTH); + memset4(ptr, pal0->data[vbank0(core)->vars.border], TIC80_FULLWIDTH); } void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) { tic_core* core = (tic_core*)tic; - const tic_vram* vbank0 = &tic->ram.vram; - const tic_vram* vbank1 = &core->state.vbank.mem; tic_blitpal pal0, pal1; - updpal(tic, vbank0, vbank1, &pal0, &pal1); + updpal(tic, &pal0, &pal1); s32 row = 0; u32* rowPtr = tic->screen; -#define UPDBDR() updbdr(tic, row, rowPtr, clb, vbank0, vbank1, &pal0, &pal1) +#define UPDBDR() updbdr(tic, row, rowPtr, clb, &pal0, &pal1) for(; row != TIC80_MARGIN_TOP; ++row, rowPtr += TIC80_FULLWIDTH) UPDBDR(); @@ -595,17 +601,18 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) rowPtr += TIC80_MARGIN_LEFT; enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; - s32 start0 = (row - vbank0->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; - s32 start1 = (row - vbank1->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 start0 = (row - vbank0(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 start1 = (row - vbank1(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) { - s32 offset = (x - vbank1->vars.offset.x) % TIC80_WIDTH + start1; - u8 pix = tic_tool_peek4(vbank1->screen.data, offset); + u8 pix = tic_tool_peek4(vbank1(core)->screen.data, + (x - vbank1(core)->vars.offset.x) % TIC80_WIDTH + start1); - *rowPtr++ = pix != vbank1->vars.clear + *rowPtr++ = pix != vbank1(core)->vars.clear ? pal1.data[pix] - : pal0.data[tic_tool_peek4(vbank0->screen.data, (x - vbank0->vars.offset.x) % TIC80_WIDTH + start0)]; + : pal0.data[tic_tool_peek4(vbank0(core)->screen.data, + (x - vbank0(core)->vars.offset.x) % TIC80_WIDTH + start0)]; } rowPtr += TIC80_MARGIN_RIGHT; From d6389ae6cadf3700fa80d39053d2d93bf97816bb Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 3 Dec 2021 22:57:11 +0300 Subject: [PATCH 112/379] vbank should be restore in OVR() #1660 --- src/core/core.c | 2 +- src/core/core.h | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index 041ced59f..845d24e4f 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -642,7 +642,7 @@ static inline void border(tic_mem* memory, s32 row, void* data) void tic_core_blit(tic_mem* tic) { - tic_core_blit_ex(tic, (tic_blit_callback){scanline, /*overline,*/ border, NULL}); + tic_core_blit_ex(tic, (tic_blit_callback){scanline, border, NULL}); } tic_mem* tic_core_create(s32 samplerate) diff --git a/src/core/core.h b/src/core/core.h index 76386807e..f2281f37b 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -203,7 +203,8 @@ void tic_core_sound_tick_end(tic_mem* memory); tic_api_vbank(&CORE->memory, BANK), \ CORE->memory.ram.vram.vars.cursor = CORE->state.vbank.mem.vars.cursor -#define OVR(CORE) \ - OVR_COMPAT(CORE, 1); \ - tic_api_cls(&CORE->memory, 0); \ - SCOPE(OVR_COMPAT(CORE, 0)) +#define OVR(CORE) \ + s32 MACROVAR(_bank_) = CORE->state.vbank.id; \ + OVR_COMPAT(CORE, 1); \ + tic_api_cls(&CORE->memory, 0); \ + SCOPE(OVR_COMPAT(CORE, MACROVAR(_bank_))) From 4e9042e33e9ea1a194e70b844f5e3685749e410b Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 4 Dec 2021 11:05:48 +0100 Subject: [PATCH 113/379] Register submodule for mruby --- .gitmodules | 3 +++ vendor/mruby | 1 + 2 files changed, 4 insertions(+) create mode 160000 vendor/mruby diff --git a/.gitmodules b/.gitmodules index ba9826b08..f714fb983 100644 --- a/.gitmodules +++ b/.gitmodules @@ -77,3 +77,6 @@ [submodule "vendor/sdl2"] path = vendor/sdl2 url = https://github.com/libsdl-org/SDL.git +[submodule "mruby"] + path = vendor/mruby + url = https://github.com/mruby/mruby.git diff --git a/vendor/mruby b/vendor/mruby new file mode 160000 index 000000000..0f45836b5 --- /dev/null +++ b/vendor/mruby @@ -0,0 +1 @@ +Subproject commit 0f45836b5954accf508f333f932741b925214471 From 0410babd9bb3af299a070e718f93f99c6d8082ca Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 4 Dec 2021 13:05:57 +0100 Subject: [PATCH 114/379] Link binaries against static mruby --- CMakeLists.txt | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb5d07508..e00ab7889 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.18) set(VERSION_MAJOR 1) set(VERSION_MINOR 0) @@ -133,6 +133,8 @@ endif() set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor) +include(ExternalProject) + ################################ # LUA ################################ @@ -220,6 +222,31 @@ target_include_directories(wren PUBLIC ${THIRDPARTY_DIR}/wren/src/include) target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/optional) target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) +################################ +# MRUBY +################################ + +find_program(RAKE_EXE rake REQUIRED) + +set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) +set(MRUBY_LIB ${MRUBY_DIR}/build/host/lib/libmruby.a) +ExternalProject_Add(mruby_vendor + SOURCE_DIR ${MRUBY_DIR} + CONFIGURE_COMMAND "" + BUILD_IN_SOURCE TRUE + BUILD_COMMAND ${RAKE_EXE} + INSTALL_COMMAND "" + BUILD_BYPRODUCTS ${MRUBY_LIB} +) +add_library(mruby STATIC IMPORTED GLOBAL) +set_property(TARGET mruby APPEND + PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} +) +set_property(TARGET mruby APPEND + PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include +) +add_dependencies(mruby mruby_vendor) + ################################ # SQUIRREL ################################ @@ -333,7 +360,9 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) squirrel duktape blipbuf - zlib) + zlib + mruby + ) if(${BUILD_DEPRECATED}) target_compile_definitions(tic80core${SCRIPT} PRIVATE DEPRECATED_CHUNKS) @@ -487,7 +516,7 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a mruby) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} From bad14fe071d5f4305f48fb23981f7a753c37fdbd Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 5 Dec 2021 01:11:15 -0500 Subject: [PATCH 115/379] squirrel: Fix mouse() from returning null values Fixes #1718 --- src/api/squirrel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 998e9fba4..3cbc2b36a 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1420,7 +1420,7 @@ static SQInteger squirrel_mouse(HSQUIRRELVM vm) const tic80_mouse* mouse = &core->memory.ram.input.mouse; - sq_newarray(vm, 7); + sq_newarray(vm, 0); { tic_point pos = tic_api_mouse((tic_mem*)core); From 429ccd52e663fc57e2599ecff139a7e427ff0fe2 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sun, 5 Dec 2021 10:53:44 +0100 Subject: [PATCH 116/379] Adapt old mrb_api.c code to current internal API-s --- .gitignore | 1 + CMakeLists.txt | 19 +- include/tic80_config.h | 4 +- src/api.h | 96 ++- src/api/mrb.c | 1233 +++++++++++++++++++++++++++++++++++++ src/core/languages.c | 8 + src/studio/demos.c | 26 + tic_mruby_build_config.rb | 81 +++ 8 files changed, 1460 insertions(+), 8 deletions(-) create mode 100644 src/api/mrb.c create mode 100644 tic_mruby_build_config.rb diff --git a/.gitignore b/.gitignore index 9aaf31384..ee78fd4c6 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,4 @@ build/x64/ build/linux/tic80.desktop build/compile_commands.json CMakeSettings.json +tic_mruby_build_config.rb.lock diff --git a/CMakeLists.txt b/CMakeLists.txt index e00ab7889..e9fe4b5de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,20 +227,24 @@ target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) ################################ find_program(RAKE_EXE rake REQUIRED) +find_program(YACC_EXE yacc REQUIRED) set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) -set(MRUBY_LIB ${MRUBY_DIR}/build/host/lib/libmruby.a) +set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/host/lib/libmruby.a) +set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) + ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE - BUILD_COMMAND ${RAKE_EXE} + BUILD_COMMAND ${RAKE_EXE} MRUBY_CONFIG=${MRUBY_CONFIG} INSTALL_COMMAND "" - BUILD_BYPRODUCTS ${MRUBY_LIB} + BUILD_BYPRODUCTS ${MRUBY_LIBRARIES} ) + add_library(mruby STATIC IMPORTED GLOBAL) set_property(TARGET mruby APPEND - PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} + PROPERTY IMPORTED_LOCATION ${MRUBY_LIBRARIES} ) set_property(TARGET mruby APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include @@ -327,12 +331,13 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${TIC80CORE_DIR}/core/draw.c ${TIC80CORE_DIR}/core/io.c ${TIC80CORE_DIR}/core/sound.c - ${TIC80CORE_DIR}/api/js.c + ${TIC80CORE_DIR}/api/js.c ${TIC80CORE_DIR}/api/lua.c ${TIC80CORE_DIR}/api/moonscript.c ${TIC80CORE_DIR}/api/fennel.c ${TIC80CORE_DIR}/api/wren.c ${TIC80CORE_DIR}/api/squirrel.c + ${TIC80CORE_DIR}/api/mrb.c ${TIC80CORE_DIR}/tic.c ${TIC80CORE_DIR}/cart.c ${TIC80CORE_DIR}/tools.c @@ -387,6 +392,7 @@ if(BUILD_STUB) MACRO_CORE(js TIC_BUILD_WITH_JS FALSE) MACRO_CORE(wren TIC_BUILD_WITH_WREN FALSE) MACRO_CORE(squirrel TIC_BUILD_WITH_SQUIRREL FALSE) + MACRO_CORE(mruby TIC_BUILD_WITH_MRUBY FALSE) endif() @@ -516,7 +522,7 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a mruby) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIBRARIES}) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} @@ -1108,6 +1114,7 @@ if(BUILD_STUB) MACRO_STUB(js) MACRO_STUB(wren) MACRO_STUB(squirrel) + MACRO_STUB(mruby) endif() diff --git a/include/tic80_config.h b/include/tic80_config.h index 222981dab..1a884d19b 100644 --- a/include/tic80_config.h +++ b/include/tic80_config.h @@ -27,7 +27,8 @@ !defined(TIC_BUILD_WITH_FENNEL) && \ !defined(TIC_BUILD_WITH_JS) && \ !defined(TIC_BUILD_WITH_WREN) && \ - !defined(TIC_BUILD_WITH_SQUIRREL) + !defined(TIC_BUILD_WITH_SQUIRREL) && \ + !defined(TIC_BUILD_WITH_MRUBY) # define TIC_BUILD_WITH_LUA 1 # define TIC_BUILD_WITH_MOON 1 @@ -35,6 +36,7 @@ # define TIC_BUILD_WITH_JS 1 # define TIC_BUILD_WITH_WREN 1 # define TIC_BUILD_WITH_SQUIRREL 1 +# define TIC_BUILD_WITH_MRUBY 1 #endif diff --git a/src/api.h b/src/api.h index 4c3f2f1d4..1dfa73c9c 100644 --- a/src/api.h +++ b/src/api.h @@ -149,6 +149,8 @@ enum // definition // help // parameters count +// required parameters count +// callback? // return type // function parameters // ) @@ -166,6 +168,8 @@ enum "- To use a custom rastered font, check out `font()`.\n" \ "- To print to the console, check out `trace()`.", \ 7, \ + 1, \ + 0, \ s32, \ tic_mem*, const char* text, s32 x, s32 y, u8 color, bool fixed, s32 scale, bool alt) \ \ @@ -177,6 +181,8 @@ enum "When called this function clear all the screen using the color passed as argument.\n" \ "If no parameter is passed first color (0) is used.", \ 1, \ + 0, \ + 0, \ void, \ tic_mem*, u8 color) \ \ @@ -188,6 +194,8 @@ enum "When called with a color parameter, the pixel at the specified coordinates is set to that color.\n" \ "Calling the function without a color parameter returns the color of the pixel at the specified position.", \ 3, \ + 2, \ + 0, \ u8, \ tic_mem*, s32 x, s32 y, u8 color, bool get) \ \ @@ -197,6 +205,8 @@ enum \ "Draws a straight line from point (x0,y0) to point (x1,y1) in the specified color.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, u8 color) \ \ @@ -207,6 +217,8 @@ enum "This function draws a filled rectangle of the desired size and color at the specified position.\n" \ "If you only need to draw the the border or outline of a rectangle (ie not filled) see `rectb()`.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height, u8 color) \ \ @@ -217,6 +229,8 @@ enum "This function draws a one pixel thick rectangle border at the position requested.\n" \ "If you need to fill the rectangle with a color, see `rect()` instead.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height, u8 color) \ \ @@ -242,6 +256,8 @@ enum "You can draw a composite sprite (consisting of a rectangular region of sprites from the sprite sheet) " \ "by specifying the `w` and `h` parameters (which default to 1).", \ 9, \ + 3, \ + 0, \ void, \ tic_mem*, s32 index, s32 x, s32 y, s32 w, s32 h, \ u8* colors, s32 count, s32 scale, tic_flip flip, tic_rotate rotate) \ @@ -255,6 +271,8 @@ enum "It remains true for as long as the key is held down.\n" \ "If you want to test if a key was just pressed, use `btnp()` instead.", \ 1, \ + 1, \ + 0, \ u32, \ tic_mem*, s32 id) \ \ @@ -273,6 +291,8 @@ enum "Since time is expressed in ticks and TIC runs at 60 frames per second, " \ "we use the value of 120 to wait 2 seconds and 6 ticks (ie 60/10) as the interval for re-checking.", \ 3, \ + 1, \ + 0, \ u32, \ tic_mem*, s32 id, s32 hold, s32 period) \ \ @@ -299,6 +319,8 @@ enum "The `speed` in the range -4 to 3 can be specified and means how many `ticks+1` to play each step, " \ "so speed==0 means 1 tick per step.", \ 6, \ + 1, \ + 0, \ void, \ tic_mem*, s32 index, s32 note, s32 octave, \ s32 duration, s32 channel, s32 left, s32 right, s32 speed) \ @@ -323,6 +345,8 @@ enum "will cause tile(sprite) #1 to appear at top left when map() is called.\n" \ "To set the tile immediately below this we need to write to 0x08000 + 240, ie 0x080F0.", \ 9, \ + 0, \ + 1, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height, s32 sx, s32 sy, \ u8* colors, s32 count, s32 scale, RemapFunc remap, void* data) \ @@ -333,6 +357,8 @@ enum \ "Gets the sprite id at the given x and y map coordinate.", \ 2, \ + 2, \ + 0, \ u8, \ tic_mem*, s32 x, s32 y) \ \ @@ -345,6 +371,8 @@ enum "To make permanent changes to the map, see `sync()`.\n" \ "Related: `map()` `mget()` `sync()`.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, u8 value) \ \ @@ -360,6 +388,8 @@ enum "To write to a memory address, use `poke()`.\n" \ "`bits` allowed to be 1,2,4,8.", \ 2, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address, s32 bits) \ \ @@ -371,6 +401,8 @@ enum "The address should be specified in hexadecimal format, the value in decimal.\n" \ "`bits` allowed to be 1,2,4,8.", \ 3, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value, s32 bits) \ \ @@ -381,6 +413,8 @@ enum "This function enables you to read single bit values from TIC's RAM.\n" \ "The address is often specified in hexadecimal format.", \ 1, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address) \ \ @@ -391,6 +425,8 @@ enum "This function allows you to write single bit values directly to RAM.\n" \ "The address is often specified in hexadecimal format.", \ 2, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value) \ \ @@ -401,6 +437,8 @@ enum "This function enables you to read two bits values from TIC's RAM.\n" \ "The address is often specified in hexadecimal format.", \ 1, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address) \ \ @@ -411,6 +449,8 @@ enum "This function allows you to write two bits values directly to RAM.\n" \ "The address is often specified in hexadecimal format.", \ 2, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value) \ \ @@ -422,6 +462,8 @@ enum "The address is often specified in hexadecimal format.\n" \ "See 'poke4()' for detailed information on how nibble addressing compares with byte addressing.", \ 1, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address) \ \ @@ -435,6 +477,8 @@ enum "Therefore, to access the the RAM at byte address 0x4000\n" \ "you would need to access both the 0x8000 and 0x8001 nibble addresses.", \ 2, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value) \ \ @@ -445,6 +489,8 @@ enum "This function allows you to copy a continuous block of TIC's 96K RAM from one address to another.\n" \ "Addresses are specified are in hexadecimal format, values are decimal.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 dst, s32 src, s32 size) \ \ @@ -455,6 +501,8 @@ enum "This function allows you to set a continuous block of any part of TIC's RAM to the same value.\n" \ "The address is specified in hexadecimal format, the value in decimal.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 dst, u8 val, s32 size) \ \ @@ -468,6 +516,8 @@ enum "- The Lua concatenator for strings is .. (two points).\n" \ "- Use console cls command to clear the output from trace.", \ 2, \ + 1, \ + 0, \ void, \ tic_mem*, const char* text, u8 color) \ \ @@ -484,6 +534,8 @@ enum "- Use `saveid:` with a personalized string in the header metadata to override the default MD5 calculation.\n" \ "This allows the user to update a cart without losing their saved data.", \ 2, \ + 1, \ + 0, \ u32, \ tic_mem*, s32 index, u32 value, bool get) \ \ @@ -494,6 +546,8 @@ enum "This function returns the number of milliseconds elapsed since the cartridge began execution.\n" \ "Useful for keeping track of time, animating items and triggering events.", \ 0, \ + 0, \ + 0, \ double, \ tic_mem*) \ \ @@ -504,6 +558,8 @@ enum "This function returns the number of seconds elapsed since January 1st, 1970.\n" \ "Useful for creating persistent games which evolve over time between plays.", \ 0, \ + 0, \ + 0, \ s32, \ tic_mem*) \ \ @@ -513,6 +569,8 @@ enum \ "Interrupts program execution and returns to the console when the TIC function ends.", \ 0, \ + 0, \ + 0, \ void, \ tic_mem*) \ \ @@ -524,6 +582,8 @@ enum "To simply print to the screen, check out `print()`.\n" \ "To print to the console, check out `trace()`.", \ 8, \ + 6, \ + 0, \ s32, \ tic_mem*, const char* text, s32 x, s32 y, \ u8 chromakey, s32 w, s32 h, bool fixed, s32 scale, bool alt) \ @@ -535,6 +595,8 @@ enum "This function returns the mouse coordinates and a boolean value for the state of each mouse button," \ "with true indicating that a button is pressed.", \ 0, \ + 0, \ + 0, \ tic_point, \ tic_mem*) \ \ @@ -545,6 +607,8 @@ enum "This function draws a filled circle of the desired radius and color with its center at x, y.\n" \ "It uses the Bresenham algorithm.", \ 4, \ + 4, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 radius, u8 color) \ \ @@ -555,6 +619,8 @@ enum "Draws the circumference of a circle with its center at x, y using the radius and color requested.\n" \ "It uses the Bresenham algorithm.", \ 4, \ + 4, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 radius, u8 color) \ \ @@ -565,6 +631,8 @@ enum "This function draws a filled ellipse of the desired a, b radiuses and color with its center at x, y.\n" \ "It uses the Bresenham algorithm.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 a, s32 b, u8 color) \ \ @@ -575,6 +643,8 @@ enum "This function draws an ellipse border with the desired radiuses a b and color with its center at x, y.\n" \ "It uses the Bresenham algorithm.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 a, s32 b, u8 color) \ \ @@ -584,6 +654,8 @@ enum \ "This function draws a triangle filled with color, using the supplied vertices.", \ 7, \ + 7, \ + 0, \ void, \ tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) \ \ @@ -592,6 +664,8 @@ enum \ "This function draws a triangle border with color, using the supplied vertices.", \ 7, \ + 7, \ + 0, \ void, \ tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) \ \ @@ -609,6 +683,8 @@ enum "with U and V addressing its pixels directly, rather than by sprite ID.\n" \ "So for example the top left corner of sprite #2 would be located at u=16, v=0.", \ 14, \ + 12, \ + 0, \ void, \ tic_mem*, float x1, float y1, float x2, float y2, float x3, float y3, \ float u1, float v1, float u2, float v2, float u3, float v3, bool use_map, u8* colors, s32 count) \ @@ -621,6 +697,8 @@ enum "Things drawn outside of this area will not be visible.\n" \ "Calling clip() with no parameters will reset the drawing area to the entire screen.", \ 4, \ + 4, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height) \ \ @@ -631,6 +709,8 @@ enum "This function starts playing a track created in the Music Editor.\n" \ "Call without arguments to stop the music.", \ 7, \ + 0, \ + 0, \ void, \ tic_mem*, s32 track, s32 frame, s32 row, bool loop, bool sustain, s32 tempo, s32 speed) \ \ @@ -647,6 +727,8 @@ enum "This resets the whole runtime memory to the contents of bank 0." \ "Note that sync is not used to load code from banks; this is done automatically.", \ 3, \ + 0, \ + 0, \ void, \ tic_mem*, u32 mask, s32 bank, bool toCart) \ \ @@ -656,6 +738,8 @@ enum \ "VRAM contains 2x16K memory chips, use vbank(0) or vbank(1) to switch between them.", \ 1, \ + 1, \ + 0, \ s32, \ tic_mem*, s32 bank) \ \ @@ -665,6 +749,8 @@ enum \ "Resets the cartridge. To return to the console, see the `exit()`.", \ 0, \ + 0, \ + 0, \ void, \ tic_mem*) \ \ @@ -674,6 +760,8 @@ enum \ "The function returns true if the key denoted by keycode is pressed.", \ 1, \ + 0, \ + 0, \ bool, \ tic_mem*, tic_key key) \ \ @@ -684,6 +772,8 @@ enum "This function returns true if the given key is pressed but wasn't pressed in the previous frame.\n" \ "Refer to `btnp()` for an explanation of the optional hold and period parameters.", \ 3, \ + 0, \ + 0, \ bool, \ tic_mem*, tic_key key, s32 hold, s32 period) \ \ @@ -693,6 +783,8 @@ enum \ "Returns true if the specified flag of the sprite is set. See `fset()` for more details.", \ 2, \ + 2, \ + 0, \ bool, \ tic_mem*, s32 index, u8 flag) \ \ @@ -705,10 +797,12 @@ enum "flag 6 might indicate that the flag should be draw scaled etc.\n" \ "See algo `fget()`.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 index, u8 flag, bool value) -#define TIC_API_DEF(name, _, __, ___, ret, ...) ret tic_api_##name(__VA_ARGS__); +#define TIC_API_DEF(name, _, __, ___, ____, _____, ret, ...) ret tic_api_##name(__VA_ARGS__); TIC_API_LIST(TIC_API_DEF) #undef TIC_API_DEF diff --git a/src/api/mrb.c b/src/api/mrb.c new file mode 100644 index 000000000..f922d10dd --- /dev/null +++ b/src/api/mrb.c @@ -0,0 +1,1233 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com +// Copyright (c) 2020-2021 Jeremiasz Nelz + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include "core/core.h" + +#if defined(TIC_BUILD_WITH_MRUBY) + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + struct mrb_state* mrb; + struct mrbc_context* mrb_cxt; +} mrbVm; + +static tic_core* CurrentMachine = NULL; +static inline tic_core* getMRubyMachine(mrb_state* mrb) +{ + return CurrentMachine; +} + +static mrb_value mrb_peek(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_int bits = BITS_IN_BYTE; + mrb_get_args(mrb, "i|i", &address, &bits); + + return mrb_fixnum_value(tic_api_peek(tic, address, bits)); +} + +static mrb_value mrb_poke(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_int bits = BITS_IN_BYTE; + mrb_get_args(mrb, "ii|i", &address, &value, &bits); + + tic_api_poke(tic, address, value, bits); + + return mrb_nil_value(); +} + +static mrb_value mrb_peek1(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_get_args(mrb, "i", &address); + + return mrb_fixnum_value(tic_api_peek1(tic, address)); +} + +static mrb_value mrb_poke1(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_get_args(mrb, "ii", &address, &value); + + tic_api_poke1(tic, address, value); + + return mrb_nil_value(); +} + +static mrb_value mrb_peek2(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_get_args(mrb, "i", &address); + + return mrb_fixnum_value(tic_api_peek2(tic, address)); +} + +static mrb_value mrb_poke2(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_get_args(mrb, "ii", &address, &value); + + tic_api_poke2(tic, address, value); + + return mrb_nil_value(); +} + +static mrb_value mrb_peek4(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_get_args(mrb, "i", &address); + + return mrb_fixnum_value(tic_api_peek4(tic, address)); +} + +static mrb_value mrb_poke4(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_get_args(mrb, "ii", &address, &value); + + tic_api_poke4(tic, address, value); + + return mrb_nil_value(); +} + +static mrb_value mrb_cls(mrb_state* mrb, mrb_value self) +{ + mrb_int color = 0; + mrb_get_args(mrb, "|i", &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_cls(memory, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_pix(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, color; + mrb_int argc = mrb_get_args(mrb, "ii|i", &x, &y, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if(argc == 3) + { + tic_api_pix(memory, x, y, color, false); + return mrb_nil_value(); + } + else + { + return mrb_fixnum_value(tic_api_pix(memory, x, y, 0, true)); + } +} + +static mrb_value mrb_line(mrb_state* mrb, mrb_value self) +{ + mrb_int x0, y0, x1, y1, color; + mrb_get_args(mrb, "iiiii", &x0, &y0, &x1, &y1, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_line(memory, x0, y0, x1, y1, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_rect(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, w, h, color; + mrb_get_args(mrb, "iiiii", &x, &y, &w, &h, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_rect(memory, x, y, w, h, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_rectb(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, w, h, color; + mrb_get_args(mrb, "iiiii", &x, &y, &w, &h, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_rectb(memory, x, y, w, h, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_circ(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, radius, color; + mrb_get_args(mrb, "iiii", &x, &y, &radius, &color); + + if(radius >= 0) { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_circ(memory, x, y, radius, color); + } else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "radius must be greater than or equal 0"); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_circb(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, radius, color; + mrb_get_args(mrb, "iiii", &x, &y, &radius, &color); + + if(radius >= 0) { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_circb(memory, x, y, radius, color); + } else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "radius must be greater than or equal 0"); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_elli(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, a, b, color; + mrb_get_args(mrb, "iiiii", &x, &y, &a, &b, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_elli(memory, x, y, a, b, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_ellib(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, a, b, color; + mrb_get_args(mrb, "iiiii", &x, &y, &a, &b, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_ellib(memory, x, y, a, b, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_tri(mrb_state* mrb, mrb_value self) +{ + mrb_int x1, y1, x2, y2, x3, y3, color; + mrb_get_args(mrb, "iiiiiii", &x1, &y1, &x2, &y2, &x3, &y3, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_tri(memory, x1, y1, x2, y2, x3, y3, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_trib(mrb_state* mrb, mrb_value self) +{ + mrb_int x1, y1, x2, y2, x3, y3, color; + mrb_get_args(mrb, "iiiiiii", &x1, &y1, &x2, &y2, &x3, &y3, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_trib(memory, x1, y1, x2, y2, x3, y3, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_textri(mrb_state* mrb, mrb_value self) +{ + mrb_value chroma = mrb_fixnum_value(0xff); + mrb_bool use_map = false; + mrb_int x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3; + mrb_int argc = mrb_get_args(mrb, "iiiiiiiiiiii|bo", + &x1, &y1, &x2, &y2, &x3, &y3, + &u1, &v1, &u2, &v2, &u3, &v3, + &use_map, &chroma); + + mrb_int count; + u8 *chromas; + if (mrb_array_p(chroma)) + { + count = ARY_LEN(RARRAY(chroma)); + chromas = malloc(count * sizeof(u8)); + + for (mrb_int i = 0; i < count; ++i) + { + chromas[i] = mrb_integer(mrb_ary_entry(chroma, i)); + } + } + else + { + count = 1; + chromas = malloc(sizeof(u8)); + chromas[0] = mrb_integer(chroma); + } + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_textri(memory, + x1, y1, x2, y2, x3, y3, + u1, v1, u2, v2, u3, v3, + use_map, chromas, count); + + free(chromas); + + return mrb_nil_value(); +} + + +static mrb_value mrb_clip(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, w, h; + mrb_int argc = mrb_get_args(mrb, "|iiii", &x, &y, &w, &h); + + if(argc == 0) + { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + } + else if(argc == 4) + { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_clip((tic_mem*)getMRubyMachine(mrb), x, y, w, h); + } + else mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid parameters, use clip(x,y,w,h) or clip()"); + + return mrb_nil_value(); +} + +static mrb_value mrb_btnp(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* memory = (tic_mem*)machine; + + mrb_int index, hold, period; + mrb_int argc = mrb_get_args(mrb, "|iii", &index, &hold, &period); + + index &= 0x1f; + + if (argc == 0) + { + return mrb_fixnum_value(tic_api_btnp(memory, -1, -1, -1)); + } + else if(argc == 1) + { + return mrb_bool_value(tic_api_btnp(memory, index, -1, -1)); + } + else if (argc == 3) + { + return mrb_bool_value(tic_api_btnp(memory, index, hold, period)); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid params, btnp [ id [ hold period ] ]"); + return mrb_nil_value(); + } +} + +static mrb_value mrb_btn(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + + mrb_int index, hold, period; + mrb_int argc = mrb_get_args(mrb, "|i", &index, &hold, &period); + + index &= 0x1f; + + if (argc == 0) + { + return mrb_fixnum_value(machine->memory.ram.input.gamepads.data); + } + else if (argc == 1) + { + return mrb_bool_value(machine->memory.ram.input.gamepads.data & (1 << index)); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid params, btn [ id ]\n"); + return mrb_nil_value(); + } +} + +static mrb_value mrb_spr(mrb_state* mrb, mrb_value self) +{ + mrb_int index, x, y; + mrb_int w = 1, h = 1, scale = 1; + mrb_int flip = tic_no_flip, rotate = tic_no_rotate; + mrb_value colors_obj; + static u8 colors[TIC_PALETTE_SIZE]; + mrb_int count = 0; + + mrb_int argc = mrb_get_args(mrb, "iii|oiiiii", &index, &x, &y, &colors_obj, &scale, &flip, &rotate, &w, &h); + + if(mrb_array_p(colors_obj)) + { + for(; count < TIC_PALETTE_SIZE && count < ARY_LEN(RARRAY(colors_obj)); count++) // HACK + colors[count] = (u8) mrb_int(mrb, mrb_ary_entry(colors_obj, count)); + count++; + } + else if(mrb_fixnum_p(colors_obj)) + { + colors[0] = mrb_int(mrb, colors_obj); + count = 1; + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "color must be either an array or a palette index"); + return mrb_nil_value(); + } + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_spr(memory, index, x, y, w, h, colors, count, scale, flip, rotate); + + return mrb_nil_value(); +} + +static mrb_value mrb_mget(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y; + mrb_get_args(mrb, "ii", &x, &y); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + u8 value = tic_api_mget(memory, x, y); + return mrb_fixnum_value(value); +} + +static mrb_value mrb_mset(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, val; + mrb_get_args(mrb, "iii", &x, &y, &val); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_mset(memory, x, y, val); + + return mrb_nil_value(); +} + +static mrb_value mrb_tstamp(mrb_state* mrb, mrb_value self) +{ + tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); + + return mrb_fixnum_value(tic_api_tstamp(tic)); +} + +static mrb_value mrb_vbank(mrb_state* mrb, mrb_value self) +{ + tic_core *core = getMRubyMachine(mrb); + tic_mem *tic = (tic_mem*)core; + + s32 prev = core->state.vbank.id; + + mrb_int vbank; + mrb_int argc = mrb_get_args(mrb, "|i", &vbank); + + if (argc >= 1) + { + tic_api_vbank(tic, vbank); + } + + return mrb_fixnum_value(prev); +} + +static mrb_value mrb_fget(mrb_state* mrb, mrb_value self) +{ + mrb_int index, flag; + mrb_get_args(mrb, "ii", &index, &flag); + + tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); + + return mrb_bool_value(tic_api_fget(tic, index, flag)); +} + +static mrb_value mrb_fset(mrb_state* mrb, mrb_value self) +{ + mrb_int index, flag; + mrb_bool value; + mrb_get_args(mrb, "iib", &index, &flag, &value); + + tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); + + tic_api_fset(tic, index, flag, value); + + return mrb_nil_value(); +} + +typedef struct +{ + mrb_state* mrb; + mrb_value block; +} RemapData; + +static void remapCallback(void* data, s32 x, s32 y, RemapResult* result) +{ + RemapData* remap = (RemapData*)data; + mrb_state* mrb = remap->mrb; + + mrb_value vals[] = { + mrb_fixnum_value(result->index), + mrb_fixnum_value(x), + mrb_fixnum_value(y) + }; + mrb_value out = mrb_yield_argv(mrb, remap->block, 3, vals); + + if (mrb_array_p(out)) + { + mrb_int len = ARY_LEN(RARRAY(out)); + if (len > 3) len = 3; + switch (len) + { + case 3: + result->rotate = mrb_int(mrb, mrb_ary_entry(out, 2)); + case 2: + result->flip = mrb_int(mrb, mrb_ary_entry(out, 1)); + case 1: + result->index = mrb_int(mrb, mrb_ary_entry(out, 0)); + } + } + else + { + result->index = mrb_int(mrb, out); + } +} + +static mrb_value mrb_map(mrb_state* mrb, mrb_value self) +{ + mrb_int x = 0; + mrb_int y = 0; + mrb_int w = TIC_MAP_SCREEN_WIDTH; + mrb_int h = TIC_MAP_SCREEN_HEIGHT; + mrb_int sx = 0; + mrb_int sy = 0; + mrb_value chroma; + mrb_int scale = 1; + mrb_value block; + + mrb_int argc = mrb_get_args(mrb, "|iiiiiioi&", &x, &y, &w, &h, &sx, &sy, &chroma, &scale, &block); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + mrb_int count; + u8 *chromas; + + if (mrb_array_p(chroma)) + { + count = ARY_LEN(RARRAY(chroma)); + chromas = malloc(count * sizeof(u8)); + + for (mrb_int i = 0; i < count; ++i) + { + chromas[i] = mrb_integer(mrb_ary_entry(chroma, i)); + } + } + else + { + count = 1; + chromas = malloc(sizeof(u8)); + chromas[0] = mrb_integer(chroma); + } + + if (mrb_proc_p(block)) + { + RemapData data = { mrb, block }; + tic_api_map(memory, x, y, w, h, sx, sy, chromas, count, scale, remapCallback, &data); + } + else + { + tic_api_map(memory, x, y, w, h, sx, sy, chromas, count, scale, NULL, NULL); + } + + free(chromas); + + return mrb_nil_value(); +} + +static mrb_value mrb_music(mrb_state* mrb, mrb_value self) +{ + mrb_int track = 0; + mrb_int frame = -1; + mrb_int row = -1; + bool loop = true; + bool sustain = false; + mrb_int tempo = -1; + mrb_int speed = -1; + + mrb_int argc = mrb_get_args(mrb, "|iiibbii", &track, &frame, &row, &loop, &sustain, &tempo, &speed); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_music(memory, -1, 0, 0, false, false, -1, -1); + + if(track >= 0) + { + tic_api_music(memory, track, frame, row, loop, sustain, tempo, speed); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_sfx(mrb_state* mrb, mrb_value self) +{ + mrb_int index; + + mrb_value note_obj; + s32 note = -1; + mrb_int octave = -1; + mrb_int duration = -1; + mrb_int channel = 0; + mrb_value volume = mrb_int_value(mrb, MAX_VOLUME); + mrb_int volumes[TIC_STEREO_CHANNELS]; + mrb_int speed = SFX_DEF_SPEED; + + mrb_int argc = mrb_get_args(mrb, "i|oiio!i", &index, ¬e_obj, &duration, &channel, &volume, &speed); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if (mrb_array_p(volume)) + { + for (mrb_int i = 0; i < TIC_STEREO_CHANNELS; ++i) + { + volumes[i] = mrb_integer(mrb_ary_entry(volume, i)); + } + } + else if (mrb_fixnum_p(volume)) + { + for (size_t ch = 0; ch < TIC_STEREO_CHANNELS; ++ch) + { + volumes[ch] = mrb_integer(volume); + } + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "volume must be an integer or a array of integers per channel"); + return mrb_nil_value(); + } + + if(index < SFX_COUNT) + { + if (index >= 0) + { + tic_sample* effect = memory->ram.sfx.samples.data + index; + + note = effect->note; + octave = effect->octave; + speed = effect->speed; + } + + if (argc >= 2) + { + if (mrb_fixnum_p(note_obj)) + { + mrb_int id = mrb_integer(note_obj); + note = id % NOTES; + octave = id / NOTES; + } + else if (mrb_string_p(note_obj)) + { + const char* noteStr = mrb_str_to_cstr(mrb, mrb_funcall(mrb, note_obj, "to_s", 0)); + + s32 octave32; + if (!tic_tool_parse_note(noteStr, ¬e, &octave32)) + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid note, should be like C#4"); + return mrb_nil_value(); + } + octave = octave32; + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "note must be either an integer number or a string like \"C#4\""); + return mrb_nil_value(); + } + } + + if (channel >= 0 && channel < TIC_SOUND_CHANNELS) + { + tic_api_sfx(memory, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); + } + else mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown channel"); + } + else mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown sfx index"); + + return mrb_nil_value(); +} + +static mrb_value mrb_sync(mrb_state* mrb, mrb_value self) +{ + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + mrb_int mask = 0; + mrb_int bank = 0; + mrb_bool toCart = false; + + mrb_int argc = mrb_get_args(mrb, "|iib", &mask, &bank, &toCart); + + if(bank >= 0 && bank < TIC_BANKS) + tic_api_sync(memory, mask, bank, toCart); + else + mrb_raise(mrb, E_ARGUMENT_ERROR, "sync() error, invalid bank"); + + return mrb_nil_value(); +} + +static mrb_value mrb_reset(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + + machine->state.initialized = false; + + return mrb_nil_value(); +} + +static mrb_value mrb_key(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = &machine->memory; + + mrb_int key; + mrb_int argc = mrb_get_args(mrb, "|i", &key); + + if (argc == 0) + return mrb_bool_value(tic_api_key(tic, tic_key_unknown)); + else + { + if(key < tic_key_escape) + return mrb_bool_value(tic_api_key(tic, key)); + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown keyboard code"); + return mrb_nil_value(); + } + } +} + +static mrb_value mrb_keyp(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* memory = (tic_mem*)machine; + + mrb_int key, hold, period; + mrb_int argc = mrb_get_args(mrb, "|iii", &key, &hold, &period); + + if (argc == 0) + { + return mrb_fixnum_value(tic_api_keyp(memory, -1, -1, -1)); + } + else if (key >= tic_key_escape) + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown keyboard code"); + } + else if(argc == 1) + { + return mrb_bool_value(tic_api_keyp(memory, key, -1, -1)); + } + else if (argc == 3) + { + return mrb_bool_value(tic_api_keyp(memory, key, hold, period)); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid params, btnp [ id [ hold period ] ]"); + return mrb_nil_value(); + } +} + +static mrb_value mrb_memcpy(mrb_state* mrb, mrb_value self) +{ + mrb_int dest, src, size; + mrb_int argc = mrb_get_args(mrb, "iii", &dest, &src, &size); + + s32 bound = sizeof(tic_ram) - size; + + if(size >= 0 && size <= sizeof(tic_ram) && dest >= 0 && src >= 0 && dest <= bound && src <= bound) + { + u8* base = (u8*)&getMRubyMachine(mrb)->memory; + memcpy(base + dest, base + src, size); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "memory address not in range!"); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_memset(mrb_state* mrb, mrb_value self) +{ + mrb_int dest, value, size; + mrb_int argc = mrb_get_args(mrb, "iii", &dest, &value, &size); + + s32 bound = sizeof(tic_ram) - size; + + if(size >= 0 && size <= sizeof(tic_ram) && dest >= 0 && dest <= bound) + { + u8* base = (u8*)&getMRubyMachine(mrb)->memory; + memset(base + dest, value, size); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "memory address not in range!"); + } + + return mrb_nil_value(); +} + +static char* mrb_value_to_cstr(mrb_state* mrb, mrb_value value) +{ + mrb_value str = mrb_funcall(mrb, value, "to_s", 0); + return mrb_str_to_cstr(mrb, str); +} + +static mrb_value mrb_font(mrb_state* mrb, mrb_value self) +{ + mrb_value text_obj; + mrb_int x = 0; + mrb_int y = 0; + mrb_int width = TIC_SPRITESIZE; + mrb_int height = TIC_SPRITESIZE; + mrb_int chromakey = 0; + mrb_bool fixed = false; + mrb_int scale = 1; + mrb_bool alt = false; + mrb_get_args(mrb, "S|iiiiibib", + &text_obj, &x, &y, &chromakey, + &width, &height, &fixed, &scale, &alt); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if(scale == 0) + return mrb_fixnum_value(0); + + const char* text = mrb_value_to_cstr(mrb, text_obj); + + s32 size = tic_api_font(memory, text, x, y, width, height, chromakey, scale, fixed, alt); + return mrb_fixnum_value(size); +} + +static mrb_value mrb_print(mrb_state* mrb, mrb_value self) +{ + mrb_value text_obj; + mrb_int x = 0; + mrb_int y = 0; + mrb_int color = TIC_PALETTE_SIZE-1; + mrb_bool fixed = false; + mrb_int scale = 1; + mrb_bool alt = false; + mrb_get_args(mrb, "S|iiibib", + &text_obj, &x, &y, &color, + &fixed, &scale, &alt); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if(scale == 0) + return mrb_fixnum_value(0); + + const char* text = mrb_str_to_cstr(mrb, text_obj); + + s32 size = tic_api_print(memory, text, x, y, color, fixed, scale, alt); + return mrb_fixnum_value(size); +} + +static mrb_value mrb_trace(mrb_state *mrb, mrb_value self) +{ + mrb_value text_obj; + mrb_int color = TIC_DEFAULT_COLOR; + mrb_get_args(mrb, "S|i", &text_obj, &color); + + tic_core* machine = getMRubyMachine(mrb); + + const char* text = mrb_value_to_cstr(mrb, text_obj); + machine->data->trace(machine->data->data, text, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_pmem(mrb_state *mrb, mrb_value self) +{ + mrb_int index, value; + mrb_int argc = mrb_get_args(mrb, "i|i", &index, &value); + + tic_core* machine = getMRubyMachine(mrb); + tic_mem* memory = &machine->memory; + + if(index < TIC_PERSISTENT_SIZE) + { + u32 val = tic_api_pmem((tic_mem*)machine, index, 0, false); + + if(argc == 2) + { + u32 val = tic_api_pmem((tic_mem*)machine, index, value, true); + } + + return mrb_fixnum_value(val); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid persistent memory index"); + + return mrb_nil_value(); + } +} + +static mrb_value mrb_time(mrb_state *mrb, mrb_value self) +{ + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + return mrb_float_value(mrb, tic_api_time(memory)); +} + +static mrb_value mrb_exit(mrb_state *mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + machine->data->exit(machine->data->data); + + return mrb_nil_value(); +} + +static mrb_value mrb_mouse(mrb_state *mrb, mrb_value self) +{ + mrb_value sym_x = mrb_symbol_value(mrb_intern_cstr(mrb, "x")); + mrb_value sym_y = mrb_symbol_value(mrb_intern_cstr(mrb, "y")); + mrb_value sym_left = mrb_symbol_value(mrb_intern_cstr(mrb, "left")); + mrb_value sym_middle = mrb_symbol_value(mrb_intern_cstr(mrb, "middle")); + mrb_value sym_right = mrb_symbol_value(mrb_intern_cstr(mrb, "right")); + + tic_core* machine = getMRubyMachine(mrb); + + const tic80_mouse* mouse = &machine->memory.ram.input.mouse; + + mrb_value hash = mrb_hash_new(mrb); + + mrb_hash_set(mrb, hash, sym_x, mrb_fixnum_value(mouse->x)); + mrb_hash_set(mrb, hash, sym_y, mrb_fixnum_value(mouse->y)); + mrb_hash_set(mrb, hash, sym_left, mrb_bool_value(mouse->left)); + mrb_hash_set(mrb, hash, sym_middle, mrb_bool_value(mouse->middle)); + mrb_hash_set(mrb, hash, sym_right, mrb_bool_value(mouse->right)); + + return hash; +} + +static void closeMRuby(tic_mem* tic) +{ + tic_core* machine = (tic_core*)tic; + + if(machine->currentVM) + { + mrbVm *currentVM = (mrbVm*)machine->currentVM; + mrbc_context_free(currentVM->mrb, currentVM->mrb_cxt); + mrb_close(currentVM->mrb); + currentVM->mrb_cxt = NULL; + currentVM->mrb = NULL; + + free(currentVM); + CurrentMachine = machine->currentVM = NULL; + } +} + +static mrb_bool catcherr(tic_core* machine) +{ + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; + if (mrb->exc) + { + mrb_value ex = mrb_obj_value(mrb->exc); + mrb_value bt = mrb_exc_backtrace(mrb, ex); + if (!mrb_array_p(bt)) + bt = mrb_get_backtrace(mrb); + mrb_value insp = mrb_inspect(mrb, ex); + mrb_ary_unshift(mrb, bt, insp); + mrb_value msg = mrb_ary_join(mrb, bt, mrb_str_new_cstr(mrb, "\n")); + char* cmsg = mrb_str_to_cstr(mrb, msg); + machine->data->error(machine->data->data, cmsg); + mrb->exc = NULL; + + return false; + } + + return true; +} + +static bool initMRuby(tic_mem* tic, const char* code) +{ + tic_core* machine = (tic_core*)tic; + + closeMRuby(tic); + + CurrentMachine = machine; + + machine->currentVM = malloc(sizeof(mrbVm)); + mrbVm *currentVM = (mrbVm*)machine->currentVM; + + mrb_state* mrb = currentVM->mrb = mrb_open(); + mrbc_context* mrb_cxt = currentVM->mrb_cxt = mrbc_context_new(mrb); + mrb_cxt->capture_errors = 1; + mrbc_filename(mrb, mrb_cxt, "user code"); + +#define API_FUNC_DEF(name, _, __, nparam, nrequired, callback, ...) {mrb_ ## name, nrequired, (nparam - nrequired), callback, #name}, + static const struct{mrb_func_t func; s32 nrequired; s32 noptional; bool block; const char* name;} ApiItems[] = {TIC_API_LIST(API_FUNC_DEF)}; +#undef API_FUNC_DEF + + for (s32 i = 0; i < COUNT_OF(ApiItems); ++i) + { + mrb_aspec args = MRB_ARGS_NONE(); + if (ApiItems[i].nrequired > 0) + args |= MRB_ARGS_REQ(ApiItems[i].nrequired); + if (ApiItems[i].noptional > 0) + args |= MRB_ARGS_OPT(ApiItems[i].noptional); + if (ApiItems[i].block) + args |= MRB_ARGS_BLOCK(); + + mrb_define_method(mrb, mrb->kernel_module, ApiItems[i].name, ApiItems[i].func, args); + } + + mrb_load_string_cxt(mrb, code, mrb_cxt); + return catcherr(machine); +} + +static void evalMRuby(tic_mem* tic, const char* code) { + tic_core* machine = (tic_core*)tic; + + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb = mrb_open(); + + if (!mrb) + return; + + if (((mrbVm*)machine->currentVM)->mrb_cxt) + { + mrbc_context_free(mrb, ((mrbVm*)machine->currentVM)->mrb_cxt); + } + + mrbc_context* mrb_cxt = ((mrbVm*)machine->currentVM)->mrb_cxt = mrbc_context_new(mrb); + mrb_load_string_cxt(mrb, code, mrb_cxt); + catcherr(machine); +} + +static void callMRubyTick(tic_mem* tic) +{ + tic_core* machine = (tic_core*)tic; + const char* TicFunc = TIC_FN; + const char* OvrFunc = OVR_FN; + + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; + + if(mrb) + { + if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, TicFunc))) + { + mrb_funcall(mrb, mrb_top_self(mrb), TicFunc, 0); + catcherr(machine); + + if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, OvrFunc))) + { + OVR(tic) + { + mrb_funcall(mrb, mrb_top_self(mrb), OvrFunc, 0); + catcherr(machine); + } + } + } + else + { + machine->data->error(machine->data->data, "'def TIC...' isn't found :("); + } + } +} + +static void callMRubyScanlineName(tic_mem* memory, s32 row, void* data, const char* name) +{ + tic_core* machine = (tic_core*)memory; + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; + + if (mrb && mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, name))) + { + mrb_funcall(mrb, mrb_top_self(mrb), name, 1, mrb_fixnum_value(row)); + catcherr(machine); + } +} + +static void callMRubyScanline(tic_mem* memory, s32 row, void* data) +{ + callMRubyScanlineName(memory, row, data, SCN_FN); + + callMRubyScanlineName(memory, row, data, "scanline"); +} + +static void callMRubyBorder(tic_mem* memory, s32 row, void* data) +{ + callMRubyScanlineName(memory, row, data, BDR_FN); +} + +/** + * External Resources + * ================== + * + * [Outdated official documentation regarding syntax](https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#resword) + * [Ruby for dummies reserved word listing](https://www.dummies.com/programming/ruby/rubys-reserved-words/) + */ +static const char* const MRubyKeywords [] = +{ + "BEGIN", "class", "ensure", "nil", "self", "when", + "END", "def", "false", "not", "super", "while", + "alias", "defined", "for", "or", "then", "yield", + "and", "do", "if", "redo", "true", + "begin", "else", "in", "rescue", "undef", + "break", "elsif", "module", "retry", "unless", + "case", "end", "next", "return", "until", + "__FILE__", "__LINE__" +}; + +static inline bool isalnum_(char c) {return isalnum(c) || c == '_' || c == '?' || c == '=' || c == '!';} + +static const tic_outline_item* getMRubyOutline(const char* code, s32* size) +{ + enum{Size = sizeof(tic_outline_item)}; + + *size = 0; + + static tic_outline_item* items = NULL; + + if(items) + { + free(items); + items = NULL; + } + + const char* ptr = code; + + while(true) + { + static const char FuncString[] = "def "; + + ptr = strstr(ptr, FuncString); + + if(ptr) + { + ptr += sizeof FuncString - 1; + + const char* start = ptr; + const char* end = start; + + while(*ptr) + { + char c = *ptr; + + if(isalnum_(c) || c == ' '); + else if(c == '(' || c == '\n') + { + end = ptr; + break; + } + else break; + + ptr++; + } + + if(end > start) + { + items = items ? realloc(items, (*size + 1) * Size) : malloc(Size); + + items[*size].pos = start - code; + items[*size].size = end - start; + + (*size)++; + } + } + else break; + } + + return items; +} + +const tic_script_config MRubySyntaxConfig = +{ + .name = "ruby", + .fileExtension = ".rb", + .projectComment = "#", + .init = initMRuby, + .close = closeMRuby, + .tick = callMRubyTick, + + .callback = + { + .scanline = callMRubyScanline, + .border = callMRubyBorder, + }, + + .getOutline = getMRubyOutline, + .eval = evalMRuby, + + .blockCommentStart = "=begin", + .blockCommentEnd = "=end", + .blockCommentStart2 = NULL, + .blockCommentEnd2 = NULL, + .singleComment = "#", + .blockStringStart = NULL, + .blockStringEnd = NULL, + + .keywords = MRubyKeywords, + .keywordsCount = COUNT_OF(MRubyKeywords), +}; + +#endif /* defined(TIC_BUILD_WITH_MRUBY) */ diff --git a/src/core/languages.c b/src/core/languages.c index be30a486e..06dcd96e8 100644 --- a/src/core/languages.c +++ b/src/core/languages.c @@ -1,6 +1,10 @@ #include #include "api.h" +#if defined(TIC_BUILD_WITH_MRUBY) +extern tic_script_config MRubySyntaxConfig; +#endif + #if defined(TIC_BUILD_WITH_JS) extern tic_script_config JsSyntaxConfig; #endif @@ -31,6 +35,10 @@ tic_script_config* Languages[] = { &LuaSyntaxConfig, #endif + #if defined(TIC_BUILD_WITH_MRUBY) + &MRubySyntaxConfig, + #endif + #if defined(TIC_BUILD_WITH_JS) &JsSyntaxConfig, #endif diff --git a/src/studio/demos.c b/src/studio/demos.c index 44cb1b915..2708d0ddf 100644 --- a/src/studio/demos.c +++ b/src/studio/demos.c @@ -88,6 +88,29 @@ tic_script_config_extra JsSyntaxConfigExtra = #endif +#if defined(TIC_BUILD_WITH_MRUBY) + +static const u8 RubyDemoRom[] = +{ + #include "../build/assets/rubydemo.tic.dat" +}; + +static const u8 rubymark[] = +{ + #include "../build/assets/rubymark.tic.dat" +}; + +tic_script_config_extra RubySyntaxConfigExtra = +{ + .name = "ruby", + .demoRom = RubyDemoRom, + .demoRomSize = sizeof RubyDemoRom, + .markRom = rubymark, + .markRomSize = sizeof rubymark, +}; + +#endif + #if defined(TIC_BUILD_WITH_WREN) static const u8 WrenDemoRom[] = @@ -163,6 +186,9 @@ tic_script_config_extra* LanguagesExtra[] = { #endif #if defined(TIC_BUILD_WITH_JS) &JsSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_MRUBY) + &RubySyntaxConfigExtra, #endif NULL }; diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb new file mode 100644 index 000000000..6f0051c40 --- /dev/null +++ b/tic_mruby_build_config.rb @@ -0,0 +1,81 @@ +MRuby::Build.new do |conf| + # load specific toolchain settings + conf.toolchain + + # Use mrbgems + # conf.gem 'examples/mrbgems/ruby_extension_example' + # conf.gem 'examples/mrbgems/c_extension_example' do |g| + # g.cc.flags << '-g' # append cflags in this gem + # end + # conf.gem 'examples/mrbgems/c_and_ruby_extension_example' + # conf.gem :core => 'mruby-eval' + # conf.gem :mgem => 'mruby-onig-regexp' + # conf.gem :github => 'mattn/mruby-onig-regexp' + # conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v' + + # include the GEM box + conf.gembox 'default' + + # C compiler settings + conf.cc do |cc| + cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + # cc.command = ENV['CC'] || 'gcc' + # cc.flags = [ENV['CFLAGS'] || %w()] + # cc.include_paths = ["#{root}/include"] + # cc.defines = %w() + # cc.option_include_path = %q[-I"%s"] + # cc.option_define = '-D%s' + # cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] + end + + # mrbc settings + # conf.mrbc do |mrbc| + # mrbc.compile_options = "-g -B%{funcname} -o-" # The -g option is required for line numbers + # end + + # Linker settings + # conf.linker do |linker| + # linker.command = ENV['LD'] || 'gcc' + # linker.flags = [ENV['LDFLAGS'] || []] + # linker.flags_before_libraries = [] + # linker.libraries = %w() + # linker.flags_after_libraries = [] + # linker.library_paths = [] + # linker.option_library = '-l%s' + # linker.option_library_path = '-L%s' + # linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}" + # end + + # Archiver settings + # conf.archiver do |archiver| + # archiver.command = ENV['AR'] || 'ar' + # archiver.archive_options = 'rs "%{outfile}" %{objs}' + # end + + # Parser generator settings + # conf.yacc do |yacc| + # yacc.command = ENV['YACC'] || 'bison' + # yacc.compile_options = %q[-o "%{outfile}" "%{infile}"] + # end + + # gperf settings + # conf.gperf do |gperf| + # gperf.command = 'gperf' + # gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"] + # end + + # file extensions + # conf.exts do |exts| + # exts.object = '.o' + # exts.executable = '' # '.exe' if Windows + # exts.library = '.a' + # end + + # file separator + # conf.file_separator = '/' + + # Turn on `enable_debug` for better debugging + # conf.enable_debug + conf.enable_bintest + conf.enable_test +end From fab63db9d85f5c50a396b131073e807b773dd47b Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sun, 5 Dec 2021 16:49:46 +0100 Subject: [PATCH 117/379] Create Ruby demos --- build/assets/rubydemo.tic.dat | 1 + build/assets/rubymark.tic.dat | 1 + demos/bunny/rubymark.rb | 120 ++++++++++++++++++++++++++++++++++ demos/rubydemo.rb | 46 +++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 build/assets/rubydemo.tic.dat create mode 100644 build/assets/rubymark.tic.dat create mode 100644 demos/bunny/rubymark.rb create mode 100644 demos/rubydemo.rb diff --git a/build/assets/rubydemo.tic.dat b/build/assets/rubydemo.tic.dat new file mode 100644 index 000000000..b273d5692 --- /dev/null +++ b/build/assets/rubydemo.tic.dat @@ -0,0 +1 @@ +0x78, 0xda, 0xe3, 0x31, 0x60, 0x60, 0x58, 0x78, 0xe8, 0xe8, 0xa5, 0xd2, 0xdb, 0xc2, 0x4f, 0xed, 0xbe, 0x5f, 0xad, 0xff, 0x73, 0x3d, 0xaa, 0x9e, 0x9d, 0xb9, 0xbb, 0xcc, 0x29, 0x5c, 0x7c, 0xd2, 0xe4, 0xb4, 0xcf, 0x5b, 0xef, 0x4c, 0x91, 0xca, 0x4f, 0xb7, 0xfb, 0x5f, 0xef, 0xef, 0xef, 0xe9, 0xcd, 0xa3, 0x9a, 0x76, 0x22, 0xd9, 0xf8, 0x28, 0x3b, 0xd7, 0x39, 0x06, 0x06, 0xe7, 0xd4, 0xf6, 0x95, 0xa7, 0xdf, 0xfe, 0xbf, 0xb7, 0x67, 0x56, 0x45, 0x98, 0x89, 0x10, 0xc3, 0x90, 0x03, 0x21, 0x65, 0x33, 0x76, 0xdd, 0xf9, 0x27, 0x60, 0x04, 0xa1, 0x19, 0xed, 0x19, 0x18, 0x56, 0x71, 0x9d, 0x39, 0xb7, 0x8a, 0xeb, 0xcd, 0x3a, 0x28, 0xee, 0xeb, 0x38, 0xf1, 0x86, 0x8f, 0xe1, 0xcc, 0xbb, 0x73, 0x67, 0xde, 0xbc, 0x03, 0x69, 0xe0, 0x3b, 0x03, 0x04, 0x3d, 0x1d, 0x1d, 0x27, 0x56, 0xad, 0x5a, 0x75, 0xaa, 0x0b, 0x48, 0x9f, 0x02, 0xf2, 0x4f, 0xf1, 0xc0, 0x31, 0xa7, 0x2d, 0x45, 0xee, 0x31, 0x70, 0x60, 0xe5, 0x67, 0x64, 0x50, 0x56, 0x28, 0xc9, 0x2c, 0xc9, 0x49, 0xb5, 0x52, 0x50, 0x48, 0x4f, 0xcc, 0x4d, 0x85, 0x70, 0xb8, 0x94, 0x15, 0x12, 0x4b, 0x4b, 0x32, 0xf2, 0x8b, 0xac, 0x20, 0x82, 0x29, 0xa9, 0x65, 0xa9, 0x39, 0xf9, 0x05, 0xa9, 0x45, 0x40, 0x89, 0x94, 0xd4, 0xe2, 0x64, 0xa0, 0x62, 0x85, 0x62, 0xa0, 0x74, 0x09, 0x98, 0x57, 0x94, 0x59, 0x50, 0x92, 0x99, 0x9f, 0x07, 0x94, 0x83, 0xb0, 0xad, 0x14, 0x8a, 0x4a, 0x93, 0x2a, 0xb9, 0xb8, 0x54, 0x4a, 0x6c, 0x0d, 0xb8, 0x54, 0x2a, 0x6c, 0x2d, 0xcd, 0xb8, 0x54, 0x2a, 0x6d, 0x8d, 0x4c, 0xb8, 0xb8, 0x52, 0x52, 0xd3, 0x14, 0x42, 0x3c, 0x9d, 0xb9, 0x38, 0x55, 0x2a, 0x75, 0x6d, 0x0d, 0x15, 0x32, 0xd3, 0x14, 0x92, 0x4a, 0xf2, 0x14, 0x0c, 0x40, 0x7c, 0x6d, 0x04, 0xdf, 0x10, 0xc8, 0xaf, 0x40, 0x92, 0x37, 0x02, 0xf1, 0x91, 0xe4, 0x8d, 0xb9, 0xb8, 0x38, 0x93, 0x73, 0x8a, 0x15, 0x0c, 0x8d, 0xb9, 0x38, 0x8b, 0x0b, 0x8a, 0x14, 0x0c, 0xb5, 0x35, 0x34, 0x54, 0x4a, 0x54, 0xcd, 0x0c, 0x34, 0xf5, 0x8d, 0x0d, 0x6a, 0x0c, 0x34, 0xb5, 0x8c, 0x74, 0x54, 0x2a, 0x74, 0x54, 0x2a, 0x75, 0x0c, 0x4d, 0x74, 0x8c, 0x75, 0x0c, 0x80, 0xd0, 0x48, 0x07, 0x68, 0x46, 0x41, 0x51, 0x66, 0x5e, 0x89, 0x82, 0x92, 0x87, 0xab, 0x8f, 0x8f, 0xbf, 0x42, 0xb8, 0x7f, 0x90, 0x8f, 0x8b, 0xa2, 0x92, 0x8e, 0x85, 0x09, 0x10, 0x01, 0xcd, 0x2f, 0x01, 0x9a, 0xcf, 0x95, 0x9a, 0x97, 0xc2, 0x05, 0x00, 0x3a, 0x20, 0x96, 0xf9, \ No newline at end of file diff --git a/build/assets/rubymark.tic.dat b/build/assets/rubymark.tic.dat new file mode 100644 index 000000000..c35610fed --- /dev/null +++ b/build/assets/rubymark.tic.dat @@ -0,0 +1 @@ +0x78, 0xda, 0xed, 0x54, 0x41, 0x6f, 0xdc, 0x44, 0x14, 0x76, 0x84, 0x4a, 0xe5, 0x51, 0x41, 0x5d, 0x71, 0x40, 0x42, 0x20, 0x3d, 0x35, 0x29, 0x4a, 0xd3, 0x8d, 0xeb, 0xdd, 0x24, 0x8b, 0xb4, 0xec, 0x86, 0x55, 0x40, 0x88, 0x40, 0x4b, 0xab, 0x36, 0xa8, 0x12, 0x08, 0x55, 0xb3, 0xf6, 0x78, 0x77, 0x54, 0xef, 0x78, 0x65, 0x8f, 0xb3, 0x75, 0xaa, 0x2a, 0x3f, 0x80, 0x1b, 0xf0, 0x07, 0xf8, 0x11, 0xfc, 0x01, 0xa4, 0x4a, 0x1c, 0x11, 0x12, 0xe2, 0x00, 0x44, 0x5c, 0xb8, 0xf6, 0xc2, 0x81, 0x4b, 0x25, 0x78, 0x6f, 0x6c, 0xef, 0x3a, 0xcd, 0x42, 0x2f, 0x1c, 0xfd, 0xc9, 0xe3, 0xb1, 0xdf, 0x7c, 0xef, 0xf3, 0x7b, 0x6f, 0xe6, 0xf9, 0x82, 0x6b, 0x59, 0xdf, 0x7c, 0xf7, 0xf8, 0xc7, 0xf4, 0x97, 0x57, 0xfe, 0xd8, 0xfd, 0xeb, 0xa7, 0xe3, 0xa7, 0x3f, 0x7f, 0x7a, 0x7c, 0xfe, 0x85, 0x2f, 0x0e, 0xf7, 0xee, 0xbe, 0xfa, 0xe5, 0x57, 0xc1, 0x9f, 0xdf, 0xfe, 0xfa, 0xf5, 0x6b, 0xd1, 0x68, 0xf7, 0xef, 0xe3, 0x9b, 0x37, 0xf7, 0x3f, 0xba, 0x70, 0x39, 0xf8, 0xde, 0xdb, 0x7a, 0x7c, 0x7e, 0xe5, 0xe9, 0x4b, 0xd6, 0x89, 0x85, 0x68, 0x34, 0x1a, 0x2b, 0x95, 0x41, 0xb0, 0xac, 0x5b, 0xd6, 0xc9, 0x6f, 0x17, 0xc9, 0x82, 0xb7, 0x1f, 0xde, 0xc0, 0xf1, 0xfa, 0x33, 0x83, 0x6c, 0x56, 0x8d, 0xff, 0xc6, 0xef, 0x27, 0x17, 0x1b, 0x2b, 0x4f, 0x4e, 0x8f, 0x86, 0x45, 0xf5, 0xbd, 0xbc, 0x92, 0xd7, 0xb9, 0x46, 0x8d, 0x1a, 0x35, 0x6a, 0xd4, 0xa8, 0x51, 0xa3, 0x46, 0x8d, 0x1a, 0x35, 0xfe, 0x1f, 0x34, 0x96, 0x83, 0x96, 0x5e, 0x3e, 0x77, 0xfd, 0x45, 0x6b, 0x15, 0xb4, 0xd4, 0xa1, 0xe8, 0xc2, 0x5e, 0xaa, 0x54, 0x36, 0xe1, 0xf1, 0x7d, 0x90, 0x0a, 0x6e, 0xa7, 0xc3, 0x8c, 0xad, 0x02, 0x4f, 0xf5, 0x38, 0x8a, 0xbb, 0xf0, 0xa1, 0x88, 0xc5, 0x44, 0xf2, 0xe4, 0x08, 0x3e, 0x16, 0xe1, 0xd1, 0xdb, 0x30, 0xe4, 0x89, 0xf0, 0x21, 0x52, 0xa0, 0xc7, 0x02, 0xa2, 0x58, 0x8e, 0xa4, 0xe2, 0x21, 0xcc, 0x22, 0x74, 0x8e, 0x02, 0xb8, 0x1d, 0x0d, 0xe1, 0x7a, 0xc4, 0xbd, 0x31, 0x2a, 0xf8, 0x22, 0xf1, 0x50, 0x5b, 0x28, 0x6f, 0x4c, 0xda, 0x52, 0x8d, 0x40, 0x47, 0x51, 0x88, 0x37, 0x48, 0x84, 0x80, 0x71, 0x34, 0x83, 0x09, 0x57, 0x19, 0x0c, 0xf1, 0xeb, 0x52, 0x24, 0xe0, 0x71, 0x05, 0x41, 0x98, 0x01, 0x8f, 0xa3, 0x54, 0xf9, 0x46, 0x3f, 0xf1, 0x62, 0x21, 0x54, 0x13, 0xd2, 0x84, 0xbc, 0x29, 0x32, 0x07, 0x85, 0xa5, 0x9a, 0xa6, 0xba, 0x0b, 0x23, 0x3e, 0x11, 0x53, 0xee, 0xa3, 0x01, 0x69, 0x72, 0x8a, 0x96, 0x38, 0x0f, 0xfd, 0x50, 0xc4, 0x89, 0x8c, 0x54, 0x17, 0x5c, 0xa7, 0xe5, 0xb8, 0x8c, 0xdd, 0x31, 0x2a, 0x77, 0xa5, 0xaf, 0xc7, 0xd0, 0x87, 0xf6, 0xb6, 0x5b, 0x58, 0x3e, 0x10, 0x72, 0x34, 0xd6, 0x68, 0x6a, 0x6d, 0x75, 0xd8, 0x01, 0x86, 0x36, 0xe4, 0xf1, 0xdc, 0xd6, 0x61, 0x6b, 0x34, 0xa1, 0xbb, 0x17, 0xf2, 0x24, 0xc9, 0x6b, 0xc4, 0xec, 0xc1, 0x60, 0x56, 0xea, 0x74, 0xe8, 0x6d, 0x5c, 0xf2, 0xb7, 0xda, 0x8c, 0xd9, 0xbe, 0x08, 0x30, 0x3a, 0xa9, 0x25, 0x0f, 0xe5, 0x91, 0x60, 0xb6, 0x3d, 0x78, 0x80, 0x4b, 0x31, 0x57, 0xfe, 0x7a, 0x35, 0x88, 0x4d, 0x28, 0x64, 0xae, 0x10, 0x25, 0x3b, 0x4d, 0x29, 0x22, 0x20, 0x4e, 0x2e, 0x6e, 0x48, 0xc9, 0x54, 0x08, 0xff, 0x1e, 0xa9, 0xad, 0x1b, 0x6e, 0xdb, 0x75, 0xaf, 0x20, 0xa7, 0x45, 0xd3, 0x35, 0xe8, 0xb8, 0x0b, 0x4e, 0xf6, 0x1c, 0x4e, 0x2c, 0xb5, 0xa0, 0x9c, 0x99, 0x2d, 0x94, 0x5f, 0xc4, 0xec, 0xc7, 0x7c, 0x86, 0xab, 0xb8, 0x08, 0x05, 0xa3, 0x09, 0x83, 0x07, 0x38, 0xb2, 0x26, 0xb4, 0xcc, 0xe5, 0x9a, 0x6b, 0x1b, 0xaf, 0xaa, 0x5f, 0x3a, 0xf5, 0xb9, 0x2e, 0xf2, 0xbc, 0xda, 0x87, 0x32, 0xca, 0x3c, 0xab, 0x85, 0x21, 0x43, 0xba, 0x2d, 0x03, 0x20, 0x56, 0x99, 0x3a, 0xec, 0x42, 0xa5, 0x24, 0xb8, 0x9e, 0xd7, 0x6a, 0x69, 0x99, 0xcc, 0x6a, 0x59, 0x81, 0x8d, 0x3e, 0x6c, 0x62, 0xf0, 0x26, 0x8a, 0x52, 0xb5, 0x07, 0xee, 0x5c, 0xc1, 0x7d, 0x0e, 0x3b, 0x33, 0x31, 0x14, 0xfb, 0x56, 0x06, 0x91, 0x17, 0xdd, 0x78, 0x66, 0xf3, 0x28, 0xce, 0xec, 0x44, 0x45, 0x39, 0x5b, 0xaa, 0xdc, 0x83, 0x53, 0xc7, 0x68, 0x1e, 0xd3, 0x59, 0xeb, 0x33, 0xfe, 0x74, 0x33, 0x65, 0xcd, 0x0f, 0xdb, 0xfb, 0xb7, 0xee, 0x2c, 0x3b, 0x4c, 0x87, 0x3c, 0x4c, 0x45, 0x91, 0xe2, 0x20, 0x88, 0xf1, 0xfc, 0x27, 0xe5, 0x1b, 0xba, 0xe9, 0x7b, 0x5a, 0x4e, 0x68, 0x79, 0x13, 0x77, 0xdc, 0xad, 0x6e, 0xd3, 0x48, 0xe8, 0x3c, 0x44, 0x43, 0xc0, 0x7c, 0x88, 0x7d, 0x40, 0xcf, 0xbd, 0x3e, 0xe4, 0xe4, 0x85, 0xe0, 0x55, 0x73, 0x36, 0x6c, 0x11, 0x26, 0xc2, 0x98, 0xcb, 0x8f, 0x16, 0xeb, 0x55, 0x6a, 0x59, 0xec, 0xea, 0xc7, 0x69, 0x2a, 0xb2, 0x9a, 0x87, 0x5c, 0xc9, 0x6f, 0x2d, 0x98, 0x92, 0x1f, 0x26, 0xe8, 0x28, 0x31, 0x63, 0x6b, 0x65, 0xf3, 0xf7, 0xe1, 0xb3, 0xcf, 0x17, 0x6f, 0xbd, 0x5e, 0xde, 0x6f, 0x86, 0xc3, 0x28, 0x85, 0x83, 0xfd, 0x77, 0x99, 0xbd, 0x0a, 0x37, 0xf0, 0x4f, 0xe0, 0x31, 0x7b, 0x42, 0xd3, 0x3a, 0x1e, 0x6b, 0xcc, 0x69, 0x4d, 0x3b, 0x47, 0x22, 0x8e, 0xde, 0x61, 0x76, 0x69, 0x6f, 0x15, 0x76, 0xe8, 0x63, 0x1b, 0x6f, 0x74, 0xb6, 0x37, 0xda, 0xce, 0xd6, 0x5b, 0x3b, 0xcc, 0x46, 0x8b, 0x49, 0x8e, 0x84, 0xf6, 0xe9, 0x1f, 0xc2, 0xec, 0x1d, 0x87, 0xe2, 0x4d, 0xe0, 0x21, 0x2c, 0xfd, 0x36, 0x3c, 0x22, 0xa5, 0xa1, 0x56, 0x94, 0xe8, 0x59, 0xae, 0x33, 0x8d, 0xa6, 0x0b, 0x4a, 0x2e, 0xfc, 0x49, 0xd1, 0x12, 0x73, 0x8e, 0xc0, 0xbf, 0x21, 0xbc, 0xd9, 0x2d, 0x5a, 0x85, 0x28, 0xef, 0x99, 0x6e, 0xf3, 0xc2, 0x04, 0x5a, 0x3b, 0x67, 0x89, 0xa6, 0x17, 0x99, 0x1d, 0x0b, 0x4f, 0x17, 0x5d, 0x57, 0xe9, 0x89, 0xe6, 0xe9, 0xa3, 0xd4, 0xa4, 0xb8, 0xb0, 0x5f, 0x95, 0x86, 0x4b, 0x7b, 0xb9, 0x4c, 0x17, 0x56, 0x1f, 0xce, 0x25, 0x3d, 0xfc, 0x93, 0xea, 0x47, 0x97, 0xca, 0x0e, 0x6e, 0xe1, 0x14, 0x70, 0xdc, 0x58, 0x63, 0x30, 0x4f, 0x73, 0x77, 0xdc, 0x11, 0xe3, 0x8a, 0xfb, 0xe3, 0xe0, 0x79, 0x21, 0xa7, 0x6a, 0x2f, 0x5e, 0x83, 0xf6, 0xbf, 0x4a, 0xd0, 0xc6, 0xfe, 0x03, 0xf3, 0xb8, 0xfc, 0x67, \ No newline at end of file diff --git a/demos/bunny/rubymark.rb b/demos/bunny/rubymark.rb new file mode 100644 index 000000000..ce739907f --- /dev/null +++ b/demos/bunny/rubymark.rb @@ -0,0 +1,120 @@ +# title: Bunnymark in Ruby +# author: Jeremiasz Nelz; based on the original work of Rob Loach +# desc: Benchmarking tool to see how many bunnies can fly around the screen, using Ruby. +# input: gamepad +# script: ruby +# version: 0.1.0 + +ScreenWidth = 240 +ScreenHeight = 136 +ToolbarHeight = 6 +$t = 0 + +class Bunny + @@width = 26 + @@height = 32 + + def initialize + @x = rand(ScreenWidth - @@width) + @y = rand(ScreenHeight - @@height) + @speed_x = (rand(200) - 100) / 60 + @speed_y = (rand(200) - 100) / 60 + @sprite = 1 + end + + def draw + spr @sprite, @x, @y, 1, 1, 0, 0, 4, 4 + end + + def update + @x += @speed_x + @y += @speed_y + + if @x + @@width > ScreenWidth + @x = ScreenWidth - @@width + @speed_x *= -1 + end + if @x < 0 + @x = 0 + @speed_x *= -1 + end + if @y + @@height > ScreenHeight + @y = ScreenHeight - @@height + @speed_y *= -1 + end + if @y < ToolbarHeight + @x = ToolbarHeight + @y *= -1 + end + end +end + +class FPS + def initialize + @value = 0 + @frames = 0 + @last_time = -1000 + end + + def get + if time - @lastTime <= 1000 + @frames += 1 + else + @value = @frames + @frames = 0 + @last_time = time + end + + @value + end +end + +$fps = FPS.new +$bunnies = [] +$bunnies << Bunny.new + +def TIC + # Music + music(0) if $t.zero? + + music(1) if $t == 6*64*2.375 + $t += 1 + + # Input + 5.times { $bunnies << Bunny.new } if btn 0 + 5.times { $bunnies.pop } if btn 1 + + # Update + $bunnies.each &:update + + # Draw + cls 15 + $bunnies.each &:draw + + rect 0, 0, ScreenWidth, ToolbarHeight, 0 + print "Bunnies: #{$bunnies.count}", 1, 0, 11, false, 1, false + print "FPS: #{$fps.get}", ScreenWidth / 2, 0, 11, false, 1, false +end + +# +# 001:11111100111110dd111110dc111110dc111110dc111110dc111110dd111110dd +# 002:00011110ddd0110dccd0110dccd0110dccd0110dccd0110dcddd00dddddddddd +# 003:00001111dddd0111cccd0111cccd0111cccd0111cccd0111dcdd0111dddd0111 +# 004:1111111111111111111111111111111111111111111111111111111111111111 +# 017:111110dd111110dd111110dd111110dd10000ddd1eeeeddd1eeeeedd10000eed +# 018:d0ddddddd0ddddddddddddddddd0000dddddccddddddccdddddddddddddddddd +# 019:0ddd01110ddd0111dddd0111dddd0111ddddd000ddddddddddddddddddddd000 +# 020:1111111111111111111111111111111101111111d0111111d011111101111111 +# 033:111110ee111110ee111110ee111110ee111110ee111110ee111110ee111110ee +# 034:dddcccccddccccccddccccccddccccccddccccccdddcccccdddddddddddddddd +# 035:dddd0111cddd0111cddd0111cddd0111cddd0111dddd0111dddd0111dddd0111 +# 036:1111111111111111111111111111111111111111111111111111111111111111 +# 049:111110ee111110ee111110ee111110ee111110ee111110ee111110ee11111100 +# 050:dddeeeeeddeeeeeed00000000111111101111111011111110111111111111111 +# 051:eddd0111eedd01110eed011110ee011110ee011110ee011110ee011111001111 +# 052:1111111111111111111111111111111111111111111111111111111111111111 +# + +# +# 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57 +# diff --git a/demos/rubydemo.rb b/demos/rubydemo.rb new file mode 100644 index 000000000..8483bf08c --- /dev/null +++ b/demos/rubydemo.rb @@ -0,0 +1,46 @@ +# title: game title +# author: game developer +# desc: short description +# script: ruby + +$t=0 +$x=96 +$y=24 + +def TIC + $y-=1 if btn 0 + $y+=1 if btn 1 + $x-=1 if btn 2 + $x+=1 if btn 3 + + cls 13 + spr 1+(($t%60)/30|0)*2,$x,$y,14,3,0,0,2,2 + print "HELLO WORLD!",84,84 + $t+=1 +end + +# +# 001:eccccccccc888888caaaaaaaca888888cacccccccacc0ccccacc0ccccacc0ccc +# 002:ccccceee8888cceeaaaa0cee888a0ceeccca0ccc0cca0c0c0cca0c0c0cca0c0c +# 003:eccccccccc888888caaaaaaaca888888cacccccccacccccccacc0ccccacc0ccc +# 004:ccccceee8888cceeaaaa0cee888a0ceeccca0cccccca0c0c0cca0c0c0cca0c0c +# 017:cacccccccaaaaaaacaaacaaacaaaaccccaaaaaaac8888888cc000cccecccccec +# 018:ccca00ccaaaa0ccecaaa0ceeaaaa0ceeaaaa0cee8888ccee000cceeecccceeee +# 019:cacccccccaaaaaaacaaacaaacaaaaccccaaaaaaac8888888cc000cccecccccec +# 020:ccca00ccaaaa0ccecaaa0ceeaaaa0ceeaaaa0cee8888ccee000cceeecccceeee +# + +# +# 000:00000000ffffffff00000000ffffffff +# 001:0123456789abcdeffedcba9876543210 +# 002:0123456789abcdef0123456789abcdef +# + +# +# 000:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304000000000 +# + +# +# 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57 +# + From 40e5ba1ce9449627d2caa8583f13b7eff5315a8d Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sun, 5 Dec 2021 16:59:53 +0100 Subject: [PATCH 118/379] Mention Ruby support in README.md * Mention Ruby in features * Attribution --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 010f61b9d..8a201e78d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ To make a retro styled game, the whole process of creation and execution takes p - Multiple programming languages: [Lua](https://www.lua.org), [Moonscript](https://moonscript.org), [Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript), + [Ruby](https://www.ruby-lang.org/en/), [Wren](http://wren.io/), [Fennel](https://fennel-lang.org), and [Squirrel](http://www.squirrel-lang.org). - Games can have mouse and keyboard as input @@ -214,3 +215,4 @@ You can find iOS/tvOS version here * msx80 - [Twitter @msx80](https://twitter.com/msx80) [Github msx80](https://github.com/msx80) * Josh Goebel - [Twitter @dreamer3](https://twitter.com/dreamer3) [Github joshgoebel](https://github.com/joshgoebel) * Joshua Minor - [GitHub @jminor](https://github.com/jminor) +* Jeremiasz Nelz - [Github @remi6397](https://github.com/remi6397) [WWW](https://nelz.pl) From b2452c6854f57f1837066c7bbbbe4dbdb4867173 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sun, 5 Dec 2021 22:35:20 +0100 Subject: [PATCH 119/379] Fix broken demos --- build/assets/rubymark.tic.dat | 2 +- demos/bunny/rubymark.rb | 34 ++++++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/build/assets/rubymark.tic.dat b/build/assets/rubymark.tic.dat index c35610fed..db90b7d16 100644 --- a/build/assets/rubymark.tic.dat +++ b/build/assets/rubymark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x54, 0x41, 0x6f, 0xdc, 0x44, 0x14, 0x76, 0x84, 0x4a, 0xe5, 0x51, 0x41, 0x5d, 0x71, 0x40, 0x42, 0x20, 0x3d, 0x35, 0x29, 0x4a, 0xd3, 0x8d, 0xeb, 0xdd, 0x24, 0x8b, 0xb4, 0xec, 0x86, 0x55, 0x40, 0x88, 0x40, 0x4b, 0xab, 0x36, 0xa8, 0x12, 0x08, 0x55, 0xb3, 0xf6, 0x78, 0x77, 0x54, 0xef, 0x78, 0x65, 0x8f, 0xb3, 0x75, 0xaa, 0x2a, 0x3f, 0x80, 0x1b, 0xf0, 0x07, 0xf8, 0x11, 0xfc, 0x01, 0xa4, 0x4a, 0x1c, 0x11, 0x12, 0xe2, 0x00, 0x44, 0x5c, 0xb8, 0xf6, 0xc2, 0x81, 0x4b, 0x25, 0x78, 0x6f, 0x6c, 0xef, 0x3a, 0xcd, 0x42, 0x2f, 0x1c, 0xfd, 0xc9, 0xe3, 0xb1, 0xdf, 0x7c, 0xef, 0xf3, 0x7b, 0x6f, 0xe6, 0xf9, 0x82, 0x6b, 0x59, 0xdf, 0x7c, 0xf7, 0xf8, 0xc7, 0xf4, 0x97, 0x57, 0xfe, 0xd8, 0xfd, 0xeb, 0xa7, 0xe3, 0xa7, 0x3f, 0x7f, 0x7a, 0x7c, 0xfe, 0x85, 0x2f, 0x0e, 0xf7, 0xee, 0xbe, 0xfa, 0xe5, 0x57, 0xc1, 0x9f, 0xdf, 0xfe, 0xfa, 0xf5, 0x6b, 0xd1, 0x68, 0xf7, 0xef, 0xe3, 0x9b, 0x37, 0xf7, 0x3f, 0xba, 0x70, 0x39, 0xf8, 0xde, 0xdb, 0x7a, 0x7c, 0x7e, 0xe5, 0xe9, 0x4b, 0xd6, 0x89, 0x85, 0x68, 0x34, 0x1a, 0x2b, 0x95, 0x41, 0xb0, 0xac, 0x5b, 0xd6, 0xc9, 0x6f, 0x17, 0xc9, 0x82, 0xb7, 0x1f, 0xde, 0xc0, 0xf1, 0xfa, 0x33, 0x83, 0x6c, 0x56, 0x8d, 0xff, 0xc6, 0xef, 0x27, 0x17, 0x1b, 0x2b, 0x4f, 0x4e, 0x8f, 0x86, 0x45, 0xf5, 0xbd, 0xbc, 0x92, 0xd7, 0xb9, 0x46, 0x8d, 0x1a, 0x35, 0x6a, 0xd4, 0xa8, 0x51, 0xa3, 0x46, 0x8d, 0x1a, 0x35, 0xfe, 0x1f, 0x34, 0x96, 0x83, 0x96, 0x5e, 0x3e, 0x77, 0xfd, 0x45, 0x6b, 0x15, 0xb4, 0xd4, 0xa1, 0xe8, 0xc2, 0x5e, 0xaa, 0x54, 0x36, 0xe1, 0xf1, 0x7d, 0x90, 0x0a, 0x6e, 0xa7, 0xc3, 0x8c, 0xad, 0x02, 0x4f, 0xf5, 0x38, 0x8a, 0xbb, 0xf0, 0xa1, 0x88, 0xc5, 0x44, 0xf2, 0xe4, 0x08, 0x3e, 0x16, 0xe1, 0xd1, 0xdb, 0x30, 0xe4, 0x89, 0xf0, 0x21, 0x52, 0xa0, 0xc7, 0x02, 0xa2, 0x58, 0x8e, 0xa4, 0xe2, 0x21, 0xcc, 0x22, 0x74, 0x8e, 0x02, 0xb8, 0x1d, 0x0d, 0xe1, 0x7a, 0xc4, 0xbd, 0x31, 0x2a, 0xf8, 0x22, 0xf1, 0x50, 0x5b, 0x28, 0x6f, 0x4c, 0xda, 0x52, 0x8d, 0x40, 0x47, 0x51, 0x88, 0x37, 0x48, 0x84, 0x80, 0x71, 0x34, 0x83, 0x09, 0x57, 0x19, 0x0c, 0xf1, 0xeb, 0x52, 0x24, 0xe0, 0x71, 0x05, 0x41, 0x98, 0x01, 0x8f, 0xa3, 0x54, 0xf9, 0x46, 0x3f, 0xf1, 0x62, 0x21, 0x54, 0x13, 0xd2, 0x84, 0xbc, 0x29, 0x32, 0x07, 0x85, 0xa5, 0x9a, 0xa6, 0xba, 0x0b, 0x23, 0x3e, 0x11, 0x53, 0xee, 0xa3, 0x01, 0x69, 0x72, 0x8a, 0x96, 0x38, 0x0f, 0xfd, 0x50, 0xc4, 0x89, 0x8c, 0x54, 0x17, 0x5c, 0xa7, 0xe5, 0xb8, 0x8c, 0xdd, 0x31, 0x2a, 0x77, 0xa5, 0xaf, 0xc7, 0xd0, 0x87, 0xf6, 0xb6, 0x5b, 0x58, 0x3e, 0x10, 0x72, 0x34, 0xd6, 0x68, 0x6a, 0x6d, 0x75, 0xd8, 0x01, 0x86, 0x36, 0xe4, 0xf1, 0xdc, 0xd6, 0x61, 0x6b, 0x34, 0xa1, 0xbb, 0x17, 0xf2, 0x24, 0xc9, 0x6b, 0xc4, 0xec, 0xc1, 0x60, 0x56, 0xea, 0x74, 0xe8, 0x6d, 0x5c, 0xf2, 0xb7, 0xda, 0x8c, 0xd9, 0xbe, 0x08, 0x30, 0x3a, 0xa9, 0x25, 0x0f, 0xe5, 0x91, 0x60, 0xb6, 0x3d, 0x78, 0x80, 0x4b, 0x31, 0x57, 0xfe, 0x7a, 0x35, 0x88, 0x4d, 0x28, 0x64, 0xae, 0x10, 0x25, 0x3b, 0x4d, 0x29, 0x22, 0x20, 0x4e, 0x2e, 0x6e, 0x48, 0xc9, 0x54, 0x08, 0xff, 0x1e, 0xa9, 0xad, 0x1b, 0x6e, 0xdb, 0x75, 0xaf, 0x20, 0xa7, 0x45, 0xd3, 0x35, 0xe8, 0xb8, 0x0b, 0x4e, 0xf6, 0x1c, 0x4e, 0x2c, 0xb5, 0xa0, 0x9c, 0x99, 0x2d, 0x94, 0x5f, 0xc4, 0xec, 0xc7, 0x7c, 0x86, 0xab, 0xb8, 0x08, 0x05, 0xa3, 0x09, 0x83, 0x07, 0x38, 0xb2, 0x26, 0xb4, 0xcc, 0xe5, 0x9a, 0x6b, 0x1b, 0xaf, 0xaa, 0x5f, 0x3a, 0xf5, 0xb9, 0x2e, 0xf2, 0xbc, 0xda, 0x87, 0x32, 0xca, 0x3c, 0xab, 0x85, 0x21, 0x43, 0xba, 0x2d, 0x03, 0x20, 0x56, 0x99, 0x3a, 0xec, 0x42, 0xa5, 0x24, 0xb8, 0x9e, 0xd7, 0x6a, 0x69, 0x99, 0xcc, 0x6a, 0x59, 0x81, 0x8d, 0x3e, 0x6c, 0x62, 0xf0, 0x26, 0x8a, 0x52, 0xb5, 0x07, 0xee, 0x5c, 0xc1, 0x7d, 0x0e, 0x3b, 0x33, 0x31, 0x14, 0xfb, 0x56, 0x06, 0x91, 0x17, 0xdd, 0x78, 0x66, 0xf3, 0x28, 0xce, 0xec, 0x44, 0x45, 0x39, 0x5b, 0xaa, 0xdc, 0x83, 0x53, 0xc7, 0x68, 0x1e, 0xd3, 0x59, 0xeb, 0x33, 0xfe, 0x74, 0x33, 0x65, 0xcd, 0x0f, 0xdb, 0xfb, 0xb7, 0xee, 0x2c, 0x3b, 0x4c, 0x87, 0x3c, 0x4c, 0x45, 0x91, 0xe2, 0x20, 0x88, 0xf1, 0xfc, 0x27, 0xe5, 0x1b, 0xba, 0xe9, 0x7b, 0x5a, 0x4e, 0x68, 0x79, 0x13, 0x77, 0xdc, 0xad, 0x6e, 0xd3, 0x48, 0xe8, 0x3c, 0x44, 0x43, 0xc0, 0x7c, 0x88, 0x7d, 0x40, 0xcf, 0xbd, 0x3e, 0xe4, 0xe4, 0x85, 0xe0, 0x55, 0x73, 0x36, 0x6c, 0x11, 0x26, 0xc2, 0x98, 0xcb, 0x8f, 0x16, 0xeb, 0x55, 0x6a, 0x59, 0xec, 0xea, 0xc7, 0x69, 0x2a, 0xb2, 0x9a, 0x87, 0x5c, 0xc9, 0x6f, 0x2d, 0x98, 0x92, 0x1f, 0x26, 0xe8, 0x28, 0x31, 0x63, 0x6b, 0x65, 0xf3, 0xf7, 0xe1, 0xb3, 0xcf, 0x17, 0x6f, 0xbd, 0x5e, 0xde, 0x6f, 0x86, 0xc3, 0x28, 0x85, 0x83, 0xfd, 0x77, 0x99, 0xbd, 0x0a, 0x37, 0xf0, 0x4f, 0xe0, 0x31, 0x7b, 0x42, 0xd3, 0x3a, 0x1e, 0x6b, 0xcc, 0x69, 0x4d, 0x3b, 0x47, 0x22, 0x8e, 0xde, 0x61, 0x76, 0x69, 0x6f, 0x15, 0x76, 0xe8, 0x63, 0x1b, 0x6f, 0x74, 0xb6, 0x37, 0xda, 0xce, 0xd6, 0x5b, 0x3b, 0xcc, 0x46, 0x8b, 0x49, 0x8e, 0x84, 0xf6, 0xe9, 0x1f, 0xc2, 0xec, 0x1d, 0x87, 0xe2, 0x4d, 0xe0, 0x21, 0x2c, 0xfd, 0x36, 0x3c, 0x22, 0xa5, 0xa1, 0x56, 0x94, 0xe8, 0x59, 0xae, 0x33, 0x8d, 0xa6, 0x0b, 0x4a, 0x2e, 0xfc, 0x49, 0xd1, 0x12, 0x73, 0x8e, 0xc0, 0xbf, 0x21, 0xbc, 0xd9, 0x2d, 0x5a, 0x85, 0x28, 0xef, 0x99, 0x6e, 0xf3, 0xc2, 0x04, 0x5a, 0x3b, 0x67, 0x89, 0xa6, 0x17, 0x99, 0x1d, 0x0b, 0x4f, 0x17, 0x5d, 0x57, 0xe9, 0x89, 0xe6, 0xe9, 0xa3, 0xd4, 0xa4, 0xb8, 0xb0, 0x5f, 0x95, 0x86, 0x4b, 0x7b, 0xb9, 0x4c, 0x17, 0x56, 0x1f, 0xce, 0x25, 0x3d, 0xfc, 0x93, 0xea, 0x47, 0x97, 0xca, 0x0e, 0x6e, 0xe1, 0x14, 0x70, 0xdc, 0x58, 0x63, 0x30, 0x4f, 0x73, 0x77, 0xdc, 0x11, 0xe3, 0x8a, 0xfb, 0xe3, 0xe0, 0x79, 0x21, 0xa7, 0x6a, 0x2f, 0x5e, 0x83, 0xf6, 0xbf, 0x4a, 0xd0, 0xc6, 0xfe, 0x03, 0xf3, 0xb8, 0xfc, 0x67, \ No newline at end of file +0x78, 0xda, 0xed, 0x54, 0x4f, 0x6b, 0xdc, 0x46, 0x14, 0x97, 0x29, 0x4d, 0x90, 0x48, 0x42, 0x96, 0x1e, 0x0a, 0xa1, 0x81, 0x47, 0xec, 0x14, 0xdb, 0x59, 0x2b, 0xbb, 0xeb, 0x3f, 0x85, 0xcd, 0xae, 0x63, 0xdc, 0x12, 0xe2, 0xa6, 0xf9, 0x43, 0x92, 0x12, 0x68, 0x28, 0x61, 0x56, 0x1a, 0xed, 0x0e, 0xd1, 0x8e, 0x16, 0x69, 0xe4, 0x8d, 0x1c, 0x82, 0x3f, 0x40, 0x6e, 0x69, 0xbf, 0x40, 0x3f, 0x44, 0xbf, 0x40, 0x21, 0x90, 0x63, 0x08, 0x94, 0x1e, 0x9a, 0x9a, 0x5e, 0x7a, 0xcd, 0x25, 0x87, 0x5e, 0x02, 0xed, 0x7b, 0x33, 0xd2, 0x5a, 0x8e, 0xd7, 0xa1, 0x87, 0x1e, 0xf5, 0xd0, 0x68, 0xa4, 0xf7, 0x7e, 0xef, 0x37, 0xef, 0xbd, 0x99, 0x37, 0x27, 0x1a, 0x96, 0xf5, 0xd3, 0x2f, 0xcf, 0x5f, 0xa5, 0xbf, 0x7f, 0xf2, 0xd7, 0xfa, 0xdf, 0xbf, 0xee, 0xbe, 0xfb, 0xed, 0xbb, 0xdd, 0xe3, 0x1f, 0x3d, 0xdd, 0xde, 0xbc, 0xf7, 0xe9, 0xb3, 0x1f, 0x82, 0xb7, 0x3f, 0xbf, 0xfe, 0xf1, 0x4c, 0xd4, 0x5f, 0xff, 0x67, 0xf7, 0xe6, 0xcd, 0xad, 0x6b, 0x27, 0xce, 0x07, 0x2f, 0xbc, 0xe5, 0xe7, 0xc7, 0x67, 0xde, 0x9d, 0xb4, 0xf6, 0x2c, 0x94, 0x5a, 0xad, 0x36, 0x53, 0x1a, 0x24, 0x96, 0x75, 0xcb, 0xda, 0xfb, 0xe3, 0x34, 0x69, 0xf0, 0xf5, 0xf2, 0x2c, 0x8e, 0xcf, 0xde, 0x1b, 0xa4, 0xb3, 0x2a, 0xf9, 0xb0, 0xfc, 0xb9, 0x77, 0xba, 0x36, 0xf3, 0xe6, 0xe0, 0xa8, 0x59, 0x54, 0xdf, 0xf3, 0x33, 0xa6, 0xce, 0x95, 0x54, 0x52, 0x49, 0x25, 0x95, 0x54, 0x52, 0x49, 0x25, 0x95, 0x54, 0x52, 0x49, 0x25, 0xff, 0x8f, 0xd4, 0xa6, 0x0b, 0x99, 0x4e, 0x7d, 0xfc, 0xf4, 0x98, 0x35, 0x0b, 0x4a, 0xa8, 0x90, 0xb7, 0x61, 0x33, 0x95, 0x32, 0x1b, 0xb2, 0xf8, 0x21, 0x08, 0x09, 0xb7, 0xd3, 0x5e, 0xe6, 0xcc, 0x02, 0x4b, 0xd5, 0x20, 0x8a, 0xdb, 0xf0, 0x35, 0x8f, 0xf9, 0x50, 0xb0, 0x64, 0x07, 0x6e, 0xf0, 0x70, 0xe7, 0x12, 0xf4, 0x58, 0xc2, 0x7d, 0x88, 0x24, 0xa8, 0x01, 0x87, 0x28, 0x16, 0x7d, 0x21, 0x59, 0x08, 0xe3, 0x08, 0x9d, 0xa3, 0x00, 0x6e, 0x47, 0x3d, 0xf8, 0x26, 0x62, 0xde, 0x00, 0x19, 0x7c, 0x9e, 0x78, 0xc8, 0xcd, 0xa5, 0x37, 0x20, 0x6e, 0x21, 0xfb, 0xa0, 0xa2, 0x28, 0xc4, 0x17, 0x24, 0x9c, 0xc3, 0x20, 0x1a, 0xc3, 0x90, 0xc9, 0x0c, 0x7a, 0xb8, 0xba, 0xe0, 0x09, 0x78, 0x4c, 0x42, 0x10, 0x66, 0xc0, 0xe2, 0x28, 0x95, 0xbe, 0xe6, 0x4f, 0xbc, 0x98, 0x73, 0x59, 0x87, 0x34, 0x21, 0x6f, 0x8a, 0xcc, 0x45, 0x62, 0x21, 0x47, 0xa9, 0x6a, 0x43, 0x9f, 0x0d, 0xf9, 0x88, 0xf9, 0xa8, 0x40, 0x98, 0x18, 0xa1, 0x26, 0x36, 0xa1, 0x6f, 0xf3, 0x38, 0x11, 0x91, 0x6c, 0x43, 0xc3, 0x6d, 0xba, 0x0d, 0xc7, 0xb9, 0xa3, 0x59, 0xee, 0x09, 0x5f, 0x0d, 0xa0, 0x0b, 0xad, 0x95, 0x06, 0x2a, 0x8d, 0xee, 0x2a, 0x17, 0xfd, 0x81, 0x42, 0x65, 0x73, 0x79, 0x0d, 0x95, 0x77, 0x31, 0xbc, 0x1e, 0x8b, 0x27, 0xda, 0x35, 0x67, 0x8e, 0x26, 0xa4, 0xf0, 0x42, 0x96, 0x24, 0xa6, 0x4e, 0x8e, 0xbd, 0xb1, 0x31, 0x2e, 0xb8, 0xc8, 0x0b, 0xff, 0x07, 0x85, 0xc7, 0x72, 0x8b, 0x16, 0xb4, 0x7d, 0x1e, 0x60, 0x94, 0x42, 0x09, 0x16, 0x8a, 0x1d, 0xee, 0xd8, 0xf6, 0xc6, 0x23, 0x34, 0x5e, 0x09, 0x23, 0xa6, 0xe6, 0x63, 0x26, 0xfd, 0xf9, 0x72, 0x48, 0x4b, 0x90, 0x13, 0x2e, 0x2c, 0x10, 0x32, 0x9b, 0x86, 0xcc, 0x43, 0x22, 0xa8, 0x59, 0xcb, 0x60, 0x93, 0x11, 0xe7, 0xfe, 0x83, 0xf7, 0xb8, 0x5b, 0x8d, 0xc6, 0x02, 0x22, 0x9b, 0x34, 0x5d, 0x84, 0x35, 0xca, 0x76, 0x02, 0xcd, 0xfe, 0x1b, 0x34, 0x16, 0x8a, 0x53, 0x55, 0x1c, 0x9b, 0x4b, 0x3f, 0xcf, 0xc7, 0x8f, 0xd9, 0x18, 0xad, 0x68, 0x84, 0x1c, 0x51, 0x87, 0x8d, 0x47, 0x38, 0xb2, 0x3a, 0x34, 0xf5, 0xd3, 0xd0, 0xcf, 0x0a, 0x3e, 0x65, 0xbf, 0x74, 0xe4, 0x33, 0x95, 0xd7, 0xe0, 0x42, 0x17, 0x8a, 0x98, 0x4d, 0xaa, 0xfb, 0x8a, 0x0c, 0xe1, 0xb6, 0x08, 0x80, 0x50, 0x45, 0x41, 0x60, 0x1d, 0x4a, 0x85, 0x42, 0xbb, 0xa9, 0xe3, 0xd4, 0xe2, 0x69, 0x6b, 0x51, 0x8f, 0xc5, 0x2e, 0x2c, 0x35, 0x75, 0x32, 0x14, 0x47, 0xc1, 0xdb, 0x01, 0x93, 0xa0, 0x61, 0x29, 0xbe, 0x3f, 0xe4, 0x93, 0xe9, 0x58, 0xf2, 0xdd, 0x2d, 0x82, 0x31, 0x7b, 0xa1, 0x7d, 0xb3, 0x49, 0x34, 0x87, 0x36, 0xa8, 0xc4, 0x9d, 0x1d, 0xc1, 0xdd, 0x81, 0x03, 0x07, 0x6e, 0xc2, 0x78, 0x58, 0x7b, 0x04, 0x0f, 0xbd, 0x74, 0xa1, 0xcd, 0xf1, 0xbc, 0x72, 0xeb, 0xce, 0xb4, 0xa3, 0xb7, 0xcd, 0xc2, 0x94, 0xeb, 0x63, 0x8c, 0x3f, 0x41, 0x8c, 0x5d, 0x93, 0x14, 0x7f, 0xe8, 0xa6, 0x1e, 0x28, 0x31, 0x24, 0xf3, 0x12, 0x9e, 0x82, 0x46, 0x79, 0xe3, 0xfa, 0x9c, 0x16, 0xf7, 0xd1, 0xa4, 0x11, 0x98, 0xda, 0x04, 0x6e, 0x52, 0xf0, 0xa1, 0xd3, 0x05, 0xe3, 0xb5, 0xcf, 0x7c, 0x41, 0x1f, 0x1b, 0x9b, 0x87, 0x09, 0xd7, 0xea, 0x62, 0xf5, 0xdc, 0x5e, 0x86, 0x9a, 0x20, 0x0e, 0x46, 0x91, 0xb3, 0x9b, 0x28, 0x72, 0xef, 0x52, 0xa2, 0x73, 0xc1, 0x88, 0xfc, 0x30, 0x53, 0x57, 0xf2, 0xb1, 0x33, 0x57, 0xdc, 0x1d, 0x5d, 0xb8, 0xff, 0xfd, 0xfe, 0x5f, 0xa7, 0x63, 0x5a, 0x55, 0x63, 0x1c, 0xca, 0xe5, 0xee, 0xd6, 0x97, 0x8e, 0x3d, 0x0b, 0xd7, 0xf1, 0x22, 0xf1, 0x1c, 0x7b, 0x48, 0xd3, 0x3c, 0x9e, 0x79, 0x4c, 0x62, 0x4e, 0xb9, 0x3b, 0x3c, 0x8e, 0x2e, 0x3b, 0x76, 0xa1, 0x6f, 0xe6, 0x7a, 0xe8, 0xe2, 0x0d, 0xb0, 0xb8, 0xb6, 0xb2, 0xd8, 0x72, 0x97, 0xbf, 0x58, 0x75, 0x6c, 0xd4, 0xe8, 0xe4, 0x88, 0x68, 0x8b, 0xae, 0x20, 0xc7, 0x5e, 0x75, 0x29, 0xde, 0x04, 0x1e, 0xc3, 0xd4, 0xb5, 0xe1, 0x09, 0x31, 0xf5, 0x94, 0xa4, 0x44, 0x0f, 0x63, 0xdd, 0x51, 0x34, 0xda, 0x87, 0x18, 0xe2, 0x6f, 0xf3, 0x6e, 0x99, 0x60, 0x38, 0x5e, 0xa6, 0xf0, 0x79, 0x3b, 0xef, 0x22, 0x82, 0x7c, 0xa5, 0x1b, 0xd1, 0x0b, 0x13, 0x68, 0xae, 0x1e, 0x06, 0xea, 0x36, 0x75, 0xec, 0x98, 0x7b, 0x2a, 0x6f, 0xc8, 0x52, 0xbb, 0xd4, 0x0f, 0x9e, 0xad, 0x3a, 0xc5, 0x85, 0xad, 0x2c, 0x15, 0x9c, 0xdb, 0x34, 0x34, 0x6d, 0x98, 0x7d, 0x3c, 0xa1, 0xf4, 0xf0, 0x22, 0x56, 0x4f, 0xce, 0x15, 0xcd, 0xdd, 0xc4, 0x29, 0x60, 0xb8, 0xb1, 0x5a, 0xa1, 0xbf, 0x26, 0xee, 0xb8, 0x23, 0xda, 0x15, 0xf7, 0xc7, 0xc5, 0x83, 0x43, 0x4e, 0xe5, 0x36, 0xbd, 0x08, 0xad, 0x23, 0x29, 0x68, 0x63, 0xff, 0x05, 0x8b, 0x8a, 0x0d, 0xe8, \ No newline at end of file diff --git a/demos/bunny/rubymark.rb b/demos/bunny/rubymark.rb index ce739907f..a6219a9f8 100644 --- a/demos/bunny/rubymark.rb +++ b/demos/bunny/rubymark.rb @@ -5,20 +5,20 @@ # script: ruby # version: 0.1.0 -ScreenWidth = 240 -ScreenHeight = 136 +ScreenWidth = 240.0 +ScreenHeight = 136.0 ToolbarHeight = 6 $t = 0 class Bunny - @@width = 26 - @@height = 32 + @@width = 26.0 + @@height = 32.0 def initialize - @x = rand(ScreenWidth - @@width) - @y = rand(ScreenHeight - @@height) - @speed_x = (rand(200) - 100) / 60 - @speed_y = (rand(200) - 100) / 60 + @x = Float(rand(ScreenWidth - @@width)) + @y = Float(rand(ScreenHeight - @@height)) + @speed_x = Float(rand(200) - 100) / 60.0 + @speed_y = Float(rand(200) - 100) / 60.0 @sprite = 1 end @@ -32,19 +32,19 @@ def update if @x + @@width > ScreenWidth @x = ScreenWidth - @@width - @speed_x *= -1 + @speed_x *= -1.0 end - if @x < 0 - @x = 0 - @speed_x *= -1 + if @x < 0.0 + @x = 0.0 + @speed_x *= -1.0 end if @y + @@height > ScreenHeight @y = ScreenHeight - @@height - @speed_y *= -1 + @speed_y *= -1.0 end if @y < ToolbarHeight - @x = ToolbarHeight - @y *= -1 + @y = ToolbarHeight + @speed_y *= -1.0 end end end @@ -57,7 +57,8 @@ def initialize end def get - if time - @lastTime <= 1000 + d = time - @last_time + if d <= 1000 @frames += 1 else @value = @frames @@ -118,3 +119,4 @@ def TIC # # 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57 # + From cd9023959117a55726bba2aeef3500dd1231ad45 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 6 Dec 2021 13:44:25 +0300 Subject: [PATCH 120/379] fixed studio breaking after vbank(1) + some screen rendering optimizations #1717 --- src/core/core.c | 50 ++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index 845d24e4f..d35336c86 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -290,6 +290,7 @@ void tic_api_reset(tic_mem* memory) { tic_core* core = (tic_core*)memory; + ZEROMEM(core->state); tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); resetVbank(memory); @@ -298,8 +299,6 @@ void tic_api_reset(tic_mem* memory) { resetVbank(memory); - ZEROMEM(memory->ram.vram.screen); - // init VBANK1 palette with VBANK0 palette if it's empty // for backward compatibility if(!EMPTY(memory->cart.bank0.palette.vbank1.data)) @@ -309,10 +308,6 @@ void tic_api_reset(tic_mem* memory) memory->ram.input.mouse.relative = 0; soundClear(memory); - - core->state.initialized = false; - ZEROMEM(core->state.callback); - updateSaveid(memory); } @@ -546,12 +541,12 @@ static inline void memset4(void* dst, u32 val, u32 dwords) static inline tic_vram* vbank0(tic_core* core) { - return core->state.vbank.id ? &core->state.vbank.mem : &core->memory.ram.vram; + return &core->memory.ram.vram; } static inline tic_vram* vbank1(tic_core* core) { - return core->state.vbank.id ? &core->memory.ram.vram : &core->state.vbank.mem; + return &core->state.vbank.mem; } static inline void updpal(tic_mem* tic, tic_blitpal* pal0, tic_blitpal* pal1) @@ -580,6 +575,16 @@ static inline void updbdr(tic_mem* tic, s32 row, u32* ptr, tic_blit_callback clb memset4(ptr, pal0->data[vbank0(core)->vars.border], TIC80_FULLWIDTH); } +static inline u32 blitpix(tic_mem* tic, s32 offset0, s32 offset1, const tic_blitpal* pal0, const tic_blitpal* pal1) +{ + tic_core* core = (tic_core*)tic; + u32 pix = tic_tool_peek4(vbank1(core)->screen.data, offset1); + + return pix != vbank1(core)->vars.clear + ? pal1->data[pix] + : pal0->data[tic_tool_peek4(vbank0(core)->screen.data, offset0)]; +} + void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) { tic_core* core = (tic_core*)tic; @@ -600,19 +605,22 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) UPDBDR(); rowPtr += TIC80_MARGIN_LEFT; - enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; - s32 start0 = (row - vbank0(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; - s32 start1 = (row - vbank1(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; - - for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) - { - u8 pix = tic_tool_peek4(vbank1(core)->screen.data, - (x - vbank1(core)->vars.offset.x) % TIC80_WIDTH + start1); - - *rowPtr++ = pix != vbank1(core)->vars.clear - ? pal1.data[pix] - : pal0.data[tic_tool_peek4(vbank0(core)->screen.data, - (x - vbank0(core)->vars.offset.x) % TIC80_WIDTH + start0)]; + if(*(u16*)&vbank0(core)->vars.offset == 0 && *(u16*)&vbank1(core)->vars.offset == 0) + { + // render line without XY offsets + for(s32 x = (row - TIC80_MARGIN_TOP) * TIC80_WIDTH, end = x + TIC80_WIDTH; x != end; ++x) + *rowPtr++ = blitpix(tic, x, x, &pal0, &pal1); + } + else + { + // render line with XY offsets + enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; + s32 start0 = (row - vbank0(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 start1 = (row - vbank1(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + + for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) + *rowPtr++ = blitpix(tic, (x - vbank0(core)->vars.offset.x) % TIC80_WIDTH + start0, + (x - vbank1(core)->vars.offset.x) % TIC80_WIDTH + start1, &pal0, &pal1); } rowPtr += TIC80_MARGIN_RIGHT; From b449feb6ffd2f90e80cffbfd2de579d813707d2e Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Mon, 6 Dec 2021 07:47:11 +0100 Subject: [PATCH 121/379] Add mruby WASM target --- .gitignore | 1 + CMakeLists.txt | 10 ++++++++-- tic_mruby_wasm_build_config.rb | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 tic_mruby_wasm_build_config.rb diff --git a/.gitignore b/.gitignore index ee78fd4c6..4f1071a51 100644 --- a/.gitignore +++ b/.gitignore @@ -171,3 +171,4 @@ build/linux/tic80.desktop build/compile_commands.json CMakeSettings.json tic_mruby_build_config.rb.lock +tic_mruby_wasm_build_config.rb.lock diff --git a/CMakeLists.txt b/CMakeLists.txt index e9fe4b5de..b3141731b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -230,8 +230,14 @@ find_program(RAKE_EXE rake REQUIRED) find_program(YACC_EXE yacc REQUIRED) set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) -set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/host/lib/libmruby.a) -set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) +if(EMSCRIPTEN) + set(MRUBY_TARGET wasm) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_wasm_build_config.rb) +else() + set(MRUBY_TARGET host) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) +endif() +set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} diff --git a/tic_mruby_wasm_build_config.rb b/tic_mruby_wasm_build_config.rb new file mode 100644 index 000000000..92b19d49b --- /dev/null +++ b/tic_mruby_wasm_build_config.rb @@ -0,0 +1,18 @@ +MRuby::Toolchain.new('emscripten') do |conf| + toolchain :clang + + conf.cc.command = 'emcc' + conf.cxx.command = 'emcc' + conf.linker.command = 'emcc' + conf.archiver.command = 'emar' +end + +MRuby::CrossBuild.new('wasm') do |conf| + toolchain :emscripten + + # include the GEM box + conf.gembox 'default' + + conf.enable_bintest + conf.enable_test +end From a83b5f754d5eff897829f7b77471e338ce9d3678 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Mon, 6 Dec 2021 08:33:33 +0100 Subject: [PATCH 122/379] Fix compatibility with old CMake versions --- CMakeLists.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b3141731b..fa5eb4f4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.18) +cmake_minimum_required(VERSION 3.3) set(VERSION_MAJOR 1) set(VERSION_MINOR 0) @@ -226,8 +226,14 @@ target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) # MRUBY ################################ -find_program(RAKE_EXE rake REQUIRED) -find_program(YACC_EXE yacc REQUIRED) +find_program(RAKE rake) +find_program(YACC yacc) +if(NOT RAKE) + message(FATAL_ERROR "Program `rake' not found! Ruby and `rake' are required to build mruby support.") +endif() +if(NOT YACC) + message(FATAL_ERROR "Program `yacc' not found! Either `yacc' or GNU Bison is required to build mruby support.") +endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) if(EMSCRIPTEN) @@ -243,7 +249,7 @@ ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE - BUILD_COMMAND ${RAKE_EXE} MRUBY_CONFIG=${MRUBY_CONFIG} + BUILD_COMMAND ${RAKE} MRUBY_CONFIG=${MRUBY_CONFIG} INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIBRARIES} ) From 29c4da3c89c4f0b41ac6e5290d5e8527ce79c3c1 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Mon, 6 Dec 2021 16:00:00 +0100 Subject: [PATCH 123/379] Fix support for languages with single-char comment Current behavior assumes that comments comprise exactly two characters, such as "--" or "//". Many languages, such as Ruby and Python, use a single character, such as the pound sign or the ASCII quotation mark to signal a single-line comment. --- build/assets/rubydemo.tic.dat | 2 +- build/assets/rubymark.tic.dat | 2 +- src/studio/project.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/assets/rubydemo.tic.dat b/build/assets/rubydemo.tic.dat index b273d5692..0d6743aa6 100644 --- a/build/assets/rubydemo.tic.dat +++ b/build/assets/rubydemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xe3, 0x31, 0x60, 0x60, 0x58, 0x78, 0xe8, 0xe8, 0xa5, 0xd2, 0xdb, 0xc2, 0x4f, 0xed, 0xbe, 0x5f, 0xad, 0xff, 0x73, 0x3d, 0xaa, 0x9e, 0x9d, 0xb9, 0xbb, 0xcc, 0x29, 0x5c, 0x7c, 0xd2, 0xe4, 0xb4, 0xcf, 0x5b, 0xef, 0x4c, 0x91, 0xca, 0x4f, 0xb7, 0xfb, 0x5f, 0xef, 0xef, 0xef, 0xe9, 0xcd, 0xa3, 0x9a, 0x76, 0x22, 0xd9, 0xf8, 0x28, 0x3b, 0xd7, 0x39, 0x06, 0x06, 0xe7, 0xd4, 0xf6, 0x95, 0xa7, 0xdf, 0xfe, 0xbf, 0xb7, 0x67, 0x56, 0x45, 0x98, 0x89, 0x10, 0xc3, 0x90, 0x03, 0x21, 0x65, 0x33, 0x76, 0xdd, 0xf9, 0x27, 0x60, 0x04, 0xa1, 0x19, 0xed, 0x19, 0x18, 0x56, 0x71, 0x9d, 0x39, 0xb7, 0x8a, 0xeb, 0xcd, 0x3a, 0x28, 0xee, 0xeb, 0x38, 0xf1, 0x86, 0x8f, 0xe1, 0xcc, 0xbb, 0x73, 0x67, 0xde, 0xbc, 0x03, 0x69, 0xe0, 0x3b, 0x03, 0x04, 0x3d, 0x1d, 0x1d, 0x27, 0x56, 0xad, 0x5a, 0x75, 0xaa, 0x0b, 0x48, 0x9f, 0x02, 0xf2, 0x4f, 0xf1, 0xc0, 0x31, 0xa7, 0x2d, 0x45, 0xee, 0x31, 0x70, 0x60, 0xe5, 0x67, 0x64, 0x50, 0x56, 0x28, 0xc9, 0x2c, 0xc9, 0x49, 0xb5, 0x52, 0x50, 0x48, 0x4f, 0xcc, 0x4d, 0x85, 0x70, 0xb8, 0x94, 0x15, 0x12, 0x4b, 0x4b, 0x32, 0xf2, 0x8b, 0xac, 0x20, 0x82, 0x29, 0xa9, 0x65, 0xa9, 0x39, 0xf9, 0x05, 0xa9, 0x45, 0x40, 0x89, 0x94, 0xd4, 0xe2, 0x64, 0xa0, 0x62, 0x85, 0x62, 0xa0, 0x74, 0x09, 0x98, 0x57, 0x94, 0x59, 0x50, 0x92, 0x99, 0x9f, 0x07, 0x94, 0x83, 0xb0, 0xad, 0x14, 0x8a, 0x4a, 0x93, 0x2a, 0xb9, 0xb8, 0x54, 0x4a, 0x6c, 0x0d, 0xb8, 0x54, 0x2a, 0x6c, 0x2d, 0xcd, 0xb8, 0x54, 0x2a, 0x6d, 0x8d, 0x4c, 0xb8, 0xb8, 0x52, 0x52, 0xd3, 0x14, 0x42, 0x3c, 0x9d, 0xb9, 0x38, 0x55, 0x2a, 0x75, 0x6d, 0x0d, 0x15, 0x32, 0xd3, 0x14, 0x92, 0x4a, 0xf2, 0x14, 0x0c, 0x40, 0x7c, 0x6d, 0x04, 0xdf, 0x10, 0xc8, 0xaf, 0x40, 0x92, 0x37, 0x02, 0xf1, 0x91, 0xe4, 0x8d, 0xb9, 0xb8, 0x38, 0x93, 0x73, 0x8a, 0x15, 0x0c, 0x8d, 0xb9, 0x38, 0x8b, 0x0b, 0x8a, 0x14, 0x0c, 0xb5, 0x35, 0x34, 0x54, 0x4a, 0x54, 0xcd, 0x0c, 0x34, 0xf5, 0x8d, 0x0d, 0x6a, 0x0c, 0x34, 0xb5, 0x8c, 0x74, 0x54, 0x2a, 0x74, 0x54, 0x2a, 0x75, 0x0c, 0x4d, 0x74, 0x8c, 0x75, 0x0c, 0x80, 0xd0, 0x48, 0x07, 0x68, 0x46, 0x41, 0x51, 0x66, 0x5e, 0x89, 0x82, 0x92, 0x87, 0xab, 0x8f, 0x8f, 0xbf, 0x42, 0xb8, 0x7f, 0x90, 0x8f, 0x8b, 0xa2, 0x92, 0x8e, 0x85, 0x09, 0x10, 0x01, 0xcd, 0x2f, 0x01, 0x9a, 0xcf, 0x95, 0x9a, 0x97, 0xc2, 0x05, 0x00, 0x3a, 0x20, 0x96, 0xf9, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xcb, 0x4a, 0xc3, 0x40, 0x14, 0x9d, 0xfa, 0x58, 0x64, 0x36, 0xe2, 0x1f, 0x8c, 0x6d, 0x84, 0xd6, 0x46, 0xcc, 0xa3, 0x14, 0x2d, 0xc4, 0x8d, 0x0a, 0x0a, 0x85, 0x82, 0x08, 0xae, 0xdb, 0x66, 0xaa, 0x81, 0x9a, 0x86, 0x64, 0x94, 0x06, 0xfc, 0x80, 0x2c, 0xfc, 0x08, 0x97, 0x12, 0xf2, 0x11, 0xb3, 0x96, 0x4b, 0xbf, 0xa4, 0xcc, 0x37, 0x78, 0x93, 0xfa, 0xe8, 0x42, 0x74, 0xd1, 0x85, 0x1b, 0xcf, 0x9d, 0xcb, 0xcc, 0x99, 0x33, 0xe7, 0x32, 0x70, 0xb6, 0x09, 0x21, 0x95, 0xe7, 0x35, 0xf2, 0x1b, 0x66, 0x80, 0x48, 0xd3, 0x34, 0xcf, 0xb2, 0x2c, 0x2f, 0x76, 0xa4, 0x39, 0xc8, 0xcf, 0x06, 0x98, 0xab, 0x34, 0x05, 0x95, 0x65, 0x52, 0xa5, 0x2f, 0x52, 0x41, 0x2e, 0x41, 0xe6, 0x52, 0x7e, 0xf4, 0xf7, 0x7e, 0xf8, 0xd1, 0x0f, 0x4b, 0x7e, 0xf2, 0x8f, 0x3f, 0x45, 0x99, 0x55, 0x91, 0x5d, 0x59, 0xaf, 0xe5, 0xf9, 0x09, 0x73, 0x04, 0x22, 0x01, 0xb3, 0x9d, 0x41, 0x4e, 0x00, 0xb3, 0x9b, 0xe7, 0x98, 0x5f, 0xf6, 0xde, 0x45, 0x9e, 0x44, 0xce, 0x15, 0x80, 0x52, 0xab, 0xfa, 0xb5, 0xe3, 0xd5, 0xfe, 0xbf, 0xbe, 0xb1, 0xb9, 0x55, 0x21, 0x35, 0x26, 0x7c, 0x31, 0xe6, 0x1d, 0xc6, 0x6e, 0xfa, 0x77, 0x7c, 0x41, 0x68, 0x8d, 0xf5, 0xef, 0xc5, 0xed, 0x24, 0xea, 0x2c, 0x2e, 0x3d, 0xfe, 0xc0, 0xc7, 0x93, 0x90, 0x47, 0x28, 0x78, 0x3c, 0x1e, 0xe2, 0x63, 0x16, 0xa3, 0x2c, 0x4a, 0x16, 0xf9, 0xa1, 0xf0, 0x27, 0x01, 0x6a, 0x8b, 0x73, 0x87, 0x45, 0xf7, 0x83, 0x84, 0x52, 0x5d, 0xb8, 0x26, 0xd5, 0xa7, 0xee, 0x51, 0x9b, 0xea, 0x89, 0x6b, 0xb7, 0x28, 0xf5, 0xf8, 0x88, 0x5d, 0x5d, 0x9c, 0x50, 0x4d, 0x4f, 0xf6, 0x5d, 0x8b, 0xf9, 0x23, 0x36, 0x10, 0x01, 0x33, 0x0b, 0xde, 0xfc, 0xe2, 0x16, 0xf2, 0xe9, 0x92, 0x6e, 0x17, 0x7c, 0x49, 0x77, 0x28, 0xd5, 0x86, 0xe3, 0x98, 0x59, 0x0e, 0xd5, 0xe2, 0x30, 0x62, 0x56, 0xb3, 0x5e, 0xd7, 0xc5, 0x6e, 0xdb, 0x6c, 0x1c, 0x38, 0xe6, 0xa3, 0xd9, 0xd8, 0xb3, 0x0d, 0x7d, 0x6a, 0xe8, 0x89, 0x61, 0xb5, 0x0c, 0xc7, 0x30, 0xb1, 0x6c, 0x03, 0x67, 0x84, 0x91, 0x1f, 0x08, 0x56, 0x3d, 0x3f, 0xeb, 0x76, 0x7b, 0xec, 0xba, 0x77, 0xd9, 0x3d, 0xdd, 0xa9, 0x1a, 0x87, 0x2d, 0x5c, 0x38, 0x5f, 0xe0, 0x7c, 0xca, 0x03, 0x8f, 0xbe, 0x01, 0x5a, 0xf8, 0x00, 0x3f, \ No newline at end of file diff --git a/build/assets/rubymark.tic.dat b/build/assets/rubymark.tic.dat index db90b7d16..c493983ab 100644 --- a/build/assets/rubymark.tic.dat +++ b/build/assets/rubymark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x54, 0x4f, 0x6b, 0xdc, 0x46, 0x14, 0x97, 0x29, 0x4d, 0x90, 0x48, 0x42, 0x96, 0x1e, 0x0a, 0xa1, 0x81, 0x47, 0xec, 0x14, 0xdb, 0x59, 0x2b, 0xbb, 0xeb, 0x3f, 0x85, 0xcd, 0xae, 0x63, 0xdc, 0x12, 0xe2, 0xa6, 0xf9, 0x43, 0x92, 0x12, 0x68, 0x28, 0x61, 0x56, 0x1a, 0xed, 0x0e, 0xd1, 0x8e, 0x16, 0x69, 0xe4, 0x8d, 0x1c, 0x82, 0x3f, 0x40, 0x6e, 0x69, 0xbf, 0x40, 0x3f, 0x44, 0xbf, 0x40, 0x21, 0x90, 0x63, 0x08, 0x94, 0x1e, 0x9a, 0x9a, 0x5e, 0x7a, 0xcd, 0x25, 0x87, 0x5e, 0x02, 0xed, 0x7b, 0x33, 0xd2, 0x5a, 0x8e, 0xd7, 0xa1, 0x87, 0x1e, 0xf5, 0xd0, 0x68, 0xa4, 0xf7, 0x7e, 0xef, 0x37, 0xef, 0xbd, 0x99, 0x37, 0x27, 0x1a, 0x96, 0xf5, 0xd3, 0x2f, 0xcf, 0x5f, 0xa5, 0xbf, 0x7f, 0xf2, 0xd7, 0xfa, 0xdf, 0xbf, 0xee, 0xbe, 0xfb, 0xed, 0xbb, 0xdd, 0xe3, 0x1f, 0x3d, 0xdd, 0xde, 0xbc, 0xf7, 0xe9, 0xb3, 0x1f, 0x82, 0xb7, 0x3f, 0xbf, 0xfe, 0xf1, 0x4c, 0xd4, 0x5f, 0xff, 0x67, 0xf7, 0xe6, 0xcd, 0xad, 0x6b, 0x27, 0xce, 0x07, 0x2f, 0xbc, 0xe5, 0xe7, 0xc7, 0x67, 0xde, 0x9d, 0xb4, 0xf6, 0x2c, 0x94, 0x5a, 0xad, 0x36, 0x53, 0x1a, 0x24, 0x96, 0x75, 0xcb, 0xda, 0xfb, 0xe3, 0x34, 0x69, 0xf0, 0xf5, 0xf2, 0x2c, 0x8e, 0xcf, 0xde, 0x1b, 0xa4, 0xb3, 0x2a, 0xf9, 0xb0, 0xfc, 0xb9, 0x77, 0xba, 0x36, 0xf3, 0xe6, 0xe0, 0xa8, 0x59, 0x54, 0xdf, 0xf3, 0x33, 0xa6, 0xce, 0x95, 0x54, 0x52, 0x49, 0x25, 0x95, 0x54, 0x52, 0x49, 0x25, 0x95, 0x54, 0x52, 0x49, 0x25, 0xff, 0x8f, 0xd4, 0xa6, 0x0b, 0x99, 0x4e, 0x7d, 0xfc, 0xf4, 0x98, 0x35, 0x0b, 0x4a, 0xa8, 0x90, 0xb7, 0x61, 0x33, 0x95, 0x32, 0x1b, 0xb2, 0xf8, 0x21, 0x08, 0x09, 0xb7, 0xd3, 0x5e, 0xe6, 0xcc, 0x02, 0x4b, 0xd5, 0x20, 0x8a, 0xdb, 0xf0, 0x35, 0x8f, 0xf9, 0x50, 0xb0, 0x64, 0x07, 0x6e, 0xf0, 0x70, 0xe7, 0x12, 0xf4, 0x58, 0xc2, 0x7d, 0x88, 0x24, 0xa8, 0x01, 0x87, 0x28, 0x16, 0x7d, 0x21, 0x59, 0x08, 0xe3, 0x08, 0x9d, 0xa3, 0x00, 0x6e, 0x47, 0x3d, 0xf8, 0x26, 0x62, 0xde, 0x00, 0x19, 0x7c, 0x9e, 0x78, 0xc8, 0xcd, 0xa5, 0x37, 0x20, 0x6e, 0x21, 0xfb, 0xa0, 0xa2, 0x28, 0xc4, 0x17, 0x24, 0x9c, 0xc3, 0x20, 0x1a, 0xc3, 0x90, 0xc9, 0x0c, 0x7a, 0xb8, 0xba, 0xe0, 0x09, 0x78, 0x4c, 0x42, 0x10, 0x66, 0xc0, 0xe2, 0x28, 0x95, 0xbe, 0xe6, 0x4f, 0xbc, 0x98, 0x73, 0x59, 0x87, 0x34, 0x21, 0x6f, 0x8a, 0xcc, 0x45, 0x62, 0x21, 0x47, 0xa9, 0x6a, 0x43, 0x9f, 0x0d, 0xf9, 0x88, 0xf9, 0xa8, 0x40, 0x98, 0x18, 0xa1, 0x26, 0x36, 0xa1, 0x6f, 0xf3, 0x38, 0x11, 0x91, 0x6c, 0x43, 0xc3, 0x6d, 0xba, 0x0d, 0xc7, 0xb9, 0xa3, 0x59, 0xee, 0x09, 0x5f, 0x0d, 0xa0, 0x0b, 0xad, 0x95, 0x06, 0x2a, 0x8d, 0xee, 0x2a, 0x17, 0xfd, 0x81, 0x42, 0x65, 0x73, 0x79, 0x0d, 0x95, 0x77, 0x31, 0xbc, 0x1e, 0x8b, 0x27, 0xda, 0x35, 0x67, 0x8e, 0x26, 0xa4, 0xf0, 0x42, 0x96, 0x24, 0xa6, 0x4e, 0x8e, 0xbd, 0xb1, 0x31, 0x2e, 0xb8, 0xc8, 0x0b, 0xff, 0x07, 0x85, 0xc7, 0x72, 0x8b, 0x16, 0xb4, 0x7d, 0x1e, 0x60, 0x94, 0x42, 0x09, 0x16, 0x8a, 0x1d, 0xee, 0xd8, 0xf6, 0xc6, 0x23, 0x34, 0x5e, 0x09, 0x23, 0xa6, 0xe6, 0x63, 0x26, 0xfd, 0xf9, 0x72, 0x48, 0x4b, 0x90, 0x13, 0x2e, 0x2c, 0x10, 0x32, 0x9b, 0x86, 0xcc, 0x43, 0x22, 0xa8, 0x59, 0xcb, 0x60, 0x93, 0x11, 0xe7, 0xfe, 0x83, 0xf7, 0xb8, 0x5b, 0x8d, 0xc6, 0x02, 0x22, 0x9b, 0x34, 0x5d, 0x84, 0x35, 0xca, 0x76, 0x02, 0xcd, 0xfe, 0x1b, 0x34, 0x16, 0x8a, 0x53, 0x55, 0x1c, 0x9b, 0x4b, 0x3f, 0xcf, 0xc7, 0x8f, 0xd9, 0x18, 0xad, 0x68, 0x84, 0x1c, 0x51, 0x87, 0x8d, 0x47, 0x38, 0xb2, 0x3a, 0x34, 0xf5, 0xd3, 0xd0, 0xcf, 0x0a, 0x3e, 0x65, 0xbf, 0x74, 0xe4, 0x33, 0x95, 0xd7, 0xe0, 0x42, 0x17, 0x8a, 0x98, 0x4d, 0xaa, 0xfb, 0x8a, 0x0c, 0xe1, 0xb6, 0x08, 0x80, 0x50, 0x45, 0x41, 0x60, 0x1d, 0x4a, 0x85, 0x42, 0xbb, 0xa9, 0xe3, 0xd4, 0xe2, 0x69, 0x6b, 0x51, 0x8f, 0xc5, 0x2e, 0x2c, 0x35, 0x75, 0x32, 0x14, 0x47, 0xc1, 0xdb, 0x01, 0x93, 0xa0, 0x61, 0x29, 0xbe, 0x3f, 0xe4, 0x93, 0xe9, 0x58, 0xf2, 0xdd, 0x2d, 0x82, 0x31, 0x7b, 0xa1, 0x7d, 0xb3, 0x49, 0x34, 0x87, 0x36, 0xa8, 0xc4, 0x9d, 0x1d, 0xc1, 0xdd, 0x81, 0x03, 0x07, 0x6e, 0xc2, 0x78, 0x58, 0x7b, 0x04, 0x0f, 0xbd, 0x74, 0xa1, 0xcd, 0xf1, 0xbc, 0x72, 0xeb, 0xce, 0xb4, 0xa3, 0xb7, 0xcd, 0xc2, 0x94, 0xeb, 0x63, 0x8c, 0x3f, 0x41, 0x8c, 0x5d, 0x93, 0x14, 0x7f, 0xe8, 0xa6, 0x1e, 0x28, 0x31, 0x24, 0xf3, 0x12, 0x9e, 0x82, 0x46, 0x79, 0xe3, 0xfa, 0x9c, 0x16, 0xf7, 0xd1, 0xa4, 0x11, 0x98, 0xda, 0x04, 0x6e, 0x52, 0xf0, 0xa1, 0xd3, 0x05, 0xe3, 0xb5, 0xcf, 0x7c, 0x41, 0x1f, 0x1b, 0x9b, 0x87, 0x09, 0xd7, 0xea, 0x62, 0xf5, 0xdc, 0x5e, 0x86, 0x9a, 0x20, 0x0e, 0x46, 0x91, 0xb3, 0x9b, 0x28, 0x72, 0xef, 0x52, 0xa2, 0x73, 0xc1, 0x88, 0xfc, 0x30, 0x53, 0x57, 0xf2, 0xb1, 0x33, 0x57, 0xdc, 0x1d, 0x5d, 0xb8, 0xff, 0xfd, 0xfe, 0x5f, 0xa7, 0x63, 0x5a, 0x55, 0x63, 0x1c, 0xca, 0xe5, 0xee, 0xd6, 0x97, 0x8e, 0x3d, 0x0b, 0xd7, 0xf1, 0x22, 0xf1, 0x1c, 0x7b, 0x48, 0xd3, 0x3c, 0x9e, 0x79, 0x4c, 0x62, 0x4e, 0xb9, 0x3b, 0x3c, 0x8e, 0x2e, 0x3b, 0x76, 0xa1, 0x6f, 0xe6, 0x7a, 0xe8, 0xe2, 0x0d, 0xb0, 0xb8, 0xb6, 0xb2, 0xd8, 0x72, 0x97, 0xbf, 0x58, 0x75, 0x6c, 0xd4, 0xe8, 0xe4, 0x88, 0x68, 0x8b, 0xae, 0x20, 0xc7, 0x5e, 0x75, 0x29, 0xde, 0x04, 0x1e, 0xc3, 0xd4, 0xb5, 0xe1, 0x09, 0x31, 0xf5, 0x94, 0xa4, 0x44, 0x0f, 0x63, 0xdd, 0x51, 0x34, 0xda, 0x87, 0x18, 0xe2, 0x6f, 0xf3, 0x6e, 0x99, 0x60, 0x38, 0x5e, 0xa6, 0xf0, 0x79, 0x3b, 0xef, 0x22, 0x82, 0x7c, 0xa5, 0x1b, 0xd1, 0x0b, 0x13, 0x68, 0xae, 0x1e, 0x06, 0xea, 0x36, 0x75, 0xec, 0x98, 0x7b, 0x2a, 0x6f, 0xc8, 0x52, 0xbb, 0xd4, 0x0f, 0x9e, 0xad, 0x3a, 0xc5, 0x85, 0xad, 0x2c, 0x15, 0x9c, 0xdb, 0x34, 0x34, 0x6d, 0x98, 0x7d, 0x3c, 0xa1, 0xf4, 0xf0, 0x22, 0x56, 0x4f, 0xce, 0x15, 0xcd, 0xdd, 0xc4, 0x29, 0x60, 0xb8, 0xb1, 0x5a, 0xa1, 0xbf, 0x26, 0xee, 0xb8, 0x23, 0xda, 0x15, 0xf7, 0xc7, 0xc5, 0x83, 0x43, 0x4e, 0xe5, 0x36, 0xbd, 0x08, 0xad, 0x23, 0x29, 0x68, 0x63, 0xff, 0x05, 0x8b, 0x8a, 0x0d, 0xe8, \ No newline at end of file +0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xdc, 0x44, 0x14, 0x77, 0x0e, 0x54, 0xb2, 0xc5, 0x4a, 0xeb, 0x2b, 0xe2, 0xf0, 0xd4, 0x84, 0x92, 0xa4, 0x1b, 0x77, 0x77, 0x93, 0x2c, 0x68, 0xbb, 0x5b, 0x42, 0x41, 0x15, 0x45, 0x80, 0x50, 0x53, 0xc8, 0x01, 0x45, 0xd5, 0xac, 0x3d, 0xbb, 0x3b, 0xaa, 0xd7, 0x36, 0xf6, 0xb8, 0x5b, 0xa7, 0xca, 0x95, 0x0b, 0x57, 0x3e, 0x00, 0x27, 0xb8, 0xc2, 0x89, 0x3b, 0x37, 0xa4, 0x8d, 0x94, 0x0f, 0x10, 0x47, 0xe5, 0x03, 0xb0, 0xe5, 0x10, 0xc1, 0x11, 0xde, 0xcc, 0xd8, 0x8e, 0x77, 0x93, 0x34, 0xdc, 0x00, 0x29, 0x23, 0x3f, 0xff, 0x79, 0xef, 0xf7, 0x7e, 0xf3, 0xde, 0xbc, 0x79, 0xe3, 0x57, 0xeb, 0x9a, 0xf6, 0xda, 0xeb, 0xb5, 0xdd, 0x37, 0x77, 0x7f, 0xbc, 0xb3, 0xfd, 0x62, 0x7f, 0xe7, 0xaf, 0x83, 0xf8, 0xfb, 0xdf, 0x83, 0xb7, 0x7f, 0x72, 0xde, 0xf8, 0x32, 0x59, 0x69, 0xf9, 0xb7, 0x77, 0x7f, 0x79, 0xf7, 0xbb, 0x3f, 0xa2, 0x17, 0x7f, 0x9e, 0x9c, 0x9c, 0x7c, 0xf3, 0xc3, 0xcf, 0x9f, 0xbb, 0x5f, 0xad, 0x77, 0x76, 0x16, 0xbe, 0xbd, 0xa6, 0x5d, 0x36, 0x4c, 0xd3, 0x44, 0x59, 0x48, 0x51, 0x0e, 0xe6, 0x44, 0xe8, 0x52, 0xad, 0x8a, 0xb7, 0x8a, 0x79, 0x38, 0x99, 0x93, 0xa3, 0x54, 0x4b, 0xc5, 0x10, 0x0c, 0x69, 0x5a, 0x35, 0x27, 0x47, 0xb3, 0x72, 0x80, 0x3a, 0xa1, 0xbf, 0x6c, 0x68, 0x57, 0xe3, 0x5f, 0x1d, 0x79, 0x9d, 0x73, 0x59, 0xd0, 0x0e, 0xd3, 0x5f, 0xa7, 0xc7, 0x28, 0x53, 0x7c, 0x7f, 0x7e, 0x5c, 0xc1, 0x1a, 0x57, 0xd2, 0x6c, 0x54, 0xd0, 0x98, 0x4e, 0x52, 0x25, 0x6a, 0x1c, 0x62, 0x8d, 0x0f, 0xb3, 0x5a, 0x2b, 0xa9, 0x68, 0x85, 0x11, 0xdf, 0xe7, 0xeb, 0x2d, 0x76, 0x44, 0x25, 0x93, 0xea, 0x55, 0xfd, 0xff, 0x0b, 0xf5, 0x9f, 0xbe, 0x4c, 0xd2, 0x83, 0xc9, 0x24, 0x9d, 0xcc, 0x89, 0xd0, 0x15, 0xa3, 0x6a, 0x1e, 0xcd, 0x49, 0x5a, 0x92, 0xab, 0xfe, 0xff, 0x3f, 0xd7, 0xdf, 0xd4, 0xd2, 0xdf, 0xf0, 0x20, 0x98, 0x4e, 0xa7, 0x15, 0xc4, 0x56, 0xb3, 0x9e, 0xcd, 0x45, 0x8c, 0x63, 0xac, 0xf1, 0x14, 0xe5, 0xf9, 0x31, 0xfe, 0x28, 0xa6, 0xb3, 0x62, 0x6a, 0x97, 0x96, 0xdf, 0x7c, 0xe5, 0xeb, 0x6b, 0xda, 0x22, 0x70, 0xc6, 0x5d, 0xda, 0x86, 0xbb, 0xb1, 0xe7, 0x25, 0x23, 0x12, 0x3e, 0x06, 0xe6, 0xc1, 0x83, 0xb8, 0x97, 0x18, 0x8b, 0x40, 0x62, 0x3e, 0xf4, 0xc3, 0x36, 0x7c, 0x48, 0x43, 0x3a, 0x62, 0x24, 0xda, 0x83, 0x4f, 0xa8, 0xbb, 0x77, 0x1b, 0x7a, 0x24, 0xa2, 0x0e, 0xf8, 0x1e, 0xf0, 0x21, 0x05, 0x3f, 0x64, 0x03, 0xe6, 0x11, 0x17, 0xc6, 0x3e, 0x3a, 0xfb, 0x7d, 0x78, 0xe0, 0xf7, 0xe0, 0x23, 0x9f, 0xd8, 0x43, 0x64, 0x70, 0x68, 0x64, 0x23, 0x37, 0xf5, 0xec, 0xa1, 0xe0, 0x66, 0xde, 0x00, 0xb8, 0xef, 0xbb, 0x78, 0x83, 0x88, 0x52, 0x18, 0xfa, 0x63, 0x18, 0x11, 0x2f, 0x81, 0x1e, 0xce, 0xce, 0x68, 0x04, 0x36, 0xf1, 0xa0, 0xef, 0x26, 0x40, 0x42, 0x3f, 0xf6, 0x1c, 0xc9, 0x1f, 0xd9, 0x21, 0xa5, 0x5e, 0x0d, 0xe2, 0x48, 0x78, 0x8b, 0xc8, 0x2c, 0x24, 0x66, 0x5e, 0x10, 0xf3, 0x36, 0x0c, 0xc8, 0x88, 0x06, 0xc4, 0x41, 0x05, 0xc2, 0x58, 0x80, 0x9a, 0x50, 0x85, 0xfe, 0x84, 0x86, 0x11, 0xf3, 0xbd, 0x36, 0xd4, 0xad, 0x86, 0x55, 0x37, 0x8c, 0x6d, 0xc9, 0xb2, 0xc3, 0x1c, 0x3e, 0x84, 0x2e, 0x34, 0x37, 0xea, 0xa8, 0x54, 0xba, 0x0f, 0x28, 0x1b, 0x0c, 0x39, 0x2a, 0x1b, 0xeb, 0x2d, 0x54, 0x3e, 0xc4, 0xf0, 0x7a, 0x24, 0x2c, 0xb4, 0x2d, 0x63, 0x49, 0x3c, 0x90, 0xc2, 0x76, 0x49, 0x14, 0xa9, 0x75, 0x32, 0xf4, 0xad, 0xad, 0x71, 0xce, 0x25, 0xbc, 0xf0, 0x7b, 0x98, 0x7b, 0xac, 0x37, 0xc5, 0x84, 0xba, 0x43, 0xfb, 0x18, 0x25, 0xe3, 0x8c, 0xb8, 0x6c, 0x8f, 0x1a, 0xba, 0xbe, 0xf5, 0x14, 0x8d, 0xf7, 0x5c, 0x9f, 0xf0, 0xe5, 0x90, 0x78, 0xce, 0x72, 0x39, 0xa4, 0x35, 0xc8, 0x08, 0x57, 0x56, 0x04, 0x32, 0x39, 0x0f, 0x99, 0x85, 0x24, 0xa0, 0x6a, 0x2e, 0x85, 0x8d, 0x02, 0x4a, 0x9d, 0x47, 0x73, 0xdc, 0xcd, 0x7a, 0x7d, 0x05, 0x91, 0x0d, 0xf1, 0xb8, 0x05, 0x2d, 0x91, 0x6d, 0x01, 0x4d, 0xfe, 0x19, 0x34, 0x64, 0x9c, 0x8a, 0x55, 0x31, 0x74, 0xea, 0x39, 0x59, 0x3e, 0x4e, 0x48, 0xc6, 0x68, 0x45, 0x23, 0x64, 0x88, 0x1a, 0x6c, 0x3d, 0x45, 0x49, 0x6a, 0xd0, 0x90, 0x57, 0x5d, 0x5e, 0x1b, 0x78, 0x95, 0xfd, 0xe2, 0xc0, 0x21, 0x3c, 0x5b, 0x83, 0x9b, 0x5d, 0xc8, 0x63, 0x56, 0xa9, 0x9e, 0x2a, 0x12, 0x84, 0xeb, 0xac, 0x0f, 0x02, 0x95, 0x2f, 0x08, 0xdc, 0x81, 0xd2, 0x42, 0xa1, 0x5d, 0xad, 0xe3, 0xb9, 0x8b, 0x27, 0xad, 0xf9, 0x7a, 0xac, 0x76, 0x61, 0xad, 0x21, 0x93, 0x11, 0x71, 0xe4, 0xbc, 0x1d, 0x50, 0x09, 0x2a, 0x96, 0xfc, 0xfd, 0x65, 0x3e, 0x89, 0x8c, 0x25, 0xab, 0x6e, 0x1e, 0x8c, 0xaa, 0x85, 0xf4, 0x4d, 0x8a, 0x68, 0xce, 0x14, 0xa8, 0xc4, 0x9d, 0x5c, 0xc0, 0xdd, 0x81, 0x99, 0x0d, 0x57, 0x30, 0x9e, 0xd5, 0x5e, 0xc0, 0x23, 0x6e, 0x72, 0xa1, 0xd5, 0xf6, 0xbc, 0xf7, 0xe9, 0xf6, 0x79, 0x5b, 0xef, 0x09, 0x71, 0x63, 0x2a, 0xb7, 0x31, 0x7e, 0xf4, 0x43, 0xec, 0x9a, 0x28, 0xff, 0x42, 0x37, 0xfe, 0x88, 0xb3, 0x91, 0x30, 0xaf, 0xe1, 0x2e, 0xa8, 0x97, 0x0b, 0x37, 0xa0, 0x62, 0x72, 0x07, 0x4d, 0x12, 0x81, 0xa9, 0x15, 0x70, 0x95, 0x82, 0x03, 0x9d, 0x2e, 0x28, 0xaf, 0x53, 0xe6, 0x9b, 0x72, 0xdb, 0xe8, 0xd4, 0x8d, 0xa8, 0x54, 0xe7, 0xb3, 0x67, 0xf6, 0x32, 0x54, 0x05, 0x31, 0x1b, 0x45, 0xc6, 0xae, 0xa2, 0xc8, 0xbc, 0x4b, 0x89, 0x2e, 0xf5, 0x03, 0xe1, 0x87, 0x99, 0x5a, 0x1e, 0x1d, 0x1b, 0x4b, 0xf9, 0xd9, 0xd1, 0x85, 0x2f, 0x76, 0x4f, 0xbf, 0x3a, 0x1d, 0xd5, 0xaa, 0x12, 0x63, 0x88, 0x5c, 0x1e, 0xde, 0x7f, 0xcf, 0xd0, 0x17, 0xe1, 0x63, 0x3c, 0x48, 0x6c, 0x43, 0x1f, 0x89, 0xc7, 0x32, 0xee, 0x79, 0x4c, 0x62, 0x89, 0x5b, 0x7b, 0x34, 0xf4, 0xdf, 0x31, 0xf4, 0x5c, 0xdf, 0xc8, 0xf4, 0xd0, 0xc5, 0x13, 0x60, 0xb5, 0xb5, 0xb1, 0xda, 0xb4, 0xd6, 0xdf, 0xda, 0x34, 0x74, 0xd4, 0xc8, 0xe4, 0x04, 0xd1, 0x7d, 0x71, 0x04, 0x19, 0xfa, 0xa6, 0x25, 0xe2, 0x8d, 0xe0, 0x19, 0x9c, 0x3b, 0x37, 0xec, 0x0b, 0xa6, 0x1e, 0xf7, 0x44, 0xa2, 0x67, 0xb1, 0x56, 0xe0, 0x07, 0xa7, 0x10, 0x45, 0xfc, 0x59, 0xd6, 0x2d, 0x05, 0x86, 0xe2, 0x61, 0x0a, 0x37, 0xda, 0x59, 0x17, 0x09, 0xc8, 0xfb, 0xb2, 0x11, 0x6d, 0x37, 0x82, 0xc6, 0xe6, 0x59, 0xa0, 0x6c, 0x53, 0x43, 0x0f, 0xa9, 0xcd, 0xb3, 0x86, 0x2c, 0xb5, 0x4b, 0x6d, 0x76, 0x6f, 0xd5, 0x44, 0x5c, 0xd8, 0xca, 0x1e, 0x87, 0xeb, 0x77, 0x15, 0x4d, 0x1b, 0x16, 0x9f, 0x15, 0x94, 0x36, 0x1e, 0xc4, 0x7c, 0xff, 0x7a, 0xde, 0xdc, 0x0d, 0x7c, 0xf4, 0x09, 0x16, 0x56, 0x2a, 0xe4, 0x5b, 0xe1, 0x8e, 0x15, 0x91, 0xae, 0x58, 0x1f, 0x0b, 0x37, 0x8e, 0x70, 0x2a, 0xb7, 0xe9, 0x2d, 0x68, 0x5e, 0x48, 0x21, 0x0a, 0xfb, 0x37, 0x80, 0x19, 0xaa, 0x35, \ No newline at end of file diff --git a/src/studio/project.c b/src/studio/project.c index d8bfc4a82..8351da601 100644 --- a/src/studio/project.c +++ b/src/studio/project.c @@ -208,13 +208,13 @@ static bool loadBinarySection(const char* project, const char* comment, const ch while(ptr < end) { static char lineStr[] = "999"; - memcpy(lineStr, ptr + sizeof("-- ") - 1, sizeof lineStr - 1); + memcpy(lineStr, ptr + strlen(comment) + 1, sizeof lineStr - 1); s32 index = atoi(lineStr); if(index < count) { - ptr += sizeof("-- 999:") - 1; + ptr += strlen(comment) + sizeof(" 999:") - 1; tic_tool_str2buf(ptr, size*2, (u8*)dst + size*index, flip); ptr += size*2 + 1; @@ -225,7 +225,7 @@ static bool loadBinarySection(const char* project, const char* comment, const ch } else { - ptr += sizeof("-- 999:") - 1; + ptr += strlen(comment) + sizeof(" 999:") - 1; tic_tool_str2buf(ptr, (s32)(end - ptr), (u8*)dst, flip); } From a039f098842809a6c37470f90cb07bd4fac36e71 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Mon, 6 Dec 2021 18:13:26 +0100 Subject: [PATCH 124/379] Fix segfault when opening outline --- src/api/mrb.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/api/mrb.c b/src/api/mrb.c index f922d10dd..829e91965 100644 --- a/src/api/mrb.c +++ b/src/api/mrb.c @@ -1173,8 +1173,8 @@ static const tic_outline_item* getMRubyOutline(const char* code, s32* size) { char c = *ptr; - if(isalnum_(c) || c == ' '); - else if(c == '(' || c == '\n') + if(isalnum_(c)); + else if(c == '(' || c == ' ' || c == '\n') { end = ptr; break; @@ -1186,10 +1186,10 @@ static const tic_outline_item* getMRubyOutline(const char* code, s32* size) if(end > start) { - items = items ? realloc(items, (*size + 1) * Size) : malloc(Size); + items = realloc(items, (*size + 1) * Size); - items[*size].pos = start - code; - items[*size].size = end - start; + items[*size].pos = start; + items[*size].size = (s32)(end - start); (*size)++; } From a0c77312fd29a26c501a7bb32d99ac0660d85be3 Mon Sep 17 00:00:00 2001 From: blinry Date: Mon, 6 Dec 2021 16:30:10 +0100 Subject: [PATCH 125/379] Add some missing spaces, and reword a few phrases --- src/studio/screens/console.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index b24c418c6..ac9eb95c0 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -128,12 +128,12 @@ static const char* WelcomeText = "TIC-80 is a fantasy computer for making, playing and sharing tiny games.\n\n" - "There are built-in tools for development: code, sprites, maps, sound editors and the command line, " + "It has built-in tools for development: code, sprites, maps, sound editors and the command line, " "which is enough to create a mini retro game.\n" - "At the exit you will get a cartridge file, which can be stored and played on the website.\n\n" - "Also, the game can be packed into a player that works on all popular platforms and distribute as you wish.\n" - "To make a retro styled game the whole process of creation takes place under some technical limitations: " - "240x136 pixels display, 16 color palette, 256 8x8 color sprites, 4 channel sound and etc."; + "In the end, you will get a cartridge file, which can be stored and played on the website.\n\n" + "Also, the game can be packed into a player that works on all popular platforms and distributed as you wish.\n" + "To make a retro-style game, the whole creation process takes place under some technical limitations: " + "240x136 pixels display, 16 color palette, 256 8x8 color sprites, 4 channel sound, etc."; static const struct SpecRow {const char* section; const char* info;} SpecText1[] = { @@ -150,12 +150,12 @@ static const char* TermsText = "## Terms of Use\n" "- All cartridges posted on the " TIC_WEBSITE " website are the property of their authors.\n" "- Do not redistribute the cartridge without permission, directly from the author.\n" - "- By uploading cartridges to the site, you grant Nesbox the right to freely use and distribute them." + "- By uploading cartridges to the site, you grant Nesbox the right to freely use and distribute them. " "All other rights by default remain with the author.\n" "- Do not post material that violates copyright, obscenity or any other laws.\n" "- Nesbox reserves the right to remove or filter any material without prior notice.\n\n" "## Privacy Policy\n" - "We store only the user's email and password in encrypted form and will not transfer any personal" + "We store only the user's email and password in encrypted form and will not transfer any personal " "information to third parties without explicit permission."; static const char* LicenseText = @@ -1111,7 +1111,7 @@ static void onNewCommandConfirmed(Console* console) done = true; } - if(done) printBack(console, "\nnew cart is created"); + if(done) printBack(console, "\nnew cart has been created"); else printError(console, "\ncart not created"); commandDone(console); @@ -3175,7 +3175,7 @@ static void processCommand(Console* console, const char* text) if(command) { printLine(console); - printError(console, "unknown command:"); + printError(console, "unknown command: "); printError(console, command); commandDone(console); } From 206f83201de5ecf31ec3157137c7b6bb342d14e1 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Mon, 6 Dec 2021 18:45:37 +0100 Subject: [PATCH 126/379] Actions: Install Ruby where not present --- .github/workflows/build.yml | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6da14ce4a..06461ea67 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -46,6 +50,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -69,6 +77,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -98,6 +110,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -121,6 +137,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -145,6 +165,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Install run: | sudo apt-get update @@ -179,6 +203,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Install run: | sudo apt-get update @@ -220,6 +248,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build run: | cd build @@ -256,6 +288,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Prebuild run: | cd vendor/circle-stdlib @@ -306,6 +342,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Prebuild run: | cd vendor/circle-stdlib @@ -359,6 +399,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build run: | cd build @@ -454,6 +498,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build run: | cd build/android @@ -478,6 +526,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build run: | cd build From 6c798fde676ff7431c30fcd14fa8839a602b87ac Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Mon, 6 Dec 2021 16:15:07 -0500 Subject: [PATCH 127/379] sdl: Fix warnings of string.h missing This change fixes a few implicit declaration warnings in the SDL player. --- src/system/sdl/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index dbb14d6e0..ab816f25a 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -25,6 +25,7 @@ #include #include +#include #include #if defined(CRT_SHADER_SUPPORT) @@ -1772,4 +1773,4 @@ int fcntl64(int fd, int cmd) return fcntl(fd, cmd); } -#endif \ No newline at end of file +#endif From 7afc231d71482a15e36d4e9d70f8b8a483474f6c Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Mon, 6 Dec 2021 23:56:40 +0100 Subject: [PATCH 128/379] Honor Windows MRuby static exts --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa5eb4f4d..b17bff53f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,7 +243,7 @@ else() set(MRUBY_TARGET host) set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) endif() -set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) +set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby${CMAKE_STATIC_LIBRARY_SUFFIX}) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} From 415a6f31c16d328e36a711d943b1cadb06077183 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 00:40:49 +0100 Subject: [PATCH 129/379] Build mruby with /MT on Windows --- CMakeLists.txt | 3 +++ tic_mruby_build_config.rb | 2 ++ 2 files changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b17bff53f..bed366e55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,6 +261,9 @@ set_property(TARGET mruby APPEND set_property(TARGET mruby APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include ) +if(WIN32) + target_link_libraries(mruby INTERFACE ws2_32.lib wsock32.lib) +endif() add_dependencies(mruby mruby_vendor) ################################ diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb index 6f0051c40..83682cdf4 100644 --- a/tic_mruby_build_config.rb +++ b/tic_mruby_build_config.rb @@ -19,6 +19,8 @@ # C compiler settings conf.cc do |cc| cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + cc.flags.delete '/MD' if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + cc.flags << '/MT' if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] # cc.command = ENV['CC'] || 'gcc' # cc.flags = [ENV['CFLAGS'] || %w()] # cc.include_paths = ["#{root}/include"] From 9c3ae71dc6d16874a7fa45d4462321871452b238 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 08:45:19 +0100 Subject: [PATCH 130/379] Force mruby to use .a suffix for static libraries Github Actions seems to also prefer the UNIX-native prefix on Windows CMake --- CMakeLists.txt | 2 +- tic_mruby_build_config.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bed366e55..7017a5fca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,7 +243,7 @@ else() set(MRUBY_TARGET host) set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) endif() -set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby${CMAKE_STATIC_LIBRARY_SUFFIX}) +set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb index 83682cdf4..5fabe69ef 100644 --- a/tic_mruby_build_config.rb +++ b/tic_mruby_build_config.rb @@ -72,6 +72,7 @@ # exts.executable = '' # '.exe' if Windows # exts.library = '.a' # end + conf.exts.library = '.a' # file separator # conf.file_separator = '/' From 2e96ab6825e875dc3866d73e745441565c083160 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 16:01:01 +0100 Subject: [PATCH 131/379] Do not build redundant mrbgems Created a gembox containing only useful gems --- tic.gembox | 8 ++++++++ tic_mruby_build_config.rb | 2 +- tic_mruby_wasm_build_config.rb | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 tic.gembox diff --git a/tic.gembox b/tic.gembox new file mode 100644 index 000000000..87a0c4394 --- /dev/null +++ b/tic.gembox @@ -0,0 +1,8 @@ +MRuby::GemBox.new do |conf| + conf.gembox "stdlib" + conf.gembox "stdlib-ext" + conf.gembox "stdlib-io" + conf.gembox "math" + conf.gembox "metaprog" +end +# vim: set ft=ruby : diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb index 5fabe69ef..1afedef17 100644 --- a/tic_mruby_build_config.rb +++ b/tic_mruby_build_config.rb @@ -14,7 +14,7 @@ # conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v' # include the GEM box - conf.gembox 'default' + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) # C compiler settings conf.cc do |cc| diff --git a/tic_mruby_wasm_build_config.rb b/tic_mruby_wasm_build_config.rb index 92b19d49b..b3c1f85fa 100644 --- a/tic_mruby_wasm_build_config.rb +++ b/tic_mruby_wasm_build_config.rb @@ -11,7 +11,7 @@ toolchain :emscripten # include the GEM box - conf.gembox 'default' + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) conf.enable_bintest conf.enable_test From 7ff88273a531fab824097b8c9339a489c09a3d12 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 16:02:00 +0100 Subject: [PATCH 132/379] Infer mruby CFLAGS from CMake --- tic_mruby_build_config.rb | 6 ++---- tic_mruby_wasm_build_config.rb | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb index 1afedef17..b96eb8f65 100644 --- a/tic_mruby_build_config.rb +++ b/tic_mruby_build_config.rb @@ -18,11 +18,9 @@ # C compiler settings conf.cc do |cc| - cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - cc.flags.delete '/MD' if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - cc.flags << '/MT' if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] # cc.command = ENV['CC'] || 'gcc' - # cc.flags = [ENV['CFLAGS'] || %w()] + cc.flags = [ENV['CFLAGS'] || %w()] + cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] # cc.include_paths = ["#{root}/include"] # cc.defines = %w() # cc.option_include_path = %q[-I"%s"] diff --git a/tic_mruby_wasm_build_config.rb b/tic_mruby_wasm_build_config.rb index b3c1f85fa..a97d8a906 100644 --- a/tic_mruby_wasm_build_config.rb +++ b/tic_mruby_wasm_build_config.rb @@ -12,6 +12,10 @@ # include the GEM box conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + conf.cc do |cc| + cc.flags = [ENV['CFLAGS'] || %w()] + end conf.enable_bintest conf.enable_test From 1a8bf8330ecfcfe83082476282156a867796d8a8 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 16:42:57 +0100 Subject: [PATCH 133/379] Pass CMake flags to MRuby cross target --- CMakeLists.txt | 31 ++++++++----- mruby/.gitignore | 1 + tic.gembox => mruby/tic.gembox | 0 mruby/tic_default.rb | 52 +++++++++++++++++++++ tic_mruby_build_config.rb | 82 ---------------------------------- tic_mruby_wasm_build_config.rb | 22 --------- 6 files changed, 72 insertions(+), 116 deletions(-) create mode 100644 mruby/.gitignore rename tic.gembox => mruby/tic.gembox (100%) create mode 100644 mruby/tic_default.rb delete mode 100644 tic_mruby_build_config.rb delete mode 100644 tic_mruby_wasm_build_config.rb diff --git a/CMakeLists.txt b/CMakeLists.txt index 7017a5fca..d8a39d46c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,9 @@ string(TIMESTAMP VERSION_YEAR "%Y") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VERSION_BUILD ".dbg" ) endif() +if(CMAKE_BUILD_TYPE) + string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) +endif() find_package(Git) if(Git_FOUND) @@ -236,27 +239,31 @@ if(NOT YACC) endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) -if(EMSCRIPTEN) - set(MRUBY_TARGET wasm) - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_wasm_build_config.rb) -else() - set(MRUBY_TARGET host) - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) -endif() -set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) +set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) +set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE - BUILD_COMMAND ${RAKE} MRUBY_CONFIG=${MRUBY_CONFIG} + BUILD_COMMAND + ${CMAKE_COMMAND} -E env + "TARGET_CC=${CMAKE_C_COMPILER}" + "TARGET_CXX=${CMAKE_CXX_COMPILER}" + "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" + "TARGET_AR=${CMAKE_AR}" + "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" + "BUILD_TYPE=${BUILD_TYPE_UC}" + ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" INSTALL_COMMAND "" - BUILD_BYPRODUCTS ${MRUBY_LIBRARIES} + BUILD_BYPRODUCTS ${MRUBY_LIB} ) add_library(mruby STATIC IMPORTED GLOBAL) set_property(TARGET mruby APPEND - PROPERTY IMPORTED_LOCATION ${MRUBY_LIBRARIES} + PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} ) set_property(TARGET mruby APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include @@ -537,7 +544,7 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIBRARIES}) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIB}) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} diff --git a/mruby/.gitignore b/mruby/.gitignore new file mode 100644 index 000000000..63f1fef0e --- /dev/null +++ b/mruby/.gitignore @@ -0,0 +1 @@ +*.lock diff --git a/tic.gembox b/mruby/tic.gembox similarity index 100% rename from tic.gembox rename to mruby/tic.gembox diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb new file mode 100644 index 000000000..231699459 --- /dev/null +++ b/mruby/tic_default.rb @@ -0,0 +1,52 @@ +MRuby::Build.new do |conf| + # load specific toolchain settings + conf.toolchain + + # include the GEM box + conf.gembox 'default' + + conf.enable_bintest + conf.enable_test +end + +MRuby::Toolchain.new('target') do |conf| + toolchain :clang + + conf.cc.command = ENV['TARGET_CC'] || 'cc' + conf.cxx.command = ENV['TARGET_CXX'] || 'cxx' + conf.linker.command = ENV['TARGET_LD'] || 'ld' + conf.archiver.command = ENV['TARGET_AR'] || 'ar' +end + +MRuby::CrossBuild.new('target') do |conf| + # load specific toolchain settings + toolchain :target + + # include the GEM box + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + # C compiler settings + conf.cc do |cc| + cc.flags = [ENV["TARGET_CFLAGS"] || %w()] + unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + cc.flags << '-fPIC' + end + end + + # Linker settings + conf.linker do |linker| + linker.flags = [ENV['TARGET_LDFLAGS'] || []] + end + + # file extensions + conf.exts do |exts| + exts.object = '.o' + exts.library = '.a' + # exts.executable = '' # '.exe' if Windows + end + + # Turn on `enable_debug` for better debugging + conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] + conf.enable_bintest + conf.enable_test +end diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb deleted file mode 100644 index b96eb8f65..000000000 --- a/tic_mruby_build_config.rb +++ /dev/null @@ -1,82 +0,0 @@ -MRuby::Build.new do |conf| - # load specific toolchain settings - conf.toolchain - - # Use mrbgems - # conf.gem 'examples/mrbgems/ruby_extension_example' - # conf.gem 'examples/mrbgems/c_extension_example' do |g| - # g.cc.flags << '-g' # append cflags in this gem - # end - # conf.gem 'examples/mrbgems/c_and_ruby_extension_example' - # conf.gem :core => 'mruby-eval' - # conf.gem :mgem => 'mruby-onig-regexp' - # conf.gem :github => 'mattn/mruby-onig-regexp' - # conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v' - - # include the GEM box - conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - - # C compiler settings - conf.cc do |cc| - # cc.command = ENV['CC'] || 'gcc' - cc.flags = [ENV['CFLAGS'] || %w()] - cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - # cc.include_paths = ["#{root}/include"] - # cc.defines = %w() - # cc.option_include_path = %q[-I"%s"] - # cc.option_define = '-D%s' - # cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] - end - - # mrbc settings - # conf.mrbc do |mrbc| - # mrbc.compile_options = "-g -B%{funcname} -o-" # The -g option is required for line numbers - # end - - # Linker settings - # conf.linker do |linker| - # linker.command = ENV['LD'] || 'gcc' - # linker.flags = [ENV['LDFLAGS'] || []] - # linker.flags_before_libraries = [] - # linker.libraries = %w() - # linker.flags_after_libraries = [] - # linker.library_paths = [] - # linker.option_library = '-l%s' - # linker.option_library_path = '-L%s' - # linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}" - # end - - # Archiver settings - # conf.archiver do |archiver| - # archiver.command = ENV['AR'] || 'ar' - # archiver.archive_options = 'rs "%{outfile}" %{objs}' - # end - - # Parser generator settings - # conf.yacc do |yacc| - # yacc.command = ENV['YACC'] || 'bison' - # yacc.compile_options = %q[-o "%{outfile}" "%{infile}"] - # end - - # gperf settings - # conf.gperf do |gperf| - # gperf.command = 'gperf' - # gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"] - # end - - # file extensions - # conf.exts do |exts| - # exts.object = '.o' - # exts.executable = '' # '.exe' if Windows - # exts.library = '.a' - # end - conf.exts.library = '.a' - - # file separator - # conf.file_separator = '/' - - # Turn on `enable_debug` for better debugging - # conf.enable_debug - conf.enable_bintest - conf.enable_test -end diff --git a/tic_mruby_wasm_build_config.rb b/tic_mruby_wasm_build_config.rb deleted file mode 100644 index a97d8a906..000000000 --- a/tic_mruby_wasm_build_config.rb +++ /dev/null @@ -1,22 +0,0 @@ -MRuby::Toolchain.new('emscripten') do |conf| - toolchain :clang - - conf.cc.command = 'emcc' - conf.cxx.command = 'emcc' - conf.linker.command = 'emcc' - conf.archiver.command = 'emar' -end - -MRuby::CrossBuild.new('wasm') do |conf| - toolchain :emscripten - - # include the GEM box - conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - - conf.cc do |cc| - cc.flags = [ENV['CFLAGS'] || %w()] - end - - conf.enable_bintest - conf.enable_test -end From a883fc91f5134df897b0dcb388663d79cef2e8e7 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 17:55:17 +0100 Subject: [PATCH 134/379] Revert "Pass CMake flags to MRuby cross target" This reverts commit 1a8bf8330ecfcfe83082476282156a867796d8a8. It turns out that wrapping CMake's poor cross build support was not a good idea after all. --- CMakeLists.txt | 31 +++++-------- mruby/.gitignore | 1 - mruby/tic_default.rb | 52 --------------------- mruby/tic.gembox => tic.gembox | 0 tic_mruby_build_config.rb | 82 ++++++++++++++++++++++++++++++++++ tic_mruby_wasm_build_config.rb | 22 +++++++++ 6 files changed, 116 insertions(+), 72 deletions(-) delete mode 100644 mruby/.gitignore delete mode 100644 mruby/tic_default.rb rename mruby/tic.gembox => tic.gembox (100%) create mode 100644 tic_mruby_build_config.rb create mode 100644 tic_mruby_wasm_build_config.rb diff --git a/CMakeLists.txt b/CMakeLists.txt index d8a39d46c..7017a5fca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,9 +9,6 @@ string(TIMESTAMP VERSION_YEAR "%Y") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VERSION_BUILD ".dbg" ) endif() -if(CMAKE_BUILD_TYPE) - string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) -endif() find_package(Git) if(Git_FOUND) @@ -239,31 +236,27 @@ if(NOT YACC) endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) -set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) -set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) +if(EMSCRIPTEN) + set(MRUBY_TARGET wasm) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_wasm_build_config.rb) +else() + set(MRUBY_TARGET host) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) +endif() +set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE - BUILD_COMMAND - ${CMAKE_COMMAND} -E env - "TARGET_CC=${CMAKE_C_COMPILER}" - "TARGET_CXX=${CMAKE_CXX_COMPILER}" - "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" - "TARGET_AR=${CMAKE_AR}" - "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" - "TARGET_CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}" - "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" - "BUILD_TYPE=${BUILD_TYPE_UC}" - ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" + BUILD_COMMAND ${RAKE} MRUBY_CONFIG=${MRUBY_CONFIG} INSTALL_COMMAND "" - BUILD_BYPRODUCTS ${MRUBY_LIB} + BUILD_BYPRODUCTS ${MRUBY_LIBRARIES} ) add_library(mruby STATIC IMPORTED GLOBAL) set_property(TARGET mruby APPEND - PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} + PROPERTY IMPORTED_LOCATION ${MRUBY_LIBRARIES} ) set_property(TARGET mruby APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include @@ -544,7 +537,7 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIB}) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIBRARIES}) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} diff --git a/mruby/.gitignore b/mruby/.gitignore deleted file mode 100644 index 63f1fef0e..000000000 --- a/mruby/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.lock diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb deleted file mode 100644 index 231699459..000000000 --- a/mruby/tic_default.rb +++ /dev/null @@ -1,52 +0,0 @@ -MRuby::Build.new do |conf| - # load specific toolchain settings - conf.toolchain - - # include the GEM box - conf.gembox 'default' - - conf.enable_bintest - conf.enable_test -end - -MRuby::Toolchain.new('target') do |conf| - toolchain :clang - - conf.cc.command = ENV['TARGET_CC'] || 'cc' - conf.cxx.command = ENV['TARGET_CXX'] || 'cxx' - conf.linker.command = ENV['TARGET_LD'] || 'ld' - conf.archiver.command = ENV['TARGET_AR'] || 'ar' -end - -MRuby::CrossBuild.new('target') do |conf| - # load specific toolchain settings - toolchain :target - - # include the GEM box - conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - - # C compiler settings - conf.cc do |cc| - cc.flags = [ENV["TARGET_CFLAGS"] || %w()] - unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - cc.flags << '-fPIC' - end - end - - # Linker settings - conf.linker do |linker| - linker.flags = [ENV['TARGET_LDFLAGS'] || []] - end - - # file extensions - conf.exts do |exts| - exts.object = '.o' - exts.library = '.a' - # exts.executable = '' # '.exe' if Windows - end - - # Turn on `enable_debug` for better debugging - conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] - conf.enable_bintest - conf.enable_test -end diff --git a/mruby/tic.gembox b/tic.gembox similarity index 100% rename from mruby/tic.gembox rename to tic.gembox diff --git a/tic_mruby_build_config.rb b/tic_mruby_build_config.rb new file mode 100644 index 000000000..b96eb8f65 --- /dev/null +++ b/tic_mruby_build_config.rb @@ -0,0 +1,82 @@ +MRuby::Build.new do |conf| + # load specific toolchain settings + conf.toolchain + + # Use mrbgems + # conf.gem 'examples/mrbgems/ruby_extension_example' + # conf.gem 'examples/mrbgems/c_extension_example' do |g| + # g.cc.flags << '-g' # append cflags in this gem + # end + # conf.gem 'examples/mrbgems/c_and_ruby_extension_example' + # conf.gem :core => 'mruby-eval' + # conf.gem :mgem => 'mruby-onig-regexp' + # conf.gem :github => 'mattn/mruby-onig-regexp' + # conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v' + + # include the GEM box + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + # C compiler settings + conf.cc do |cc| + # cc.command = ENV['CC'] || 'gcc' + cc.flags = [ENV['CFLAGS'] || %w()] + cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + # cc.include_paths = ["#{root}/include"] + # cc.defines = %w() + # cc.option_include_path = %q[-I"%s"] + # cc.option_define = '-D%s' + # cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] + end + + # mrbc settings + # conf.mrbc do |mrbc| + # mrbc.compile_options = "-g -B%{funcname} -o-" # The -g option is required for line numbers + # end + + # Linker settings + # conf.linker do |linker| + # linker.command = ENV['LD'] || 'gcc' + # linker.flags = [ENV['LDFLAGS'] || []] + # linker.flags_before_libraries = [] + # linker.libraries = %w() + # linker.flags_after_libraries = [] + # linker.library_paths = [] + # linker.option_library = '-l%s' + # linker.option_library_path = '-L%s' + # linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}" + # end + + # Archiver settings + # conf.archiver do |archiver| + # archiver.command = ENV['AR'] || 'ar' + # archiver.archive_options = 'rs "%{outfile}" %{objs}' + # end + + # Parser generator settings + # conf.yacc do |yacc| + # yacc.command = ENV['YACC'] || 'bison' + # yacc.compile_options = %q[-o "%{outfile}" "%{infile}"] + # end + + # gperf settings + # conf.gperf do |gperf| + # gperf.command = 'gperf' + # gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"] + # end + + # file extensions + # conf.exts do |exts| + # exts.object = '.o' + # exts.executable = '' # '.exe' if Windows + # exts.library = '.a' + # end + conf.exts.library = '.a' + + # file separator + # conf.file_separator = '/' + + # Turn on `enable_debug` for better debugging + # conf.enable_debug + conf.enable_bintest + conf.enable_test +end diff --git a/tic_mruby_wasm_build_config.rb b/tic_mruby_wasm_build_config.rb new file mode 100644 index 000000000..a97d8a906 --- /dev/null +++ b/tic_mruby_wasm_build_config.rb @@ -0,0 +1,22 @@ +MRuby::Toolchain.new('emscripten') do |conf| + toolchain :clang + + conf.cc.command = 'emcc' + conf.cxx.command = 'emcc' + conf.linker.command = 'emcc' + conf.archiver.command = 'emar' +end + +MRuby::CrossBuild.new('wasm') do |conf| + toolchain :emscripten + + # include the GEM box + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + conf.cc do |cc| + cc.flags = [ENV['CFLAGS'] || %w()] + end + + conf.enable_bintest + conf.enable_test +end From d6a7fde790805b3fd7b479bec72c7b821a5e7d47 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 18:09:22 +0100 Subject: [PATCH 135/379] Refactor mruby build configuration sets --- CMakeLists.txt | 7 +-- mruby/.gitignore | 1 + tic.gembox => mruby/tic.gembox | 0 .../tic_mruby_host_build_config.rb | 44 ++++++++----------- .../tic_mruby_wasm_build_config.rb | 8 +++- 5 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 mruby/.gitignore rename tic.gembox => mruby/tic.gembox (100%) rename tic_mruby_build_config.rb => mruby/tic_mruby_host_build_config.rb (62%) rename tic_mruby_wasm_build_config.rb => mruby/tic_mruby_wasm_build_config.rb (69%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7017a5fca..0f75716dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,18 +238,19 @@ endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) if(EMSCRIPTEN) set(MRUBY_TARGET wasm) - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_wasm_build_config.rb) else() set(MRUBY_TARGET host) - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/tic_mruby_build_config.rb) endif() +set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_mruby_${MRUBY_TARGET}_build_config.rb) set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE - BUILD_COMMAND ${RAKE} MRUBY_CONFIG=${MRUBY_CONFIG} + BUILD_COMMAND ${CMAKE_COMMAND} -E env + "BUILD_TYPE=${CMAKE_BUILD_TYPE}" + ${RAKE} MRUBY_CONFIG=${MRUBY_CONFIG} INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIBRARIES} ) diff --git a/mruby/.gitignore b/mruby/.gitignore new file mode 100644 index 000000000..63f1fef0e --- /dev/null +++ b/mruby/.gitignore @@ -0,0 +1 @@ +*.lock diff --git a/tic.gembox b/mruby/tic.gembox similarity index 100% rename from tic.gembox rename to mruby/tic.gembox diff --git a/tic_mruby_build_config.rb b/mruby/tic_mruby_host_build_config.rb similarity index 62% rename from tic_mruby_build_config.rb rename to mruby/tic_mruby_host_build_config.rb index b96eb8f65..0ce1f95b9 100644 --- a/tic_mruby_build_config.rb +++ b/mruby/tic_mruby_host_build_config.rb @@ -2,30 +2,25 @@ # load specific toolchain settings conf.toolchain - # Use mrbgems - # conf.gem 'examples/mrbgems/ruby_extension_example' - # conf.gem 'examples/mrbgems/c_extension_example' do |g| - # g.cc.flags << '-g' # append cflags in this gem - # end - # conf.gem 'examples/mrbgems/c_and_ruby_extension_example' - # conf.gem :core => 'mruby-eval' - # conf.gem :mgem => 'mruby-onig-regexp' - # conf.gem :github => 'mattn/mruby-onig-regexp' - # conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v' - # include the GEM box conf.gembox File.expand_path('tic', File.dirname(__FILE__)) # C compiler settings conf.cc do |cc| - # cc.command = ENV['CC'] || 'gcc' - cc.flags = [ENV['CFLAGS'] || %w()] cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - # cc.include_paths = ["#{root}/include"] - # cc.defines = %w() - # cc.option_include_path = %q[-I"%s"] - # cc.option_define = '-D%s' - # cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] + + case ENV['BUILD_CONFIG'].upcase + when /DEBUG/ + unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + cc.flags << '-g' + end + else + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + cc.flags << '/O1' + else + cc.flags << '-Os' + end + end end # mrbc settings @@ -65,18 +60,17 @@ # end # file extensions - # conf.exts do |exts| - # exts.object = '.o' - # exts.executable = '' # '.exe' if Windows - # exts.library = '.a' - # end - conf.exts.library = '.a' + conf.exts do |exts| + exts.object = '.o' + exts.library = '.a' + # exts.executable = '' # '.exe' if Windows + end # file separator # conf.file_separator = '/' # Turn on `enable_debug` for better debugging - # conf.enable_debug + conf.enable_debug if /DEBUG/ =~ ENV['BUILD_CONFIG'].upcase conf.enable_bintest conf.enable_test end diff --git a/tic_mruby_wasm_build_config.rb b/mruby/tic_mruby_wasm_build_config.rb similarity index 69% rename from tic_mruby_wasm_build_config.rb rename to mruby/tic_mruby_wasm_build_config.rb index a97d8a906..4a02cdd1d 100644 --- a/tic_mruby_wasm_build_config.rb +++ b/mruby/tic_mruby_wasm_build_config.rb @@ -14,9 +14,15 @@ conf.gembox File.expand_path('tic', File.dirname(__FILE__)) conf.cc do |cc| - cc.flags = [ENV['CFLAGS'] || %w()] + case ENV['BUILD_CONFIG'].upcase + when /DEBUG/ + cc.flags << '-g' + else + cc.flags << '-Os' + end end + conf.enable_debug if /DEBUG/ =~ ENV['BUILD_CONFIG'].upcase conf.enable_bintest conf.enable_test end From fdd3ef9496d1debfaeb694e6f0db8356c401de83 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 19:47:47 +0100 Subject: [PATCH 136/379] mruby toolchain switching from CMake --- CMakeLists.txt | 32 ++++++++---- mruby/tic_default.rb | 58 +++++++++++++++++++++ mruby/tic_mruby_host_build_config.rb | 76 ---------------------------- mruby/tic_mruby_wasm_build_config.rb | 28 ---------- 4 files changed, 79 insertions(+), 115 deletions(-) create mode 100644 mruby/tic_default.rb delete mode 100644 mruby/tic_mruby_host_build_config.rb delete mode 100644 mruby/tic_mruby_wasm_build_config.rb diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f75716dc..d6c36bd42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,9 @@ string(TIMESTAMP VERSION_YEAR "%Y") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VERSION_BUILD ".dbg" ) endif() +if(CMAKE_BUILD_TYPE) + string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) +endif() find_package(Git) if(Git_FOUND) @@ -236,28 +239,35 @@ if(NOT YACC) endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) +set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) +set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) if(EMSCRIPTEN) - set(MRUBY_TARGET wasm) -else() - set(MRUBY_TARGET host) + set(MRUBY_TOOLCHAIN emscripten) endif() -set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_mruby_${MRUBY_TARGET}_build_config.rb) -set(MRUBY_LIBRARIES ${MRUBY_DIR}/build/${MRUBY_TARGET}/lib/libmruby.a) ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE - BUILD_COMMAND ${CMAKE_COMMAND} -E env - "BUILD_TYPE=${CMAKE_BUILD_TYPE}" - ${RAKE} MRUBY_CONFIG=${MRUBY_CONFIG} + BUILD_COMMAND + ${CMAKE_COMMAND} -E env + "TARGET_CC=${CMAKE_C_COMPILER}" + "TARGET_CXX=${CMAKE_CXX_COMPILER}" + "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" + "TARGET_AR=${CMAKE_AR}" + "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" + "BUILD_TYPE=${BUILD_TYPE_UC}" + "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" + ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" INSTALL_COMMAND "" - BUILD_BYPRODUCTS ${MRUBY_LIBRARIES} + BUILD_BYPRODUCTS ${MRUBY_LIB} ) add_library(mruby STATIC IMPORTED GLOBAL) set_property(TARGET mruby APPEND - PROPERTY IMPORTED_LOCATION ${MRUBY_LIBRARIES} + PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} ) set_property(TARGET mruby APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include @@ -538,7 +548,7 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIBRARIES}) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIB}) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb new file mode 100644 index 000000000..114132422 --- /dev/null +++ b/mruby/tic_default.rb @@ -0,0 +1,58 @@ +MRuby::Build.new do |conf| + # load specific toolchain settings + conf.toolchain + + # include the GEM box + conf.gembox 'default' + + conf.enable_bintest + conf.enable_test +end + +MRuby::Toolchain.new('emscripten') do |conf| + toolchain :clang + + conf.cc.command = ENV['TARGET_CC'] || 'emcc' + conf.cxx.command = ENV['TARGET_CXX'] || 'emcc' + conf.linker.command = ENV['TARGET_LD'] || 'emcc' + conf.archiver.command = ENV['TARGET_AR'] || 'emar' +end + +BuildClazz = (ENV['MRUBY_TOOLCHAIN'] || '').empty? ? MRuby::Build : MRuby::CrossBuild + +BuildClazz.new('target') do |conf| + # load specific toolchain settings + if (ENV['MRUBY_TOOLCHAIN'] || '').empty? + conf.toolchain + else + toolchain ENV['MRUBY_TOOLCHAIN'] + end + + # include the GEM box + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + # C compiler settings + conf.cc do |cc| + cc.flags = [ENV["TARGET_CFLAGS"] || %w()] + unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + cc.flags << '-fPIC' + end + end + + # Linker settings + conf.linker do |linker| + linker.flags = [ENV['TARGET_LDFLAGS'] || []] + end + + # file extensions + conf.exts do |exts| + exts.object = '.o' + exts.library = '.a' + # exts.executable = '' # '.exe' if Windows + end + + # Turn on `enable_debug` for better debugging + conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] + conf.enable_bintest + conf.enable_test +end diff --git a/mruby/tic_mruby_host_build_config.rb b/mruby/tic_mruby_host_build_config.rb deleted file mode 100644 index 0ce1f95b9..000000000 --- a/mruby/tic_mruby_host_build_config.rb +++ /dev/null @@ -1,76 +0,0 @@ -MRuby::Build.new do |conf| - # load specific toolchain settings - conf.toolchain - - # include the GEM box - conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - - # C compiler settings - conf.cc do |cc| - cc.flags << '-fPIC' unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - - case ENV['BUILD_CONFIG'].upcase - when /DEBUG/ - unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - cc.flags << '-g' - end - else - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - cc.flags << '/O1' - else - cc.flags << '-Os' - end - end - end - - # mrbc settings - # conf.mrbc do |mrbc| - # mrbc.compile_options = "-g -B%{funcname} -o-" # The -g option is required for line numbers - # end - - # Linker settings - # conf.linker do |linker| - # linker.command = ENV['LD'] || 'gcc' - # linker.flags = [ENV['LDFLAGS'] || []] - # linker.flags_before_libraries = [] - # linker.libraries = %w() - # linker.flags_after_libraries = [] - # linker.library_paths = [] - # linker.option_library = '-l%s' - # linker.option_library_path = '-L%s' - # linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}" - # end - - # Archiver settings - # conf.archiver do |archiver| - # archiver.command = ENV['AR'] || 'ar' - # archiver.archive_options = 'rs "%{outfile}" %{objs}' - # end - - # Parser generator settings - # conf.yacc do |yacc| - # yacc.command = ENV['YACC'] || 'bison' - # yacc.compile_options = %q[-o "%{outfile}" "%{infile}"] - # end - - # gperf settings - # conf.gperf do |gperf| - # gperf.command = 'gperf' - # gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"] - # end - - # file extensions - conf.exts do |exts| - exts.object = '.o' - exts.library = '.a' - # exts.executable = '' # '.exe' if Windows - end - - # file separator - # conf.file_separator = '/' - - # Turn on `enable_debug` for better debugging - conf.enable_debug if /DEBUG/ =~ ENV['BUILD_CONFIG'].upcase - conf.enable_bintest - conf.enable_test -end diff --git a/mruby/tic_mruby_wasm_build_config.rb b/mruby/tic_mruby_wasm_build_config.rb deleted file mode 100644 index 4a02cdd1d..000000000 --- a/mruby/tic_mruby_wasm_build_config.rb +++ /dev/null @@ -1,28 +0,0 @@ -MRuby::Toolchain.new('emscripten') do |conf| - toolchain :clang - - conf.cc.command = 'emcc' - conf.cxx.command = 'emcc' - conf.linker.command = 'emcc' - conf.archiver.command = 'emar' -end - -MRuby::CrossBuild.new('wasm') do |conf| - toolchain :emscripten - - # include the GEM box - conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - - conf.cc do |cc| - case ENV['BUILD_CONFIG'].upcase - when /DEBUG/ - cc.flags << '-g' - else - cc.flags << '-Os' - end - end - - conf.enable_debug if /DEBUG/ =~ ENV['BUILD_CONFIG'].upcase - conf.enable_bintest - conf.enable_test -end From 5b2cd1d1f4f0a416932e80f88b35216ac09db399 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 20:09:48 +0100 Subject: [PATCH 137/379] Guess CMAKE_COMMAND on Windows OS --- CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d6c36bd42..d4908fbd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,10 +9,17 @@ string(TIMESTAMP VERSION_YEAR "%Y") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VERSION_BUILD ".dbg" ) endif() + if(CMAKE_BUILD_TYPE) string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) endif() +if(WIN32) + set(CMAKE_EXE "cmake") +else() + set(CMAKE_EXE "${CMAKE_COMMAND}") +endif() + find_package(Git) if(Git_FOUND) execute_process( @@ -250,7 +257,7 @@ ExternalProject_Add(mruby_vendor CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE BUILD_COMMAND - ${CMAKE_COMMAND} -E env + ${CMAKE_EXE} -E env "TARGET_CC=${CMAKE_C_COMPILER}" "TARGET_CXX=${CMAKE_CXX_COMPILER}" "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" From 5423701c8c7e33dd9a35f2d0c805dce895779829 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 20:16:43 +0100 Subject: [PATCH 138/379] [mruby] Delegate ENV passing to rake invocation CMake's env helper is broken on Windows OS :/ --- CMakeLists.txt | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d4908fbd0..bb3bd559d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,12 +14,6 @@ if(CMAKE_BUILD_TYPE) string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) endif() -if(WIN32) - set(CMAKE_EXE "cmake") -else() - set(CMAKE_EXE "${CMAKE_COMMAND}") -endif() - find_package(Git) if(Git_FOUND) execute_process( @@ -257,17 +251,16 @@ ExternalProject_Add(mruby_vendor CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE BUILD_COMMAND - ${CMAKE_EXE} -E env - "TARGET_CC=${CMAKE_C_COMPILER}" - "TARGET_CXX=${CMAKE_CXX_COMPILER}" - "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" - "TARGET_AR=${CMAKE_AR}" - "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" - "TARGET_CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}" - "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" - "BUILD_TYPE=${BUILD_TYPE_UC}" - "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" + "TARGET_CC=${CMAKE_C_COMPILER}" + "TARGET_CXX=${CMAKE_CXX_COMPILER}" + "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" + "TARGET_AR=${CMAKE_AR}" + "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" + "BUILD_TYPE=${BUILD_TYPE_UC}" + "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} ) From bc190dae6b0bfb73922d89de61caf8b7096ef08a Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Tue, 7 Dec 2021 22:36:18 +0100 Subject: [PATCH 139/379] Enforce certain mruby toolchains from CMake side --- CMakeLists.txt | 4 ++++ mruby/tic_default.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb3bd559d..6a407eb32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,6 +244,9 @@ set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) if(EMSCRIPTEN) set(MRUBY_TOOLCHAIN emscripten) + set(MRUBY_CROSS_TOOLCHAIN emscripten) +elseif(MSVC) + set(MRUBY_TOOLCHAIN visualcpp) endif() ExternalProject_Add(mruby_vendor @@ -261,6 +264,7 @@ ExternalProject_Add(mruby_vendor "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" "BUILD_TYPE=${BUILD_TYPE_UC}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" + "MRUBY_CROSS_TOOLCHAIN=${MRUBY_CROSS_TOOLCHAIN}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} ) diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index 114132422..bb4234de8 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -18,7 +18,7 @@ conf.archiver.command = ENV['TARGET_AR'] || 'emar' end -BuildClazz = (ENV['MRUBY_TOOLCHAIN'] || '').empty? ? MRuby::Build : MRuby::CrossBuild +BuildClazz = (ENV['MRUBY_CROSS_TOOLCHAIN'] || '').empty? ? MRuby::Build : MRuby::CrossBuild BuildClazz.new('target') do |conf| # load specific toolchain settings From a04c8d96a2f405998706fba0043017eb48b3b0f3 Mon Sep 17 00:00:00 2001 From: jdgleaver Date: Tue, 7 Dec 2021 14:06:46 +0000 Subject: [PATCH 140/379] Fix and re-enable OpenDingux builds --- src/cart.c | 4 ++++ src/core/core.c | 4 ++++ src/core/io.c | 6 +++++- src/core/sound.c | 4 ++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/cart.c b/src/cart.c index 239bd2111..dbe2dff28 100644 --- a/src/cart.c +++ b/src/cart.c @@ -31,6 +31,10 @@ #include #include +#if defined(DINGUX) && !defined(static_assert) +#define static_assert _Static_assert +#endif + typedef enum { CHUNK_DUMMY, // 0 diff --git a/src/core/core.c b/src/core/core.c index d35336c86..fc2aeff33 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -33,6 +33,10 @@ #include #include +#if defined(DINGUX) && !defined(static_assert) +#define static_assert _Static_assert +#endif + #ifdef _3DS #include <3ds.h> #endif diff --git a/src/core/io.c b/src/core/io.c index 06fa82672..0267f2598 100644 --- a/src/core/io.c +++ b/src/core/io.c @@ -25,6 +25,10 @@ #include +#if defined(DINGUX) && !defined(static_assert) +#define static_assert _Static_assert +#endif + static_assert(sizeof(tic80_input) == 12, "tic80_input"); static bool isKeyPressed(const tic80_keyboard* input, tic_key key) @@ -155,4 +159,4 @@ void tic_core_tick_io(tic_mem* memory) if (prevDown && down) (*hold)++; else *hold = 0; } -} \ No newline at end of file +} diff --git a/src/core/sound.c b/src/core/sound.c index 7f32a9731..cea195d45 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -27,6 +27,10 @@ #include #include +#if defined(DINGUX) && !defined(static_assert) +#define static_assert _Static_assert +#endif + #define ENVELOPE_FREQ_SCALE 2 #define SECONDS_PER_MINUTE 60 #define NOTES_PER_MUNUTE (TIC80_FRAMERATE / NOTES_PER_BEAT * SECONDS_PER_MINUTE) From a51760968cd722b02e9e96604a2ed20e18b4b015 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 8 Dec 2021 12:17:24 +0300 Subject: [PATCH 141/379] go back to "vbank1 is always on top" #1660 --- src/core/core.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index d35336c86..9a0ee6a10 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -541,12 +541,12 @@ static inline void memset4(void* dst, u32 val, u32 dwords) static inline tic_vram* vbank0(tic_core* core) { - return &core->memory.ram.vram; + return core->state.vbank.id ? &core->state.vbank.mem : &core->memory.ram.vram; } static inline tic_vram* vbank1(tic_core* core) { - return &core->state.vbank.mem; + return core->state.vbank.id ? &core->memory.ram.vram : &core->state.vbank.mem; } static inline void updpal(tic_mem* tic, tic_blitpal* pal0, tic_blitpal* pal1) @@ -617,10 +617,12 @@ void tic_core_blit_ex(tic_mem* tic, tic_blit_callback clb) enum{OffsetY = TIC80_HEIGHT - TIC80_MARGIN_TOP}; s32 start0 = (row - vbank0(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; s32 start1 = (row - vbank1(core)->vars.offset.y + OffsetY) % TIC80_HEIGHT * TIC80_WIDTH; + s32 offsetX0 = vbank0(core)->vars.offset.x; + s32 offsetX1 = vbank1(core)->vars.offset.x; for(s32 x = TIC80_WIDTH; x != 2 * TIC80_WIDTH; ++x) - *rowPtr++ = blitpix(tic, (x - vbank0(core)->vars.offset.x) % TIC80_WIDTH + start0, - (x - vbank1(core)->vars.offset.x) % TIC80_WIDTH + start1, &pal0, &pal1); + *rowPtr++ = blitpix(tic, (x - offsetX0) % TIC80_WIDTH + start0, + (x - offsetX1) % TIC80_WIDTH + start1, &pal0, &pal1); } rowPtr += TIC80_MARGIN_RIGHT; From cf97eb4ddb89be716089c319819f82c14b08fd44 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Wed, 8 Dec 2021 17:19:28 +0100 Subject: [PATCH 142/379] Simplify mruby build system * Genericize cross compilation * Clean mruby build artifacts with make/ninja clean --- CMakeLists.txt | 26 +++++++++++++++++++------- mruby/tic_default.rb | 35 +++++++++-------------------------- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a407eb32..82604ed1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,12 +242,19 @@ endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) -if(EMSCRIPTEN) - set(MRUBY_TOOLCHAIN emscripten) - set(MRUBY_CROSS_TOOLCHAIN emscripten) -elseif(MSVC) +if(MSVC) set(MRUBY_TOOLCHAIN visualcpp) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(MRUBY_TOOLCHAIN clang) +else() + set(MRUBY_TOOLCHAIN gcc) endif() +message(NOTICE "\ +Caveat:\n\ +* mruby target (\"target\") will attempt to use the same toolchain as \ +CMake, namely \"${MRUBY_TOOLCHAIN}\".\n\ +* mruby bootstrap (\"host\") will automatically detect a usable toolchain, \ +which may be different than the one used by CMake.") ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} @@ -256,18 +263,23 @@ ExternalProject_Add(mruby_vendor BUILD_COMMAND ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" "TARGET_CC=${CMAKE_C_COMPILER}" - "TARGET_CXX=${CMAKE_CXX_COMPILER}" "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" "TARGET_AR=${CMAKE_AR}" "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" - "TARGET_CXXFLAGS=${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BUILD_TYPE_UC}}" "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" "BUILD_TYPE=${BUILD_TYPE_UC}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" - "MRUBY_CROSS_TOOLCHAIN=${MRUBY_CROSS_TOOLCHAIN}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} ) +set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + "${MRUBY_DIR}/build" + "${MRUBY_DIR}/bin" +) +set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES + "${MRUBY_DIR}/build" + "${MRUBY_DIR}/bin" +) add_library(mruby STATIC IMPORTED GLOBAL) set_property(TARGET mruby APPEND diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index bb4234de8..e2f61871b 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -1,57 +1,40 @@ MRuby::Build.new do |conf| - # load specific toolchain settings conf.toolchain - # include the GEM box conf.gembox 'default' conf.enable_bintest conf.enable_test end -MRuby::Toolchain.new('emscripten') do |conf| - toolchain :clang +MRuby::CrossBuild.new('target') do |conf| + toolchain ENV['MRUBY_TOOLCHAIN'] - conf.cc.command = ENV['TARGET_CC'] || 'emcc' - conf.cxx.command = ENV['TARGET_CXX'] || 'emcc' - conf.linker.command = ENV['TARGET_LD'] || 'emcc' - conf.archiver.command = ENV['TARGET_AR'] || 'emar' -end - -BuildClazz = (ENV['MRUBY_CROSS_TOOLCHAIN'] || '').empty? ? MRuby::Build : MRuby::CrossBuild - -BuildClazz.new('target') do |conf| - # load specific toolchain settings - if (ENV['MRUBY_TOOLCHAIN'] || '').empty? - conf.toolchain - else - toolchain ENV['MRUBY_TOOLCHAIN'] - end - - # include the GEM box conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - # C compiler settings conf.cc do |cc| + cc.command = ENV["TARGET_CC"] || 'cc' cc.flags = [ENV["TARGET_CFLAGS"] || %w()] unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] cc.flags << '-fPIC' end end - # Linker settings conf.linker do |linker| - linker.flags = [ENV['TARGET_LDFLAGS'] || []] + linker.command = ENV['TARGET_LD'] || 'ld' + linker.flags = [ENV['TARGET_LDFLAGS'] || %w()] + end + + conf.archiver do |archiver| + archiver.command = ENV['TARGET_AR'] || 'ar' end - # file extensions conf.exts do |exts| exts.object = '.o' exts.library = '.a' # exts.executable = '' # '.exe' if Windows end - # Turn on `enable_debug` for better debugging conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] conf.enable_bintest conf.enable_test From 10d6a95d060f0620a881f57b8d5b370caf50f84c Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Wed, 8 Dec 2021 20:32:51 +0100 Subject: [PATCH 143/379] Force mruby bootstrap to use MSVC where applicable --- mruby/tic_default.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index e2f61871b..f9808b188 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -1,5 +1,9 @@ MRuby::Build.new do |conf| - conf.toolchain + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + conf.toolchain + end conf.gembox 'default' From ead04541c33d9336995558597d41ca18ec15a871 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Wed, 8 Dec 2021 20:44:45 +0100 Subject: [PATCH 144/379] Fix naming in demos.c --- src/studio/demos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/studio/demos.c b/src/studio/demos.c index 2708d0ddf..6c87b86b1 100644 --- a/src/studio/demos.c +++ b/src/studio/demos.c @@ -100,7 +100,7 @@ static const u8 rubymark[] = #include "../build/assets/rubymark.tic.dat" }; -tic_script_config_extra RubySyntaxConfigExtra = +tic_script_config_extra MRubySyntaxConfigExtra = { .name = "ruby", .demoRom = RubyDemoRom, @@ -188,7 +188,7 @@ tic_script_config_extra* LanguagesExtra[] = { &JsSyntaxConfigExtra, #endif #if defined(TIC_BUILD_WITH_MRUBY) - &RubySyntaxConfigExtra, + &MRubySyntaxConfigExtra, #endif NULL }; From 92fa185cea1a12f4e448984394fbf31ec735567b Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Wed, 8 Dec 2021 21:11:45 +0100 Subject: [PATCH 145/379] Fix incorrect mruby x-compilation logic --- mruby/tic_default.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index f9808b188..2d6493943 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -19,9 +19,7 @@ conf.cc do |cc| cc.command = ENV["TARGET_CC"] || 'cc' cc.flags = [ENV["TARGET_CFLAGS"] || %w()] - unless ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - cc.flags << '-fPIC' - end + cc.flags << '-fPIC' unless ENV['MRUBY_TOOLCHAIN'] == 'visualcpp' end conf.linker do |linker| From 325391e84e80e3e88959a6d884b4c4fc3194d06a Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Wed, 8 Dec 2021 21:43:54 +0100 Subject: [PATCH 146/379] Use TARGET_CC as the ultimate linker in mruby builds Some toolchains seem to work better this way. --- CMakeLists.txt | 5 ++--- mruby/tic_default.rb | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82604ed1f..cb115b924 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,9 +262,8 @@ ExternalProject_Add(mruby_vendor BUILD_IN_SOURCE TRUE BUILD_COMMAND ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" - "TARGET_CC=${CMAKE_C_COMPILER}" - "TARGET_LD=${CMAKE_C_LINK_EXECUTABLE}" - "TARGET_AR=${CMAKE_AR}" + "TARGET_CC=\"${CMAKE_C_COMPILER}\"" + "TARGET_AR=\"${CMAKE_AR}\"" "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" "BUILD_TYPE=${BUILD_TYPE_UC}" diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index 2d6493943..a54dcaa15 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -23,7 +23,7 @@ end conf.linker do |linker| - linker.command = ENV['TARGET_LD'] || 'ld' + linker.command = ENV['TARGET_CC'] || 'cc' linker.flags = [ENV['TARGET_LDFLAGS'] || %w()] end From 73fb941495bfa2b69365a386860e3bb634c88d83 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Wed, 8 Dec 2021 22:12:13 +0100 Subject: [PATCH 147/379] Explicitly use mruby clang toolchain on macOS --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cb115b924..82ad8b538 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,7 +244,7 @@ set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) if(MSVC) set(MRUBY_TOOLCHAIN visualcpp) -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(MRUBY_TOOLCHAIN clang) else() set(MRUBY_TOOLCHAIN gcc) From bbd7341c904456dd2172be0577a8242c867a9ea4 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 07:59:06 +0100 Subject: [PATCH 148/379] Set --sysroot in mruby for macOS Clang --- CMakeLists.txt | 4 ++++ mruby/tic_default.rb | 1 + 2 files changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82ad8b538..7304df3e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -249,6 +249,9 @@ elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") else() set(MRUBY_TOOLCHAIN gcc) endif() +if(APPLE) + exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE MRUBY_SYSROOT) +endif() message(NOTICE "\ Caveat:\n\ * mruby target (\"target\") will attempt to use the same toolchain as \ @@ -267,6 +270,7 @@ ExternalProject_Add(mruby_vendor "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" "BUILD_TYPE=${BUILD_TYPE_UC}" + "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index a54dcaa15..248912d21 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -20,6 +20,7 @@ cc.command = ENV["TARGET_CC"] || 'cc' cc.flags = [ENV["TARGET_CFLAGS"] || %w()] cc.flags << '-fPIC' unless ENV['MRUBY_TOOLCHAIN'] == 'visualcpp' + cc.flags << "-isysroot #{ENV['MRUBY_SYSROOT']}" unless ENV['MRUBY_SYSROOT'].empty? end conf.linker do |linker| From 04b99c9cf5bf5238dcb29d2fd7551d6ee8e4be58 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 15:03:14 +0100 Subject: [PATCH 149/379] Do not depend on YACC https://github.com/nesbox/TIC-80/pull/1726#issuecomment-989728667: > mruby can be built without yacc(or GNU Bison) after mruby 2.1.2+( https://mruby.org/releases/2020/08/06/mruby-2.1.2-released.html). --- CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7304df3e9..8a6df820e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -231,12 +231,8 @@ target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) ################################ find_program(RAKE rake) -find_program(YACC yacc) if(NOT RAKE) - message(FATAL_ERROR "Program `rake' not found! Ruby and `rake' are required to build mruby support.") -endif() -if(NOT YACC) - message(FATAL_ERROR "Program `yacc' not found! Either `yacc' or GNU Bison is required to build mruby support.") + message(FATAL_ERROR "Program `rake' not found! Ruby \"rake\" is required to build mruby support.") endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) From 0ea4ecaf832b5e80ef6aef6bef234ba4f85fdac9 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 18:03:13 +0100 Subject: [PATCH 150/379] Set ImageOS in Actions runner Dockerfiles This allows Ruby to be installed on those non-standard images. --- Dockerfile.dapper | 1 + build/android/Dockerfile | 1 + build/baremetalpi/Dockerfile | 1 + build/n3ds/Dockerfile | 1 + build/rpi/Dockerfile | 1 + 5 files changed, 5 insertions(+) diff --git a/Dockerfile.dapper b/Dockerfile.dapper index c18d1b450..52f9f4594 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -1,4 +1,5 @@ FROM ubuntu:18.04 +ENV ImageOS=ubuntu20 RUN apt-get update && apt-get install -y g++ git cmake libgtk-3-dev \ libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev WORKDIR ${DAPPER_SOURCE:-/source} diff --git a/build/android/Dockerfile b/build/android/Dockerfile index 0f4354143..85b0d5cdc 100644 --- a/build/android/Dockerfile +++ b/build/android/Dockerfile @@ -1,4 +1,5 @@ FROM mingc/android-build-box +ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get remove git -y RUN apt-get install software-properties-common -y diff --git a/build/baremetalpi/Dockerfile b/build/baremetalpi/Dockerfile index f4186da55..6361b7a8e 100644 --- a/build/baremetalpi/Dockerfile +++ b/build/baremetalpi/Dockerfile @@ -1,4 +1,5 @@ FROM ubuntu:18.04 +ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y diff --git a/build/n3ds/Dockerfile b/build/n3ds/Dockerfile index c4e85995f..fb38953d4 100644 --- a/build/n3ds/Dockerfile +++ b/build/n3ds/Dockerfile @@ -1,4 +1,5 @@ FROM ubuntu:18.04 +ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y diff --git a/build/rpi/Dockerfile b/build/rpi/Dockerfile index 3073f452b..c8195bc8c 100644 --- a/build/rpi/Dockerfile +++ b/build/rpi/Dockerfile @@ -1,4 +1,5 @@ FROM ubuntu:18.04 +ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y From be5ff008a1d57b3f58f54ab327889c70634ded05 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 19:46:47 +0100 Subject: [PATCH 151/379] Revert "Set ImageOS in Actions runner Dockerfiles" This reverts commit 0ea4ecaf832b5e80ef6aef6bef234ba4f85fdac9. --- Dockerfile.dapper | 1 - build/android/Dockerfile | 1 - build/baremetalpi/Dockerfile | 1 - build/n3ds/Dockerfile | 1 - build/rpi/Dockerfile | 1 - 5 files changed, 5 deletions(-) diff --git a/Dockerfile.dapper b/Dockerfile.dapper index 52f9f4594..c18d1b450 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -1,5 +1,4 @@ FROM ubuntu:18.04 -ENV ImageOS=ubuntu20 RUN apt-get update && apt-get install -y g++ git cmake libgtk-3-dev \ libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev WORKDIR ${DAPPER_SOURCE:-/source} diff --git a/build/android/Dockerfile b/build/android/Dockerfile index 85b0d5cdc..0f4354143 100644 --- a/build/android/Dockerfile +++ b/build/android/Dockerfile @@ -1,5 +1,4 @@ FROM mingc/android-build-box -ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get remove git -y RUN apt-get install software-properties-common -y diff --git a/build/baremetalpi/Dockerfile b/build/baremetalpi/Dockerfile index 6361b7a8e..f4186da55 100644 --- a/build/baremetalpi/Dockerfile +++ b/build/baremetalpi/Dockerfile @@ -1,5 +1,4 @@ FROM ubuntu:18.04 -ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y diff --git a/build/n3ds/Dockerfile b/build/n3ds/Dockerfile index fb38953d4..c4e85995f 100644 --- a/build/n3ds/Dockerfile +++ b/build/n3ds/Dockerfile @@ -1,5 +1,4 @@ FROM ubuntu:18.04 -ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y diff --git a/build/rpi/Dockerfile b/build/rpi/Dockerfile index c8195bc8c..3073f452b 100644 --- a/build/rpi/Dockerfile +++ b/build/rpi/Dockerfile @@ -1,5 +1,4 @@ FROM ubuntu:18.04 -ENV ImageOS=ubuntu20 RUN apt-get update RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y From fb890412a9ac55d6a4676972ef68525671836646 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 19:53:57 +0100 Subject: [PATCH 152/379] Manually install Ruby in cross Actions containers --- .github/workflows/build.yml | 50 ++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 06461ea67..0cf9b3fd4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -248,9 +248,13 @@ jobs: submodules: recursive fetch-depth: 0 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get install --assume-yes build-essential ruby-full - name: Build run: | @@ -288,9 +292,13 @@ jobs: submodules: recursive fetch-depth: 0 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get install --assume-yes build-essential ruby-full - name: Prebuild run: | @@ -342,9 +350,13 @@ jobs: submodules: recursive fetch-depth: 0 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get install --assume-yes build-essential ruby-full - name: Prebuild run: | @@ -399,9 +411,13 @@ jobs: submodules: recursive fetch-depth: 0 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get install --assume-yes build-essential ruby-full - name: Build run: | @@ -498,9 +514,13 @@ jobs: submodules: recursive fetch-depth: 0 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get install --assume-yes build-essential ruby-full - name: Build run: | From 8eff523ee91558d365516b95da9cda51c8ce9276 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 20:41:44 +0100 Subject: [PATCH 153/379] mruby Android toolchain --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a6df820e..53a07cd1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,6 +242,8 @@ if(MSVC) set(MRUBY_TOOLCHAIN visualcpp) elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(MRUBY_TOOLCHAIN clang) +elseif(ANDROID) + set(MRUBY_TOOLCHAIN android) else() set(MRUBY_TOOLCHAIN gcc) endif() From 48ac5c72c8adb358674ef0fdb0594e685052de98 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 21:10:19 +0100 Subject: [PATCH 154/379] Additional params for mruby android toolchain --- mruby/tic_default.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index 248912d21..020bd1a49 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -12,7 +12,12 @@ end MRuby::CrossBuild.new('target') do |conf| - toolchain ENV['MRUBY_TOOLCHAIN'] + params = {} + if ENV['MRUBY_TOOLCHAIN'] == 'android' + params[:toolchain] = :clang + params[:platform] = 'android-21' + end + toolchain ENV['MRUBY_TOOLCHAIN'], params conf.gembox File.expand_path('tic', File.dirname(__FILE__)) From a28c42f62adfa5ff2c08f5a181536b834fcae899 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 22:31:23 +0100 Subject: [PATCH 155/379] Don't build redundant mrbgems --- mruby/tic.gembox | 1 - mruby/tic_default.rb | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mruby/tic.gembox b/mruby/tic.gembox index 87a0c4394..4a6139606 100644 --- a/mruby/tic.gembox +++ b/mruby/tic.gembox @@ -1,7 +1,6 @@ MRuby::GemBox.new do |conf| conf.gembox "stdlib" conf.gembox "stdlib-ext" - conf.gembox "stdlib-io" conf.gembox "math" conf.gembox "metaprog" end diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index 020bd1a49..ff8546052 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -5,10 +5,9 @@ conf.toolchain end - conf.gembox 'default' - - conf.enable_bintest - conf.enable_test + conf.build_mrbc_exec + conf.disable_libmruby + conf.disable_presym end MRuby::CrossBuild.new('target') do |conf| From 63e4083f57dff13bafde4361a82de6cc8ab751ca Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 23:13:31 +0100 Subject: [PATCH 156/379] Whitelist mrbgem "stdlib-io" anyway --- mruby/tic.gembox | 1 + 1 file changed, 1 insertion(+) diff --git a/mruby/tic.gembox b/mruby/tic.gembox index 4a6139606..87a0c4394 100644 --- a/mruby/tic.gembox +++ b/mruby/tic.gembox @@ -1,6 +1,7 @@ MRuby::GemBox.new do |conf| conf.gembox "stdlib" conf.gembox "stdlib-ext" + conf.gembox "stdlib-io" conf.gembox "math" conf.gembox "metaprog" end From a030cc9a27ba614049d192457c72e11c8040d2c0 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 23:18:08 +0100 Subject: [PATCH 157/379] Don't fortify sources on Android --- mruby/tic_default.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index ff8546052..82e727f45 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -11,12 +11,7 @@ end MRuby::CrossBuild.new('target') do |conf| - params = {} - if ENV['MRUBY_TOOLCHAIN'] == 'android' - params[:toolchain] = :clang - params[:platform] = 'android-21' - end - toolchain ENV['MRUBY_TOOLCHAIN'], params + toolchain ENV['MRUBY_TOOLCHAIN'] conf.gembox File.expand_path('tic', File.dirname(__FILE__)) @@ -25,6 +20,7 @@ cc.flags = [ENV["TARGET_CFLAGS"] || %w()] cc.flags << '-fPIC' unless ENV['MRUBY_TOOLCHAIN'] == 'visualcpp' cc.flags << "-isysroot #{ENV['MRUBY_SYSROOT']}" unless ENV['MRUBY_SYSROOT'].empty? + cc.flags << '-U_FORTIFY_SOURCE' if ENV['MRUBY_TOOLCHAIN'] == 'android' end conf.linker do |linker| From b947f8014514b39619a16164c457d244523fe099 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 23:32:25 +0100 Subject: [PATCH 158/379] Disable source fortification project-wide on Android --- CMakeLists.txt | 4 ++++ mruby/tic_default.rb | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 53a07cd1a..d7b964645 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,10 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE) endif() +if(ANDROID) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") +endif() + project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") diff --git a/mruby/tic_default.rb b/mruby/tic_default.rb index 82e727f45..04b803546 100644 --- a/mruby/tic_default.rb +++ b/mruby/tic_default.rb @@ -20,7 +20,6 @@ cc.flags = [ENV["TARGET_CFLAGS"] || %w()] cc.flags << '-fPIC' unless ENV['MRUBY_TOOLCHAIN'] == 'visualcpp' cc.flags << "-isysroot #{ENV['MRUBY_SYSROOT']}" unless ENV['MRUBY_SYSROOT'].empty? - cc.flags << '-U_FORTIFY_SOURCE' if ENV['MRUBY_TOOLCHAIN'] == 'android' end conf.linker do |linker| From 68851f24e00fff975ac46cd05a98c8d836d088ac Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Thu, 9 Dec 2021 23:48:00 +0100 Subject: [PATCH 159/379] Also disable fortify at link time on Android --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d7b964645..4ded7e9b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ endif() if(ANDROID) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -U_FORTIFY_SOURCE") endif() project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) From f7eea2137024959b525b3e82c7180f9cddb379fd Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 15:51:46 +0100 Subject: [PATCH 160/379] Android build fixes --- CMakeLists.txt | 23 +++++++--------- mruby/tic.gembox | 1 - mruby/tic_android.rb | 62 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 mruby/tic_android.rb diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ded7e9b7..008e3831e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,10 +51,6 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE) endif() -if(ANDROID) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -U_FORTIFY_SOURCE") -endif() project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") @@ -241,26 +237,24 @@ if(NOT RAKE) endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) -set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) +if(ANDROID) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_android.rb) +else() + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) +endif() set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) + if(MSVC) set(MRUBY_TOOLCHAIN visualcpp) elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(MRUBY_TOOLCHAIN clang) -elseif(ANDROID) - set(MRUBY_TOOLCHAIN android) else() set(MRUBY_TOOLCHAIN gcc) endif() + if(APPLE) exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE MRUBY_SYSROOT) endif() -message(NOTICE "\ -Caveat:\n\ -* mruby target (\"target\") will attempt to use the same toolchain as \ -CMake, namely \"${MRUBY_TOOLCHAIN}\".\n\ -* mruby bootstrap (\"host\") will automatically detect a usable toolchain, \ -which may be different than the one used by CMake.") ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} @@ -275,6 +269,9 @@ ExternalProject_Add(mruby_vendor "BUILD_TYPE=${BUILD_TYPE_UC}" "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" + "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" + "ANDROID_PLATFORM=android-${ANDROID_API}" + "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} ) diff --git a/mruby/tic.gembox b/mruby/tic.gembox index 87a0c4394..4a6139606 100644 --- a/mruby/tic.gembox +++ b/mruby/tic.gembox @@ -1,7 +1,6 @@ MRuby::GemBox.new do |conf| conf.gembox "stdlib" conf.gembox "stdlib-ext" - conf.gembox "stdlib-io" conf.gembox "math" conf.gembox "metaprog" end diff --git a/mruby/tic_android.rb b/mruby/tic_android.rb new file mode 100644 index 000000000..97cc1a864 --- /dev/null +++ b/mruby/tic_android.rb @@ -0,0 +1,62 @@ +MRuby::Build.new do |conf| + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + conf.toolchain + end + + conf.build_mrbc_exec + conf.disable_libmruby + conf.disable_presym +end + +MRuby::CrossBuild.new('target') do |conf| + ARCH = ENV['ANDROID_ARCH'] + PLATFORM = ENV['ANDROID_PLATFORM'] + API = ENV['ANDROID_PLATFORM'].rpartition('-').last + + toolchain :android, arch: ARCH, platform: PLATFORM + + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + conf.cc do |cc| + cc.flags << '-fPIC' + cc.defines << '__ANDROID__' + cc.defines << "__ANDROID_API__=#{API}" + end + + conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] + conf.enable_bintest + conf.enable_test +end +MRuby::Build.new do |conf| + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + conf.toolchain + end + + conf.build_mrbc_exec + conf.disable_libmruby + conf.disable_presym +end + +MRuby::CrossBuild.new('target') do |conf| + ARCH = ENV['ANDROID_ARCH'] + PLATFORM = ENV['ANDROID_PLATFORM'] + API = ENV['ANDROID_PLATFORM'].rpartition('-').last + + toolchain :android, arch: ARCH, platform: PLATFORM + + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + conf.cc do |cc| + cc.flags << '-fPIC' + cc.defines << '__ANDROID__' + cc.defines << "__ANDROID_API__=#{API}" + end + + conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] + conf.enable_bintest + conf.enable_test +end From f83bec5f5dda913d6960bf48e6663d35b2a9dda6 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 15:54:31 +0100 Subject: [PATCH 161/379] Fix building on Raspberry Pi --- .github/workflows/build.yml | 5 +++++ CMakeLists.txt | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0cf9b3fd4..d117467c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -254,6 +254,7 @@ jobs: - name: Install Host toolchain run: | + apt-get update apt-get install --assume-yes build-essential ruby-full - name: Build @@ -298,6 +299,7 @@ jobs: - name: Install Host toolchain run: | + apt-get update apt-get install --assume-yes build-essential ruby-full - name: Prebuild @@ -356,6 +358,7 @@ jobs: - name: Install Host toolchain run: | + apt-get update apt-get install --assume-yes build-essential ruby-full - name: Prebuild @@ -417,6 +420,7 @@ jobs: - name: Install Host toolchain run: | + apt-get update apt-get install --assume-yes build-essential ruby-full - name: Build @@ -520,6 +524,7 @@ jobs: - name: Install Host toolchain run: | + apt-get update apt-get install --assume-yes build-essential ruby-full - name: Build diff --git a/CMakeLists.txt b/CMakeLists.txt index 008e3831e..f8dce7600 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,10 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE) endif() +if(RPI) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") +endif() + project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") From 22fbac87582e0d3b2a52af399cb8530a920dc8f1 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 16:44:45 +0100 Subject: [PATCH 162/379] Fix missing variable prefix in Android CMake --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f8dce7600..e83790643 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,7 +274,7 @@ ExternalProject_Add(mruby_vendor "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" - "ANDROID_PLATFORM=android-${ANDROID_API}" + "ANDROID_PLATFORM=android-${CMAKE_ANDROID_API}" "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} From 145776363e936faa34071c93ddb044f53d571c96 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 16:54:27 +0100 Subject: [PATCH 163/379] Rename: mrb.c -> mruby.c --- CMakeLists.txt | 2 +- src/api/{mrb.c => mruby.c} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/api/{mrb.c => mruby.c} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8dbb28f32..6a8f84c8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -386,7 +386,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${TIC80CORE_DIR}/api/fennel.c ${TIC80CORE_DIR}/api/wren.c ${TIC80CORE_DIR}/api/squirrel.c - ${TIC80CORE_DIR}/api/mrb.c + ${TIC80CORE_DIR}/api/mruby.c ${TIC80CORE_DIR}/tic.c ${TIC80CORE_DIR}/cart.c ${TIC80CORE_DIR}/tools.c diff --git a/src/api/mrb.c b/src/api/mruby.c similarity index 100% rename from src/api/mrb.c rename to src/api/mruby.c From 9ec81c9e00f746ec19c8402cf1e630c866754798 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 16:55:02 +0100 Subject: [PATCH 164/379] Adapt mruby.c code to master --- src/api/mruby.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/mruby.c b/src/api/mruby.c index 829e91965..840489cd3 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -1081,7 +1081,7 @@ static void callMRubyTick(tic_mem* tic) if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, OvrFunc))) { - OVR(tic) + OVR(machine) { mrb_funcall(mrb, mrb_top_self(mrb), OvrFunc, 0); catcherr(machine); From dcaa2381c1e2cc22c767937ce58724beeb367e2a Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:10:03 +0100 Subject: [PATCH 165/379] Fix silly misplacement of definition in CMakeLists --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a8f84c8c..c4c06e616 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,10 +51,6 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE) endif() -if(RPI) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") -endif() - project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") @@ -140,6 +136,10 @@ else() set(CMAKE_C_STANDARD 11) endif() +if(RPI) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") +endif() + set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor) include(ExternalProject) From 6164e0b0528343ada442654ccec03d106da9021a Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:11:36 +0100 Subject: [PATCH 166/379] Use CMake-native target version inference ref. https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_API.html --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c4c06e616..0487fd136 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,7 +274,7 @@ ExternalProject_Add(mruby_vendor "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" - "ANDROID_PLATFORM=android-${CMAKE_ANDROID_API}" + "ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}" "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} From 8cba92c41768cfe5305e6ef1d63b41118f551aef Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:25:35 +0100 Subject: [PATCH 167/379] Do not link mruby against winsock on WinNT --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0487fd136..bbbab8751 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -295,9 +295,6 @@ set_property(TARGET mruby APPEND set_property(TARGET mruby APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include ) -if(WIN32) - target_link_libraries(mruby INTERFACE ws2_32.lib wsock32.lib) -endif() add_dependencies(mruby mruby_vendor) ################################ From 141f1a30df894456b6410a1cdac0dbde3798e8b1 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:27:02 +0100 Subject: [PATCH 168/379] Add mruby target to stub export action --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d117467c3..fba75638d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -665,7 +665,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - script: [lua, moon, fennel, js, wren, squirrel] + script: [lua, moon, fennel, mruby, js, wren, squirrel] steps: - name: Download Windows XP artifact From b8a3a43465f734f64aa14f50d6ccc82371165c3b Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:30:52 +0100 Subject: [PATCH 169/379] Revert "Use CMake-native target version inference" This reverts commit 6164e0b0528343ada442654ccec03d106da9021a. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bbbab8751..cc1555d7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,7 +274,7 @@ ExternalProject_Add(mruby_vendor "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" - "ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}" + "ANDROID_PLATFORM=android-${CMAKE_ANDROID_API}" "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} From b0e6043e76a8dec6afba9c6eec9e5a8281211a6e Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:37:41 +0100 Subject: [PATCH 170/379] Explicitly set ANDROID_API from gradle --- CMakeLists.txt | 2 +- build/android/app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc1555d7b..e59821d72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,7 +274,7 @@ ExternalProject_Add(mruby_vendor "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" - "ANDROID_PLATFORM=android-${CMAKE_ANDROID_API}" + "ANDROID_PLATFORM=android-${ANDROID_API}" "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 062c28563..d910fa924 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -23,7 +23,7 @@ android { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } cmake { - arguments "-DBUILD_PRO=Off", "-DCMAKE_BUILD_TYPE=MinSizeRel" + arguments "-DBUILD_PRO=Off", "-DANDROID_API=29", "-DCMAKE_BUILD_TYPE=MinSizeRel" } // cmake { // arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static" From 9aeef126ebf8e039c0aa4e8e685aa7a390f2454e Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:39:26 +0100 Subject: [PATCH 171/379] Move: /mruby/ -> /build/mruby/ More consistent with the rest of the project tree --- CMakeLists.txt | 4 ++-- {mruby => build/mruby}/.gitignore | 0 {mruby => build/mruby}/tic.gembox | 0 {mruby => build/mruby}/tic_android.rb | 0 {mruby => build/mruby}/tic_default.rb | 0 5 files changed, 2 insertions(+), 2 deletions(-) rename {mruby => build/mruby}/.gitignore (100%) rename {mruby => build/mruby}/tic.gembox (100%) rename {mruby => build/mruby}/tic_android.rb (100%) rename {mruby => build/mruby}/tic_default.rb (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e59821d72..19ab0e53e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,9 +242,9 @@ endif() set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) if(ANDROID) - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_android.rb) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/build/mruby/tic_android.rb) else() - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/mruby/tic_default.rb) + set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/build/mruby/tic_default.rb) endif() set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) diff --git a/mruby/.gitignore b/build/mruby/.gitignore similarity index 100% rename from mruby/.gitignore rename to build/mruby/.gitignore diff --git a/mruby/tic.gembox b/build/mruby/tic.gembox similarity index 100% rename from mruby/tic.gembox rename to build/mruby/tic.gembox diff --git a/mruby/tic_android.rb b/build/mruby/tic_android.rb similarity index 100% rename from mruby/tic_android.rb rename to build/mruby/tic_android.rb diff --git a/mruby/tic_default.rb b/build/mruby/tic_default.rb similarity index 100% rename from mruby/tic_default.rb rename to build/mruby/tic_default.rb From 8f3e6b1dc06cf193d1b16f94efe45f03dbfdb112 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 17:43:24 +0100 Subject: [PATCH 172/379] baremetalpi: Link against libmruby --- build/baremetalpi/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/baremetalpi/Makefile b/build/baremetalpi/Makefile index a3f101b5e..61dc81c18 100644 --- a/build/baremetalpi/Makefile +++ b/build/baremetalpi/Makefile @@ -3,6 +3,7 @@ # TIC80HOME = ../.. TIC803RD = $(TIC80HOME)/vendor +MRUBYDIR = $(TIC803RD)/mruby CIRCLESTDLIB = $(TIC803RD)/circle-stdlib CIRCLEHOME = $(CIRCLESTDLIB)/libs/circle NEWLIBDIR = $(CIRCLESTDLIB)/install/arm-none-circle @@ -36,6 +37,7 @@ LIBS := \ $(TIC80LIB)/libduktape.a \ $(TIC80LIB)/libzlib.a \ $(TIC80LIB)/libpng.a \ + $(MRUBYDIR)/build/target/lib/libmruby.a \ $(NEWLIBDIR)/lib/libc.a \ $(NEWLIBDIR)/lib/libcirclenewlib.a \ $(CIRCLEHOME)/addon/vc4/sound/libvchiqsound.a \ From ec23e04596ce667fc16292cbe22580ed70ea07c7 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 18:39:08 +0100 Subject: [PATCH 173/379] Prepare standalone NDK toolchains in Actions --- .github/workflows/build.yml | 11 ++++++++++- build/android/app/build.gradle | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fba75638d..7710d67ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -525,7 +525,16 @@ jobs: - name: Install Host toolchain run: | apt-get update - apt-get install --assume-yes build-essential ruby-full + apt-get install --assume-yes build-essential ruby-full python3 + + - name: Make standalone toolchains (NDK) + run: | + for ARCH in arm arm64 x86 x86_64; do \ + API=29; \ + python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ + --api "$API" --arch "$ARCH" \ + --install-dir "$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH"; \ + done - name: Build run: | diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index d910fa924..2b4442d99 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -19,7 +19,7 @@ android { versionName "1.00.00" externalNativeBuild { ndkBuild { - arguments "APP_PLATFORM=android-16" + arguments "APP_PLATFORM=android-29" abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } cmake { From fa05a1491e9e33750c9c585955f0ad9a48d2bccc Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 19:00:09 +0100 Subject: [PATCH 174/379] Link sysroot in standalone NDK --- .github/workflows/build.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7710d67ba..46e658fba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -531,9 +531,12 @@ jobs: run: | for ARCH in arm arm64 x86 x86_64; do \ API=29; \ - python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ + SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; \ + test -d "$SYSROOT" \ + || python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ --api "$API" --arch "$ARCH" \ - --install-dir "$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH"; \ + --install-dir "$SYSROOT" -f \ + && ln -Ffs "$SYSROOT"/{sysroot/,}usr; \ done - name: Build From b15328b967a0e9b5ce5b92cc3ff3047e6b6eb154 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 19:51:13 +0100 Subject: [PATCH 175/379] Patch mruby with modern NDK support --- .github/workflows/build.yml | 12 ------- CMakeLists.txt | 4 ++- ...e-actual-sysroot-on-Android-NDK-locs.patch | 36 +++++++++++++++++++ 3 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46e658fba..45c9adf4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -527,18 +527,6 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full python3 - - name: Make standalone toolchains (NDK) - run: | - for ARCH in arm arm64 x86 x86_64; do \ - API=29; \ - SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; \ - test -d "$SYSROOT" \ - || python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ - --api "$API" --arch "$ARCH" \ - --install-dir "$SYSROOT" -f \ - && ln -Ffs "$SYSROOT"/{sysroot/,}usr; \ - done - - name: Build run: | cd build/android diff --git a/CMakeLists.txt b/CMakeLists.txt index 19ab0e53e..d0e05362f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,7 +262,8 @@ endif() ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} - CONFIGURE_COMMAND "" + CONFIGURE_COMMAND + ${GIT_EXECUTABLE} am <"${CMAKE_SOURCE_DIR}/build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch" BUILD_IN_SOURCE TRUE BUILD_COMMAND ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" @@ -276,6 +277,7 @@ ExternalProject_Add(mruby_vendor "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" "ANDROID_PLATFORM=android-${ANDROID_API}" "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" + "ANDROID_STANDALONE_TOOLCHAIN=${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}" INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} ) diff --git a/build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch b/build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch new file mode 100644 index 000000000..34d16b23d --- /dev/null +++ b/build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch @@ -0,0 +1,36 @@ +From a0bc2fb3753694813e611c47bfdf90cd599b1f7d Mon Sep 17 00:00:00 2001 +From: Jeremiasz Nelz +Date: Fri, 10 Dec 2021 19:43:17 +0100 +Subject: [PATCH] Point to the actual sysroot on Android; NDK locs + +--- + tasks/toolchains/android.rake | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake +index 2368b93b5..8f008a360 100644 +--- a/tasks/toolchains/android.rake ++++ b/tasks/toolchains/android.rake +@@ -7,6 +7,9 @@ class MRuby::Toolchain::Android + DEFAULT_NDK_HOMES = %w{ + /usr/local/opt/android-sdk/ndk-bundle + /usr/local/opt/android-ndk ++ /opt/android-sdk/ndk-bundle ++ /opt/android-ndk ++ /opt/android-sdk/ndk/current + ~/Android/Sdk/ndk-bundle + %LOCALAPPDATA%/Android/android-sdk/ndk-bundle + %LOCALAPPDATA%/Android/android-ndk +@@ -188,7 +191,8 @@ Higher NDK version will be use. + when /x86/ then 'arch-x86' + when /mips64/ then 'arch-mips64' + when /mips/ then 'arch-mips' +- end ++ end, ++ 'sysroot' + ).to_s + if Dir.exist?(File.join(sysroot_path, "usr", "include")) + return @sysroot = sysroot_path +-- +2.32.0 + From 375ca376f2073589282589d5ea3373c32634021f Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 20:48:45 +0100 Subject: [PATCH 176/379] Actions: Provision Git to allow "am" patching --- .github/workflows/build.yml | 90 +++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45c9adf4a..324c5d017 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,6 +21,12 @@ jobs: with: ruby-version: 2.6 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build shell: cmd run: | @@ -54,6 +60,12 @@ jobs: with: ruby-version: 2.6 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build shell: cmd run: | @@ -81,6 +93,12 @@ jobs: with: ruby-version: 2.6 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build shell: cmd run: | @@ -114,6 +132,12 @@ jobs: with: ruby-version: 2.6 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build shell: cmd run: | @@ -141,6 +165,12 @@ jobs: with: ruby-version: 2.6 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build shell: cmd run: | @@ -174,6 +204,12 @@ jobs: sudo apt-get update sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -212,6 +248,12 @@ jobs: sudo apt-get update sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -257,6 +299,12 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -314,6 +362,12 @@ jobs: cd ../../linux make -j$(nproc) + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -373,6 +427,12 @@ jobs: cd ../../linux make -j$(nproc) + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -423,6 +483,12 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -448,6 +514,12 @@ jobs: - name: Install run: brew uninstall --ignore-dependencies libidn2 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -487,6 +559,12 @@ jobs: - name: Install run: brew uninstall --ignore-dependencies libidn2 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build @@ -527,6 +605,12 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full python3 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build/android @@ -555,6 +639,12 @@ jobs: with: ruby-version: 2.6 + - name: Provision Git + shell: cmd + run: | + git config --global user.name "Bob" + git config --global user.email "bob@invalid" + - name: Build run: | cd build From a0a15cff070db11be098f50b0ba822a22f0a42e1 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 21:40:23 +0100 Subject: [PATCH 177/379] Revert "Actions: Provision Git to allow "am" patching" This reverts commit 375ca376f2073589282589d5ea3373c32634021f. --- .github/workflows/build.yml | 90 ------------------------------------- 1 file changed, 90 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 324c5d017..45c9adf4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,12 +21,6 @@ jobs: with: ruby-version: 2.6 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build shell: cmd run: | @@ -60,12 +54,6 @@ jobs: with: ruby-version: 2.6 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build shell: cmd run: | @@ -93,12 +81,6 @@ jobs: with: ruby-version: 2.6 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build shell: cmd run: | @@ -132,12 +114,6 @@ jobs: with: ruby-version: 2.6 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build shell: cmd run: | @@ -165,12 +141,6 @@ jobs: with: ruby-version: 2.6 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build shell: cmd run: | @@ -204,12 +174,6 @@ jobs: sudo apt-get update sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -248,12 +212,6 @@ jobs: sudo apt-get update sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -299,12 +257,6 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -362,12 +314,6 @@ jobs: cd ../../linux make -j$(nproc) - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -427,12 +373,6 @@ jobs: cd ../../linux make -j$(nproc) - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -483,12 +423,6 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -514,12 +448,6 @@ jobs: - name: Install run: brew uninstall --ignore-dependencies libidn2 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -559,12 +487,6 @@ jobs: - name: Install run: brew uninstall --ignore-dependencies libidn2 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build @@ -605,12 +527,6 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full python3 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build/android @@ -639,12 +555,6 @@ jobs: with: ruby-version: 2.6 - - name: Provision Git - shell: cmd - run: | - git config --global user.name "Bob" - git config --global user.email "bob@invalid" - - name: Build run: | cd build From a47c803a2570b3135145ab9066a9a5eee76c0f32 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 21:41:27 +0100 Subject: [PATCH 178/379] Patch mruby during the configuration step --- CMakeLists.txt | 9 +++++---- build/mruby/patch_all.rb | 10 ++++++++++ ...int-to-the-actual-sysroot-on-Android-NDK-locs.patch | 0 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100755 build/mruby/patch_all.rb rename build/mruby/{ => patches}/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index d0e05362f..dd53ddcd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,16 +235,18 @@ target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) # MRUBY ################################ +find_program(RUBY ruby) find_program(RAKE rake) if(NOT RAKE) message(FATAL_ERROR "Program `rake' not found! Ruby \"rake\" is required to build mruby support.") endif() +set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby) set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) if(ANDROID) - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/build/mruby/tic_android.rb) + set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_android.rb) else() - set(MRUBY_CONFIG ${CMAKE_SOURCE_DIR}/build/mruby/tic_default.rb) + set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_default.rb) endif() set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) @@ -262,8 +264,7 @@ endif() ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} - CONFIGURE_COMMAND - ${GIT_EXECUTABLE} am <"${CMAKE_SOURCE_DIR}/build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch" + CONFIGURE_COMMAND ${RUBY} "${MRUBY_BUILDDIR}/patch_all.rb" BUILD_IN_SOURCE TRUE BUILD_COMMAND ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" diff --git a/build/mruby/patch_all.rb b/build/mruby/patch_all.rb new file mode 100755 index 000000000..35e9d85ac --- /dev/null +++ b/build/mruby/patch_all.rb @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +USERNAME = 'Bob' +USEREMAIL = 'bob@invalid' + +system 'git', 'config', '--global', 'user.name', USERNAME if `git config --global user.name`.chomp.empty? +system 'git', 'config', '--global', 'user.email', USEREMAIL if `git config --global user.email`.chomp.empty? + +Dir[File.expand_path('patches/*.patch', File.dirname(__FILE__))].each do |patch| + system "git am <#{patch}" +end diff --git a/build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch b/build/mruby/patches/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch similarity index 100% rename from build/mruby/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch rename to build/mruby/patches/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch From 40b49519fd568b3506b80fb70f2a485253b205bc Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Fri, 10 Dec 2021 23:49:45 +0100 Subject: [PATCH 179/379] Github Actions: Recreate standalone NDK toolchains --- .github/workflows/build.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45c9adf4a..01ba9c769 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -527,6 +527,17 @@ jobs: apt-get update apt-get install --assume-yes build-essential ruby-full python3 + - name: Recreate standalone NDK toolchains + run: | + for ARCH in arm arm64 x86 x86_64; do \ + API=29; \ + SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; \ + python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ + --api "$API" --arch "$ARCH" \ + --install-dir "$SYSROOT" --force ; \ + ln -Ffs "$SYSROOT/sysroot/usr" "$SYSROOT/usr" ; \ + done + - name: Build run: | cd build/android From 355a9aa35609efd2133db3862d8a8e8947b3437d Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 11 Dec 2021 15:00:36 +0100 Subject: [PATCH 180/379] Fix mruby build on Android --- .github/workflows/build.yml | 4 ++- CMakeLists.txt | 25 +++++++------ build/android/app/build.gradle | 4 +-- build/mruby/patch_all.rb | 10 ------ ...e-actual-sysroot-on-Android-NDK-locs.patch | 36 ------------------- build/mruby/tic_android.rb | 31 ---------------- 6 files changed, 17 insertions(+), 93 deletions(-) delete mode 100755 build/mruby/patch_all.rb delete mode 100644 build/mruby/patches/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 01ba9c769..86f48f5cc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -530,13 +530,15 @@ jobs: - name: Recreate standalone NDK toolchains run: | for ARCH in arm arm64 x86 x86_64; do \ - API=29; \ + API=24; \ SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; \ python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ --api "$API" --arch "$ARCH" \ --install-dir "$SYSROOT" --force ; \ ln -Ffs "$SYSROOT/sysroot/usr" "$SYSROOT/usr" ; \ done + mkdir -p /usr/local/opt + ln -Ffs "$ANDROID_NDK_HOME" /usr/local/opt/android-ndk - name: Build run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index dd53ddcd3..3730da132 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,6 +140,10 @@ if(RPI) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") endif() +if(ANDROID) + set(CMAKE_SYSTEM_VERSION 24) +endif() + set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor) include(ExternalProject) @@ -262,12 +266,16 @@ if(APPLE) exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE MRUBY_SYSROOT) endif() +if(ANDROID_NDK_HOME) + set(MRUBY_RAKE_EXTRA_OPTS "${MRUBY_RAKE_EXTRA_OPTS} ANDROID_NDK_HOME=${ANDROID_NDK_HOME}") +endif() + ExternalProject_Add(mruby_vendor SOURCE_DIR ${MRUBY_DIR} - CONFIGURE_COMMAND ${RUBY} "${MRUBY_BUILDDIR}/patch_all.rb" + CONFIGURE_COMMAND "" BUILD_IN_SOURCE TRUE BUILD_COMMAND - ${RAKE} "MRUBY_CONFIG=${MRUBY_CONFIG}" + ${RAKE} clean all "MRUBY_CONFIG=${MRUBY_CONFIG}" "TARGET_CC=\"${CMAKE_C_COMPILER}\"" "TARGET_AR=\"${CMAKE_AR}\"" "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" @@ -276,20 +284,11 @@ ExternalProject_Add(mruby_vendor "MRUBY_SYSROOT=${MRUBY_SYSROOT}" "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" - "ANDROID_PLATFORM=android-${ANDROID_API}" - "ANDROID_NDK_HOME=${CMAKE_ANDROID_NDK}" - "ANDROID_STANDALONE_TOOLCHAIN=${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}" + "ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}" + ${MRUBY_RAKE_EXTRA_OPTS} INSTALL_COMMAND "" BUILD_BYPRODUCTS ${MRUBY_LIB} ) -set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES - "${MRUBY_DIR}/build" - "${MRUBY_DIR}/bin" -) -set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES - "${MRUBY_DIR}/build" - "${MRUBY_DIR}/bin" -) add_library(mruby STATIC IMPORTED GLOBAL) set_property(TARGET mruby APPEND diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 2b4442d99..63c0fc8bd 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -13,7 +13,7 @@ android { if (buildAsApplication) { applicationId "com.nesbox.tic" } - minSdkVersion 16 + minSdkVersion 24 targetSdkVersion 29 versionCode 10000 versionName "1.00.00" @@ -23,7 +23,7 @@ android { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } cmake { - arguments "-DBUILD_PRO=Off", "-DANDROID_API=29", "-DCMAKE_BUILD_TYPE=MinSizeRel" + arguments "-DBUILD_PRO=Off", "-DCMAKE_BUILD_TYPE=MinSizeRel" } // cmake { // arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static" diff --git a/build/mruby/patch_all.rb b/build/mruby/patch_all.rb deleted file mode 100755 index 35e9d85ac..000000000 --- a/build/mruby/patch_all.rb +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env ruby -USERNAME = 'Bob' -USEREMAIL = 'bob@invalid' - -system 'git', 'config', '--global', 'user.name', USERNAME if `git config --global user.name`.chomp.empty? -system 'git', 'config', '--global', 'user.email', USEREMAIL if `git config --global user.email`.chomp.empty? - -Dir[File.expand_path('patches/*.patch', File.dirname(__FILE__))].each do |patch| - system "git am <#{patch}" -end diff --git a/build/mruby/patches/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch b/build/mruby/patches/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch deleted file mode 100644 index 34d16b23d..000000000 --- a/build/mruby/patches/0001-Point-to-the-actual-sysroot-on-Android-NDK-locs.patch +++ /dev/null @@ -1,36 +0,0 @@ -From a0bc2fb3753694813e611c47bfdf90cd599b1f7d Mon Sep 17 00:00:00 2001 -From: Jeremiasz Nelz -Date: Fri, 10 Dec 2021 19:43:17 +0100 -Subject: [PATCH] Point to the actual sysroot on Android; NDK locs - ---- - tasks/toolchains/android.rake | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake -index 2368b93b5..8f008a360 100644 ---- a/tasks/toolchains/android.rake -+++ b/tasks/toolchains/android.rake -@@ -7,6 +7,9 @@ class MRuby::Toolchain::Android - DEFAULT_NDK_HOMES = %w{ - /usr/local/opt/android-sdk/ndk-bundle - /usr/local/opt/android-ndk -+ /opt/android-sdk/ndk-bundle -+ /opt/android-ndk -+ /opt/android-sdk/ndk/current - ~/Android/Sdk/ndk-bundle - %LOCALAPPDATA%/Android/android-sdk/ndk-bundle - %LOCALAPPDATA%/Android/android-ndk -@@ -188,7 +191,8 @@ Higher NDK version will be use. - when /x86/ then 'arch-x86' - when /mips64/ then 'arch-mips64' - when /mips/ then 'arch-mips' -- end -+ end, -+ 'sysroot' - ).to_s - if Dir.exist?(File.join(sysroot_path, "usr", "include")) - return @sysroot = sysroot_path --- -2.32.0 - diff --git a/build/mruby/tic_android.rb b/build/mruby/tic_android.rb index 97cc1a864..9122d018e 100644 --- a/build/mruby/tic_android.rb +++ b/build/mruby/tic_android.rb @@ -29,34 +29,3 @@ conf.enable_bintest conf.enable_test end -MRuby::Build.new do |conf| - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - conf.toolchain - end - - conf.build_mrbc_exec - conf.disable_libmruby - conf.disable_presym -end - -MRuby::CrossBuild.new('target') do |conf| - ARCH = ENV['ANDROID_ARCH'] - PLATFORM = ENV['ANDROID_PLATFORM'] - API = ENV['ANDROID_PLATFORM'].rpartition('-').last - - toolchain :android, arch: ARCH, platform: PLATFORM - - conf.gembox File.expand_path('tic', File.dirname(__FILE__)) - - conf.cc do |cc| - cc.flags << '-fPIC' - cc.defines << '__ANDROID__' - cc.defines << "__ANDROID_API__=#{API}" - end - - conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] - conf.enable_bintest - conf.enable_test -end From 47f42d13444e8196b2f1f30e5127b145dfef272d Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 11 Dec 2021 15:10:46 +0100 Subject: [PATCH 181/379] Update build instructions --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8a201e78d..aadf50fe3 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ The wiki holds TIC-80 documentation, code snippets and game development tutorial ### with Visual Studio 2017 - install `Visual Studio 2017` - install `git` +- install `Ruby` (you can use [RubyInstaller](https://rubyinstaller.org/)) - run following commands in `cmd` ``` git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build @@ -75,6 +76,7 @@ cmake -G "Visual Studio 15 2017 Win64" .. - install `mingw-w64` (http://mingw-w64.org) and add `.../mingw/bin` path to the *System Variables Path* - install `git` - install `cmake` (https://cmake.org) +- install `Ruby` (you can use [RubyInstaller](https://rubyinstaller.org/)) - run following commands in `terminal` ``` git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build @@ -86,7 +88,7 @@ mingw32-make -j4 ### Ubuntu 14.04 run the following commands in the Terminal ``` -sudo apt-get install git cmake libgles1-mesa-dev libglu-dev -y +sudo apt-get install git cmake ruby-full libgles1-mesa-dev libglu-dev -y git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 @@ -103,7 +105,7 @@ Install with [Install instructions](#install-instructions) run the following commands in the Terminal ``` -sudo apt-get install g++ git cmake libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev -y +sudo apt-get install g++ git cmake ruby-full libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev -y git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 @@ -114,7 +116,7 @@ make -j4 run the following commands in the Terminal ``` sudo dnf -y groupinstall "Development Tools" -sudo dnf -y install git cmake libglvnd-devel libglvnd-gles freeglut-devel +sudo dnf -y install ruby rubygem-{tk{,-doc},rake,test-unit} cmake libglvnd-devel libglvnd-gles freeglut-devel git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 @@ -142,7 +144,7 @@ sudo apt-get update sudo apt-get dist-upgrade # install software -sudo apt-get install git build-essential libsdl2-dev zlib1g-dev +sudo apt-get install git build-essential ruby-full libsdl2-dev zlib1g-dev sudo apt-get install -t jessie-backports liblua5.3-dev git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. From c656bdf4a77382f759a45ce7493ca790039fba6e Mon Sep 17 00:00:00 2001 From: Jeremiasz Date: Sat, 11 Dec 2021 18:22:32 +0100 Subject: [PATCH 182/379] Ruby scripting support (#1726) * Register submodule for mruby * Link binaries against static mruby * Adapt old mrb_api.c code to current internal API-s * Create Ruby demos * Mention Ruby support in README.md * Mention Ruby in features * Attribution * Fix broken demos * Add mruby WASM target * Fix compatibility with old CMake versions * Fix support for languages with single-char comment Current behavior assumes that comments comprise exactly two characters, such as "--" or "//". Many languages, such as Ruby and Python, use a single character, such as the pound sign or the ASCII quotation mark to signal a single-line comment. * Fix segfault when opening outline * Actions: Install Ruby where not present * Honor Windows MRuby static exts * Build mruby with /MT on Windows * Force mruby to use .a suffix for static libraries Github Actions seems to also prefer the UNIX-native prefix on Windows CMake * Do not build redundant mrbgems Created a gembox containing only useful gems * Infer mruby CFLAGS from CMake * Pass CMake flags to MRuby cross target * Revert "Pass CMake flags to MRuby cross target" This reverts commit 1a8bf8330ecfcfe83082476282156a867796d8a8. It turns out that wrapping CMake's poor cross build support was not a good idea after all. * Refactor mruby build configuration sets * mruby toolchain switching from CMake * Guess CMAKE_COMMAND on Windows OS * [mruby] Delegate ENV passing to rake invocation CMake's env helper is broken on Windows OS :/ * Enforce certain mruby toolchains from CMake side * Simplify mruby build system * Genericize cross compilation * Clean mruby build artifacts with make/ninja clean * Force mruby bootstrap to use MSVC where applicable * Fix naming in demos.c * Fix incorrect mruby x-compilation logic * Use TARGET_CC as the ultimate linker in mruby builds Some toolchains seem to work better this way. * Explicitly use mruby clang toolchain on macOS * Set --sysroot in mruby for macOS Clang * Do not depend on YACC https://github.com/nesbox/TIC-80/pull/1726#issuecomment-989728667: > mruby can be built without yacc(or GNU Bison) after mruby 2.1.2+( https://mruby.org/releases/2020/08/06/mruby-2.1.2-released.html). * Set ImageOS in Actions runner Dockerfiles This allows Ruby to be installed on those non-standard images. * Revert "Set ImageOS in Actions runner Dockerfiles" This reverts commit 0ea4ecaf832b5e80ef6aef6bef234ba4f85fdac9. * Manually install Ruby in cross Actions containers * mruby Android toolchain * Additional params for mruby android toolchain * Don't build redundant mrbgems * Whitelist mrbgem "stdlib-io" anyway * Don't fortify sources on Android * Disable source fortification project-wide on Android * Also disable fortify at link time on Android * Android build fixes * Fix building on Raspberry Pi * Fix missing variable prefix in Android CMake * Rename: mrb.c -> mruby.c * Adapt mruby.c code to master * Fix silly misplacement of definition in CMakeLists * Use CMake-native target version inference ref. https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_API.html * Do not link mruby against winsock on WinNT * Add mruby target to stub export action * Revert "Use CMake-native target version inference" This reverts commit 6164e0b0528343ada442654ccec03d106da9021a. * Explicitly set ANDROID_API from gradle * Move: /mruby/ -> /build/mruby/ More consistent with the rest of the project tree * baremetalpi: Link against libmruby * Prepare standalone NDK toolchains in Actions * Link sysroot in standalone NDK * Patch mruby with modern NDK support * Actions: Provision Git to allow "am" patching * Revert "Actions: Provision Git to allow "am" patching" This reverts commit 375ca376f2073589282589d5ea3373c32634021f. * Patch mruby during the configuration step * Github Actions: Recreate standalone NDK toolchains * Fix mruby build on Android * Update build instructions --- .github/workflows/build.yml | 92 ++- .gitignore | 2 + .gitmodules | 3 + CMakeLists.txt | 90 ++- README.md | 12 +- build/android/app/build.gradle | 4 +- build/assets/rubydemo.tic.dat | 1 + build/assets/rubymark.tic.dat | 1 + build/baremetalpi/Makefile | 2 + build/mruby/.gitignore | 1 + build/mruby/tic.gembox | 7 + build/mruby/tic_android.rb | 31 + build/mruby/tic_default.rb | 43 ++ demos/bunny/rubymark.rb | 122 ++++ demos/rubydemo.rb | 46 ++ include/tic80_config.h | 4 +- src/api.h | 96 ++- src/api/mruby.c | 1233 ++++++++++++++++++++++++++++++++ src/core/languages.c | 8 + src/studio/demos.c | 26 + src/studio/project.c | 6 +- vendor/mruby | 1 + 22 files changed, 1816 insertions(+), 15 deletions(-) create mode 100644 build/assets/rubydemo.tic.dat create mode 100644 build/assets/rubymark.tic.dat create mode 100644 build/mruby/.gitignore create mode 100644 build/mruby/tic.gembox create mode 100644 build/mruby/tic_android.rb create mode 100644 build/mruby/tic_default.rb create mode 100644 demos/bunny/rubymark.rb create mode 100644 demos/rubydemo.rb create mode 100644 src/api/mruby.c create mode 160000 vendor/mruby diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6da14ce4a..86f48f5cc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -46,6 +50,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -69,6 +77,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -98,6 +110,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -121,6 +137,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build shell: cmd run: | @@ -145,6 +165,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Install run: | sudo apt-get update @@ -179,6 +203,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Install run: | sudo apt-get update @@ -220,6 +248,15 @@ jobs: submodules: recursive fetch-depth: 0 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + - name: Build run: | cd build @@ -256,6 +293,15 @@ jobs: submodules: recursive fetch-depth: 0 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + - name: Prebuild run: | cd vendor/circle-stdlib @@ -306,6 +352,15 @@ jobs: submodules: recursive fetch-depth: 0 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + - name: Prebuild run: | cd vendor/circle-stdlib @@ -359,6 +414,15 @@ jobs: submodules: recursive fetch-depth: 0 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + - name: Build run: | cd build @@ -454,6 +518,28 @@ jobs: submodules: recursive fetch-depth: 0 + # - uses: ruby/setup-ruby@v1 + # with: + # ruby-version: 2.6 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full python3 + + - name: Recreate standalone NDK toolchains + run: | + for ARCH in arm arm64 x86 x86_64; do \ + API=24; \ + SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; \ + python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ + --api "$API" --arch "$ARCH" \ + --install-dir "$SYSROOT" --force ; \ + ln -Ffs "$SYSROOT/sysroot/usr" "$SYSROOT/usr" ; \ + done + mkdir -p /usr/local/opt + ln -Ffs "$ANDROID_NDK_HOME" /usr/local/opt/android-ndk + - name: Build run: | cd build/android @@ -478,6 +564,10 @@ jobs: submodules: recursive fetch-depth: 0 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - name: Build run: | cd build @@ -588,7 +678,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - script: [lua, moon, fennel, js, wren, squirrel] + script: [lua, moon, fennel, mruby, js, wren, squirrel] steps: - name: Download Windows XP artifact diff --git a/.gitignore b/.gitignore index 9aaf31384..4f1071a51 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,5 @@ build/x64/ build/linux/tic80.desktop build/compile_commands.json CMakeSettings.json +tic_mruby_build_config.rb.lock +tic_mruby_wasm_build_config.rb.lock diff --git a/.gitmodules b/.gitmodules index ba9826b08..f714fb983 100644 --- a/.gitmodules +++ b/.gitmodules @@ -77,3 +77,6 @@ [submodule "vendor/sdl2"] path = vendor/sdl2 url = https://github.com/libsdl-org/SDL.git +[submodule "mruby"] + path = vendor/mruby + url = https://github.com/mruby/mruby.git diff --git a/CMakeLists.txt b/CMakeLists.txt index c66322168..3730da132 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,10 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VERSION_BUILD ".dbg" ) endif() +if(CMAKE_BUILD_TYPE) + string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) +endif() + find_package(Git) if(Git_FOUND) execute_process( @@ -47,6 +51,7 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE) endif() + project(TIC-80 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} LANGUAGES C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") @@ -131,8 +136,18 @@ else() set(CMAKE_C_STANDARD 11) endif() +if(RPI) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") +endif() + +if(ANDROID) + set(CMAKE_SYSTEM_VERSION 24) +endif() + set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor) +include(ExternalProject) + ################################ # LUA ################################ @@ -220,6 +235,70 @@ target_include_directories(wren PUBLIC ${THIRDPARTY_DIR}/wren/src/include) target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/optional) target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) +################################ +# MRUBY +################################ + +find_program(RUBY ruby) +find_program(RAKE rake) +if(NOT RAKE) + message(FATAL_ERROR "Program `rake' not found! Ruby \"rake\" is required to build mruby support.") +endif() + +set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby) +set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) +if(ANDROID) + set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_android.rb) +else() + set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_default.rb) +endif() +set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) + +if(MSVC) + set(MRUBY_TOOLCHAIN visualcpp) +elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(MRUBY_TOOLCHAIN clang) +else() + set(MRUBY_TOOLCHAIN gcc) +endif() + +if(APPLE) + exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE MRUBY_SYSROOT) +endif() + +if(ANDROID_NDK_HOME) + set(MRUBY_RAKE_EXTRA_OPTS "${MRUBY_RAKE_EXTRA_OPTS} ANDROID_NDK_HOME=${ANDROID_NDK_HOME}") +endif() + +ExternalProject_Add(mruby_vendor + SOURCE_DIR ${MRUBY_DIR} + CONFIGURE_COMMAND "" + BUILD_IN_SOURCE TRUE + BUILD_COMMAND + ${RAKE} clean all "MRUBY_CONFIG=${MRUBY_CONFIG}" + "TARGET_CC=\"${CMAKE_C_COMPILER}\"" + "TARGET_AR=\"${CMAKE_AR}\"" + "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" + "BUILD_TYPE=${BUILD_TYPE_UC}" + "MRUBY_SYSROOT=${MRUBY_SYSROOT}" + "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" + "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" + "ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}" + ${MRUBY_RAKE_EXTRA_OPTS} + INSTALL_COMMAND "" + BUILD_BYPRODUCTS ${MRUBY_LIB} +) + +add_library(mruby STATIC IMPORTED GLOBAL) +set_property(TARGET mruby APPEND + PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} +) +set_property(TARGET mruby APPEND + PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include +) +add_dependencies(mruby mruby_vendor) + ################################ # SQUIRREL ################################ @@ -300,12 +379,13 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${TIC80CORE_DIR}/core/draw.c ${TIC80CORE_DIR}/core/io.c ${TIC80CORE_DIR}/core/sound.c - ${TIC80CORE_DIR}/api/js.c + ${TIC80CORE_DIR}/api/js.c ${TIC80CORE_DIR}/api/lua.c ${TIC80CORE_DIR}/api/moonscript.c ${TIC80CORE_DIR}/api/fennel.c ${TIC80CORE_DIR}/api/wren.c ${TIC80CORE_DIR}/api/squirrel.c + ${TIC80CORE_DIR}/api/mruby.c ${TIC80CORE_DIR}/tic.c ${TIC80CORE_DIR}/cart.c ${TIC80CORE_DIR}/tools.c @@ -333,7 +413,9 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) squirrel duktape blipbuf - zlib) + zlib + mruby + ) if(${BUILD_DEPRECATED}) target_compile_definitions(tic80core${SCRIPT} PRIVATE DEPRECATED_CHUNKS) @@ -358,6 +440,7 @@ if(BUILD_STUB) MACRO_CORE(js TIC_BUILD_WITH_JS FALSE) MACRO_CORE(wren TIC_BUILD_WITH_WREN FALSE) MACRO_CORE(squirrel TIC_BUILD_WITH_SQUIRREL FALSE) + MACRO_CORE(mruby TIC_BUILD_WITH_MRUBY FALSE) endif() @@ -487,7 +570,7 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIB}) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} @@ -1083,6 +1166,7 @@ if(BUILD_STUB) MACRO_STUB(js) MACRO_STUB(wren) MACRO_STUB(squirrel) + MACRO_STUB(mruby) endif() diff --git a/README.md b/README.md index 010f61b9d..aadf50fe3 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ To make a retro styled game, the whole process of creation and execution takes p - Multiple programming languages: [Lua](https://www.lua.org), [Moonscript](https://moonscript.org), [Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript), + [Ruby](https://www.ruby-lang.org/en/), [Wren](http://wren.io/), [Fennel](https://fennel-lang.org), and [Squirrel](http://www.squirrel-lang.org). - Games can have mouse and keyboard as input @@ -62,6 +63,7 @@ The wiki holds TIC-80 documentation, code snippets and game development tutorial ### with Visual Studio 2017 - install `Visual Studio 2017` - install `git` +- install `Ruby` (you can use [RubyInstaller](https://rubyinstaller.org/)) - run following commands in `cmd` ``` git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build @@ -74,6 +76,7 @@ cmake -G "Visual Studio 15 2017 Win64" .. - install `mingw-w64` (http://mingw-w64.org) and add `.../mingw/bin` path to the *System Variables Path* - install `git` - install `cmake` (https://cmake.org) +- install `Ruby` (you can use [RubyInstaller](https://rubyinstaller.org/)) - run following commands in `terminal` ``` git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build @@ -85,7 +88,7 @@ mingw32-make -j4 ### Ubuntu 14.04 run the following commands in the Terminal ``` -sudo apt-get install git cmake libgles1-mesa-dev libglu-dev -y +sudo apt-get install git cmake ruby-full libgles1-mesa-dev libglu-dev -y git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 @@ -102,7 +105,7 @@ Install with [Install instructions](#install-instructions) run the following commands in the Terminal ``` -sudo apt-get install g++ git cmake libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev -y +sudo apt-get install g++ git cmake ruby-full libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev -y git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 @@ -113,7 +116,7 @@ make -j4 run the following commands in the Terminal ``` sudo dnf -y groupinstall "Development Tools" -sudo dnf -y install git cmake libglvnd-devel libglvnd-gles freeglut-devel +sudo dnf -y install ruby rubygem-{tk{,-doc},rake,test-unit} cmake libglvnd-devel libglvnd-gles freeglut-devel git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. make -j4 @@ -141,7 +144,7 @@ sudo apt-get update sudo apt-get dist-upgrade # install software -sudo apt-get install git build-essential libsdl2-dev zlib1g-dev +sudo apt-get install git build-essential ruby-full libsdl2-dev zlib1g-dev sudo apt-get install -t jessie-backports liblua5.3-dev git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build cmake .. @@ -214,3 +217,4 @@ You can find iOS/tvOS version here * msx80 - [Twitter @msx80](https://twitter.com/msx80) [Github msx80](https://github.com/msx80) * Josh Goebel - [Twitter @dreamer3](https://twitter.com/dreamer3) [Github joshgoebel](https://github.com/joshgoebel) * Joshua Minor - [GitHub @jminor](https://github.com/jminor) +* Jeremiasz Nelz - [Github @remi6397](https://github.com/remi6397) [WWW](https://nelz.pl) diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 062c28563..63c0fc8bd 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -13,13 +13,13 @@ android { if (buildAsApplication) { applicationId "com.nesbox.tic" } - minSdkVersion 16 + minSdkVersion 24 targetSdkVersion 29 versionCode 10000 versionName "1.00.00" externalNativeBuild { ndkBuild { - arguments "APP_PLATFORM=android-16" + arguments "APP_PLATFORM=android-29" abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } cmake { diff --git a/build/assets/rubydemo.tic.dat b/build/assets/rubydemo.tic.dat new file mode 100644 index 000000000..0d6743aa6 --- /dev/null +++ b/build/assets/rubydemo.tic.dat @@ -0,0 +1 @@ +0x78, 0xda, 0xed, 0x51, 0xcb, 0x4a, 0xc3, 0x40, 0x14, 0x9d, 0xfa, 0x58, 0x64, 0x36, 0xe2, 0x1f, 0x8c, 0x6d, 0x84, 0xd6, 0x46, 0xcc, 0xa3, 0x14, 0x2d, 0xc4, 0x8d, 0x0a, 0x0a, 0x85, 0x82, 0x08, 0xae, 0xdb, 0x66, 0xaa, 0x81, 0x9a, 0x86, 0x64, 0x94, 0x06, 0xfc, 0x80, 0x2c, 0xfc, 0x08, 0x97, 0x12, 0xf2, 0x11, 0xb3, 0x96, 0x4b, 0xbf, 0xa4, 0xcc, 0x37, 0x78, 0x93, 0xfa, 0xe8, 0x42, 0x74, 0xd1, 0x85, 0x1b, 0xcf, 0x9d, 0xcb, 0xcc, 0x99, 0x33, 0xe7, 0x32, 0x70, 0xb6, 0x09, 0x21, 0x95, 0xe7, 0x35, 0xf2, 0x1b, 0x66, 0x80, 0x48, 0xd3, 0x34, 0xcf, 0xb2, 0x2c, 0x2f, 0x76, 0xa4, 0x39, 0xc8, 0xcf, 0x06, 0x98, 0xab, 0x34, 0x05, 0x95, 0x65, 0x52, 0xa5, 0x2f, 0x52, 0x41, 0x2e, 0x41, 0xe6, 0x52, 0x7e, 0xf4, 0xf7, 0x7e, 0xf8, 0xd1, 0x0f, 0x4b, 0x7e, 0xf2, 0x8f, 0x3f, 0x45, 0x99, 0x55, 0x91, 0x5d, 0x59, 0xaf, 0xe5, 0xf9, 0x09, 0x73, 0x04, 0x22, 0x01, 0xb3, 0x9d, 0x41, 0x4e, 0x00, 0xb3, 0x9b, 0xe7, 0x98, 0x5f, 0xf6, 0xde, 0x45, 0x9e, 0x44, 0xce, 0x15, 0x80, 0x52, 0xab, 0xfa, 0xb5, 0xe3, 0xd5, 0xfe, 0xbf, 0xbe, 0xb1, 0xb9, 0x55, 0x21, 0x35, 0x26, 0x7c, 0x31, 0xe6, 0x1d, 0xc6, 0x6e, 0xfa, 0x77, 0x7c, 0x41, 0x68, 0x8d, 0xf5, 0xef, 0xc5, 0xed, 0x24, 0xea, 0x2c, 0x2e, 0x3d, 0xfe, 0xc0, 0xc7, 0x93, 0x90, 0x47, 0x28, 0x78, 0x3c, 0x1e, 0xe2, 0x63, 0x16, 0xa3, 0x2c, 0x4a, 0x16, 0xf9, 0xa1, 0xf0, 0x27, 0x01, 0x6a, 0x8b, 0x73, 0x87, 0x45, 0xf7, 0x83, 0x84, 0x52, 0x5d, 0xb8, 0x26, 0xd5, 0xa7, 0xee, 0x51, 0x9b, 0xea, 0x89, 0x6b, 0xb7, 0x28, 0xf5, 0xf8, 0x88, 0x5d, 0x5d, 0x9c, 0x50, 0x4d, 0x4f, 0xf6, 0x5d, 0x8b, 0xf9, 0x23, 0x36, 0x10, 0x01, 0x33, 0x0b, 0xde, 0xfc, 0xe2, 0x16, 0xf2, 0xe9, 0x92, 0x6e, 0x17, 0x7c, 0x49, 0x77, 0x28, 0xd5, 0x86, 0xe3, 0x98, 0x59, 0x0e, 0xd5, 0xe2, 0x30, 0x62, 0x56, 0xb3, 0x5e, 0xd7, 0xc5, 0x6e, 0xdb, 0x6c, 0x1c, 0x38, 0xe6, 0xa3, 0xd9, 0xd8, 0xb3, 0x0d, 0x7d, 0x6a, 0xe8, 0x89, 0x61, 0xb5, 0x0c, 0xc7, 0x30, 0xb1, 0x6c, 0x03, 0x67, 0x84, 0x91, 0x1f, 0x08, 0x56, 0x3d, 0x3f, 0xeb, 0x76, 0x7b, 0xec, 0xba, 0x77, 0xd9, 0x3d, 0xdd, 0xa9, 0x1a, 0x87, 0x2d, 0x5c, 0x38, 0x5f, 0xe0, 0x7c, 0xca, 0x03, 0x8f, 0xbe, 0x01, 0x5a, 0xf8, 0x00, 0x3f, \ No newline at end of file diff --git a/build/assets/rubymark.tic.dat b/build/assets/rubymark.tic.dat new file mode 100644 index 000000000..c493983ab --- /dev/null +++ b/build/assets/rubymark.tic.dat @@ -0,0 +1 @@ +0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xdc, 0x44, 0x14, 0x77, 0x0e, 0x54, 0xb2, 0xc5, 0x4a, 0xeb, 0x2b, 0xe2, 0xf0, 0xd4, 0x84, 0x92, 0xa4, 0x1b, 0x77, 0x77, 0x93, 0x2c, 0x68, 0xbb, 0x5b, 0x42, 0x41, 0x15, 0x45, 0x80, 0x50, 0x53, 0xc8, 0x01, 0x45, 0xd5, 0xac, 0x3d, 0xbb, 0x3b, 0xaa, 0xd7, 0x36, 0xf6, 0xb8, 0x5b, 0xa7, 0xca, 0x95, 0x0b, 0x57, 0x3e, 0x00, 0x27, 0xb8, 0xc2, 0x89, 0x3b, 0x37, 0xa4, 0x8d, 0x94, 0x0f, 0x10, 0x47, 0xe5, 0x03, 0xb0, 0xe5, 0x10, 0xc1, 0x11, 0xde, 0xcc, 0xd8, 0x8e, 0x77, 0x93, 0x34, 0xdc, 0x00, 0x29, 0x23, 0x3f, 0xff, 0x79, 0xef, 0xf7, 0x7e, 0xf3, 0xde, 0xbc, 0x79, 0xe3, 0x57, 0xeb, 0x9a, 0xf6, 0xda, 0xeb, 0xb5, 0xdd, 0x37, 0x77, 0x7f, 0xbc, 0xb3, 0xfd, 0x62, 0x7f, 0xe7, 0xaf, 0x83, 0xf8, 0xfb, 0xdf, 0x83, 0xb7, 0x7f, 0x72, 0xde, 0xf8, 0x32, 0x59, 0x69, 0xf9, 0xb7, 0x77, 0x7f, 0x79, 0xf7, 0xbb, 0x3f, 0xa2, 0x17, 0x7f, 0x9e, 0x9c, 0x9c, 0x7c, 0xf3, 0xc3, 0xcf, 0x9f, 0xbb, 0x5f, 0xad, 0x77, 0x76, 0x16, 0xbe, 0xbd, 0xa6, 0x5d, 0x36, 0x4c, 0xd3, 0x44, 0x59, 0x48, 0x51, 0x0e, 0xe6, 0x44, 0xe8, 0x52, 0xad, 0x8a, 0xb7, 0x8a, 0x79, 0x38, 0x99, 0x93, 0xa3, 0x54, 0x4b, 0xc5, 0x10, 0x0c, 0x69, 0x5a, 0x35, 0x27, 0x47, 0xb3, 0x72, 0x80, 0x3a, 0xa1, 0xbf, 0x6c, 0x68, 0x57, 0xe3, 0x5f, 0x1d, 0x79, 0x9d, 0x73, 0x59, 0xd0, 0x0e, 0xd3, 0x5f, 0xa7, 0xc7, 0x28, 0x53, 0x7c, 0x7f, 0x7e, 0x5c, 0xc1, 0x1a, 0x57, 0xd2, 0x6c, 0x54, 0xd0, 0x98, 0x4e, 0x52, 0x25, 0x6a, 0x1c, 0x62, 0x8d, 0x0f, 0xb3, 0x5a, 0x2b, 0xa9, 0x68, 0x85, 0x11, 0xdf, 0xe7, 0xeb, 0x2d, 0x76, 0x44, 0x25, 0x93, 0xea, 0x55, 0xfd, 0xff, 0x0b, 0xf5, 0x9f, 0xbe, 0x4c, 0xd2, 0x83, 0xc9, 0x24, 0x9d, 0xcc, 0x89, 0xd0, 0x15, 0xa3, 0x6a, 0x1e, 0xcd, 0x49, 0x5a, 0x92, 0xab, 0xfe, 0xff, 0x3f, 0xd7, 0xdf, 0xd4, 0xd2, 0xdf, 0xf0, 0x20, 0x98, 0x4e, 0xa7, 0x15, 0xc4, 0x56, 0xb3, 0x9e, 0xcd, 0x45, 0x8c, 0x63, 0xac, 0xf1, 0x14, 0xe5, 0xf9, 0x31, 0xfe, 0x28, 0xa6, 0xb3, 0x62, 0x6a, 0x97, 0x96, 0xdf, 0x7c, 0xe5, 0xeb, 0x6b, 0xda, 0x22, 0x70, 0xc6, 0x5d, 0xda, 0x86, 0xbb, 0xb1, 0xe7, 0x25, 0x23, 0x12, 0x3e, 0x06, 0xe6, 0xc1, 0x83, 0xb8, 0x97, 0x18, 0x8b, 0x40, 0x62, 0x3e, 0xf4, 0xc3, 0x36, 0x7c, 0x48, 0x43, 0x3a, 0x62, 0x24, 0xda, 0x83, 0x4f, 0xa8, 0xbb, 0x77, 0x1b, 0x7a, 0x24, 0xa2, 0x0e, 0xf8, 0x1e, 0xf0, 0x21, 0x05, 0x3f, 0x64, 0x03, 0xe6, 0x11, 0x17, 0xc6, 0x3e, 0x3a, 0xfb, 0x7d, 0x78, 0xe0, 0xf7, 0xe0, 0x23, 0x9f, 0xd8, 0x43, 0x64, 0x70, 0x68, 0x64, 0x23, 0x37, 0xf5, 0xec, 0xa1, 0xe0, 0x66, 0xde, 0x00, 0xb8, 0xef, 0xbb, 0x78, 0x83, 0x88, 0x52, 0x18, 0xfa, 0x63, 0x18, 0x11, 0x2f, 0x81, 0x1e, 0xce, 0xce, 0x68, 0x04, 0x36, 0xf1, 0xa0, 0xef, 0x26, 0x40, 0x42, 0x3f, 0xf6, 0x1c, 0xc9, 0x1f, 0xd9, 0x21, 0xa5, 0x5e, 0x0d, 0xe2, 0x48, 0x78, 0x8b, 0xc8, 0x2c, 0x24, 0x66, 0x5e, 0x10, 0xf3, 0x36, 0x0c, 0xc8, 0x88, 0x06, 0xc4, 0x41, 0x05, 0xc2, 0x58, 0x80, 0x9a, 0x50, 0x85, 0xfe, 0x84, 0x86, 0x11, 0xf3, 0xbd, 0x36, 0xd4, 0xad, 0x86, 0x55, 0x37, 0x8c, 0x6d, 0xc9, 0xb2, 0xc3, 0x1c, 0x3e, 0x84, 0x2e, 0x34, 0x37, 0xea, 0xa8, 0x54, 0xba, 0x0f, 0x28, 0x1b, 0x0c, 0x39, 0x2a, 0x1b, 0xeb, 0x2d, 0x54, 0x3e, 0xc4, 0xf0, 0x7a, 0x24, 0x2c, 0xb4, 0x2d, 0x63, 0x49, 0x3c, 0x90, 0xc2, 0x76, 0x49, 0x14, 0xa9, 0x75, 0x32, 0xf4, 0xad, 0xad, 0x71, 0xce, 0x25, 0xbc, 0xf0, 0x7b, 0x98, 0x7b, 0xac, 0x37, 0xc5, 0x84, 0xba, 0x43, 0xfb, 0x18, 0x25, 0xe3, 0x8c, 0xb8, 0x6c, 0x8f, 0x1a, 0xba, 0xbe, 0xf5, 0x14, 0x8d, 0xf7, 0x5c, 0x9f, 0xf0, 0xe5, 0x90, 0x78, 0xce, 0x72, 0x39, 0xa4, 0x35, 0xc8, 0x08, 0x57, 0x56, 0x04, 0x32, 0x39, 0x0f, 0x99, 0x85, 0x24, 0xa0, 0x6a, 0x2e, 0x85, 0x8d, 0x02, 0x4a, 0x9d, 0x47, 0x73, 0xdc, 0xcd, 0x7a, 0x7d, 0x05, 0x91, 0x0d, 0xf1, 0xb8, 0x05, 0x2d, 0x91, 0x6d, 0x01, 0x4d, 0xfe, 0x19, 0x34, 0x64, 0x9c, 0x8a, 0x55, 0x31, 0x74, 0xea, 0x39, 0x59, 0x3e, 0x4e, 0x48, 0xc6, 0x68, 0x45, 0x23, 0x64, 0x88, 0x1a, 0x6c, 0x3d, 0x45, 0x49, 0x6a, 0xd0, 0x90, 0x57, 0x5d, 0x5e, 0x1b, 0x78, 0x95, 0xfd, 0xe2, 0xc0, 0x21, 0x3c, 0x5b, 0x83, 0x9b, 0x5d, 0xc8, 0x63, 0x56, 0xa9, 0x9e, 0x2a, 0x12, 0x84, 0xeb, 0xac, 0x0f, 0x02, 0x95, 0x2f, 0x08, 0xdc, 0x81, 0xd2, 0x42, 0xa1, 0x5d, 0xad, 0xe3, 0xb9, 0x8b, 0x27, 0xad, 0xf9, 0x7a, 0xac, 0x76, 0x61, 0xad, 0x21, 0x93, 0x11, 0x71, 0xe4, 0xbc, 0x1d, 0x50, 0x09, 0x2a, 0x96, 0xfc, 0xfd, 0x65, 0x3e, 0x89, 0x8c, 0x25, 0xab, 0x6e, 0x1e, 0x8c, 0xaa, 0x85, 0xf4, 0x4d, 0x8a, 0x68, 0xce, 0x14, 0xa8, 0xc4, 0x9d, 0x5c, 0xc0, 0xdd, 0x81, 0x99, 0x0d, 0x57, 0x30, 0x9e, 0xd5, 0x5e, 0xc0, 0x23, 0x6e, 0x72, 0xa1, 0xd5, 0xf6, 0xbc, 0xf7, 0xe9, 0xf6, 0x79, 0x5b, 0xef, 0x09, 0x71, 0x63, 0x2a, 0xb7, 0x31, 0x7e, 0xf4, 0x43, 0xec, 0x9a, 0x28, 0xff, 0x42, 0x37, 0xfe, 0x88, 0xb3, 0x91, 0x30, 0xaf, 0xe1, 0x2e, 0xa8, 0x97, 0x0b, 0x37, 0xa0, 0x62, 0x72, 0x07, 0x4d, 0x12, 0x81, 0xa9, 0x15, 0x70, 0x95, 0x82, 0x03, 0x9d, 0x2e, 0x28, 0xaf, 0x53, 0xe6, 0x9b, 0x72, 0xdb, 0xe8, 0xd4, 0x8d, 0xa8, 0x54, 0xe7, 0xb3, 0x67, 0xf6, 0x32, 0x54, 0x05, 0x31, 0x1b, 0x45, 0xc6, 0xae, 0xa2, 0xc8, 0xbc, 0x4b, 0x89, 0x2e, 0xf5, 0x03, 0xe1, 0x87, 0x99, 0x5a, 0x1e, 0x1d, 0x1b, 0x4b, 0xf9, 0xd9, 0xd1, 0x85, 0x2f, 0x76, 0x4f, 0xbf, 0x3a, 0x1d, 0xd5, 0xaa, 0x12, 0x63, 0x88, 0x5c, 0x1e, 0xde, 0x7f, 0xcf, 0xd0, 0x17, 0xe1, 0x63, 0x3c, 0x48, 0x6c, 0x43, 0x1f, 0x89, 0xc7, 0x32, 0xee, 0x79, 0x4c, 0x62, 0x89, 0x5b, 0x7b, 0x34, 0xf4, 0xdf, 0x31, 0xf4, 0x5c, 0xdf, 0xc8, 0xf4, 0xd0, 0xc5, 0x13, 0x60, 0xb5, 0xb5, 0xb1, 0xda, 0xb4, 0xd6, 0xdf, 0xda, 0x34, 0x74, 0xd4, 0xc8, 0xe4, 0x04, 0xd1, 0x7d, 0x71, 0x04, 0x19, 0xfa, 0xa6, 0x25, 0xe2, 0x8d, 0xe0, 0x19, 0x9c, 0x3b, 0x37, 0xec, 0x0b, 0xa6, 0x1e, 0xf7, 0x44, 0xa2, 0x67, 0xb1, 0x56, 0xe0, 0x07, 0xa7, 0x10, 0x45, 0xfc, 0x59, 0xd6, 0x2d, 0x05, 0x86, 0xe2, 0x61, 0x0a, 0x37, 0xda, 0x59, 0x17, 0x09, 0xc8, 0xfb, 0xb2, 0x11, 0x6d, 0x37, 0x82, 0xc6, 0xe6, 0x59, 0xa0, 0x6c, 0x53, 0x43, 0x0f, 0xa9, 0xcd, 0xb3, 0x86, 0x2c, 0xb5, 0x4b, 0x6d, 0x76, 0x6f, 0xd5, 0x44, 0x5c, 0xd8, 0xca, 0x1e, 0x87, 0xeb, 0x77, 0x15, 0x4d, 0x1b, 0x16, 0x9f, 0x15, 0x94, 0x36, 0x1e, 0xc4, 0x7c, 0xff, 0x7a, 0xde, 0xdc, 0x0d, 0x7c, 0xf4, 0x09, 0x16, 0x56, 0x2a, 0xe4, 0x5b, 0xe1, 0x8e, 0x15, 0x91, 0xae, 0x58, 0x1f, 0x0b, 0x37, 0x8e, 0x70, 0x2a, 0xb7, 0xe9, 0x2d, 0x68, 0x5e, 0x48, 0x21, 0x0a, 0xfb, 0x37, 0x80, 0x19, 0xaa, 0x35, \ No newline at end of file diff --git a/build/baremetalpi/Makefile b/build/baremetalpi/Makefile index a3f101b5e..61dc81c18 100644 --- a/build/baremetalpi/Makefile +++ b/build/baremetalpi/Makefile @@ -3,6 +3,7 @@ # TIC80HOME = ../.. TIC803RD = $(TIC80HOME)/vendor +MRUBYDIR = $(TIC803RD)/mruby CIRCLESTDLIB = $(TIC803RD)/circle-stdlib CIRCLEHOME = $(CIRCLESTDLIB)/libs/circle NEWLIBDIR = $(CIRCLESTDLIB)/install/arm-none-circle @@ -36,6 +37,7 @@ LIBS := \ $(TIC80LIB)/libduktape.a \ $(TIC80LIB)/libzlib.a \ $(TIC80LIB)/libpng.a \ + $(MRUBYDIR)/build/target/lib/libmruby.a \ $(NEWLIBDIR)/lib/libc.a \ $(NEWLIBDIR)/lib/libcirclenewlib.a \ $(CIRCLEHOME)/addon/vc4/sound/libvchiqsound.a \ diff --git a/build/mruby/.gitignore b/build/mruby/.gitignore new file mode 100644 index 000000000..63f1fef0e --- /dev/null +++ b/build/mruby/.gitignore @@ -0,0 +1 @@ +*.lock diff --git a/build/mruby/tic.gembox b/build/mruby/tic.gembox new file mode 100644 index 000000000..4a6139606 --- /dev/null +++ b/build/mruby/tic.gembox @@ -0,0 +1,7 @@ +MRuby::GemBox.new do |conf| + conf.gembox "stdlib" + conf.gembox "stdlib-ext" + conf.gembox "math" + conf.gembox "metaprog" +end +# vim: set ft=ruby : diff --git a/build/mruby/tic_android.rb b/build/mruby/tic_android.rb new file mode 100644 index 000000000..9122d018e --- /dev/null +++ b/build/mruby/tic_android.rb @@ -0,0 +1,31 @@ +MRuby::Build.new do |conf| + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + conf.toolchain + end + + conf.build_mrbc_exec + conf.disable_libmruby + conf.disable_presym +end + +MRuby::CrossBuild.new('target') do |conf| + ARCH = ENV['ANDROID_ARCH'] + PLATFORM = ENV['ANDROID_PLATFORM'] + API = ENV['ANDROID_PLATFORM'].rpartition('-').last + + toolchain :android, arch: ARCH, platform: PLATFORM + + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + conf.cc do |cc| + cc.flags << '-fPIC' + cc.defines << '__ANDROID__' + cc.defines << "__ANDROID_API__=#{API}" + end + + conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] + conf.enable_bintest + conf.enable_test +end diff --git a/build/mruby/tic_default.rb b/build/mruby/tic_default.rb new file mode 100644 index 000000000..04b803546 --- /dev/null +++ b/build/mruby/tic_default.rb @@ -0,0 +1,43 @@ +MRuby::Build.new do |conf| + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + conf.toolchain + end + + conf.build_mrbc_exec + conf.disable_libmruby + conf.disable_presym +end + +MRuby::CrossBuild.new('target') do |conf| + toolchain ENV['MRUBY_TOOLCHAIN'] + + conf.gembox File.expand_path('tic', File.dirname(__FILE__)) + + conf.cc do |cc| + cc.command = ENV["TARGET_CC"] || 'cc' + cc.flags = [ENV["TARGET_CFLAGS"] || %w()] + cc.flags << '-fPIC' unless ENV['MRUBY_TOOLCHAIN'] == 'visualcpp' + cc.flags << "-isysroot #{ENV['MRUBY_SYSROOT']}" unless ENV['MRUBY_SYSROOT'].empty? + end + + conf.linker do |linker| + linker.command = ENV['TARGET_CC'] || 'cc' + linker.flags = [ENV['TARGET_LDFLAGS'] || %w()] + end + + conf.archiver do |archiver| + archiver.command = ENV['TARGET_AR'] || 'ar' + end + + conf.exts do |exts| + exts.object = '.o' + exts.library = '.a' + # exts.executable = '' # '.exe' if Windows + end + + conf.enable_debug if /DEBUG/ =~ ENV["BUILD_TYPE"] + conf.enable_bintest + conf.enable_test +end diff --git a/demos/bunny/rubymark.rb b/demos/bunny/rubymark.rb new file mode 100644 index 000000000..a6219a9f8 --- /dev/null +++ b/demos/bunny/rubymark.rb @@ -0,0 +1,122 @@ +# title: Bunnymark in Ruby +# author: Jeremiasz Nelz; based on the original work of Rob Loach +# desc: Benchmarking tool to see how many bunnies can fly around the screen, using Ruby. +# input: gamepad +# script: ruby +# version: 0.1.0 + +ScreenWidth = 240.0 +ScreenHeight = 136.0 +ToolbarHeight = 6 +$t = 0 + +class Bunny + @@width = 26.0 + @@height = 32.0 + + def initialize + @x = Float(rand(ScreenWidth - @@width)) + @y = Float(rand(ScreenHeight - @@height)) + @speed_x = Float(rand(200) - 100) / 60.0 + @speed_y = Float(rand(200) - 100) / 60.0 + @sprite = 1 + end + + def draw + spr @sprite, @x, @y, 1, 1, 0, 0, 4, 4 + end + + def update + @x += @speed_x + @y += @speed_y + + if @x + @@width > ScreenWidth + @x = ScreenWidth - @@width + @speed_x *= -1.0 + end + if @x < 0.0 + @x = 0.0 + @speed_x *= -1.0 + end + if @y + @@height > ScreenHeight + @y = ScreenHeight - @@height + @speed_y *= -1.0 + end + if @y < ToolbarHeight + @y = ToolbarHeight + @speed_y *= -1.0 + end + end +end + +class FPS + def initialize + @value = 0 + @frames = 0 + @last_time = -1000 + end + + def get + d = time - @last_time + if d <= 1000 + @frames += 1 + else + @value = @frames + @frames = 0 + @last_time = time + end + + @value + end +end + +$fps = FPS.new +$bunnies = [] +$bunnies << Bunny.new + +def TIC + # Music + music(0) if $t.zero? + + music(1) if $t == 6*64*2.375 + $t += 1 + + # Input + 5.times { $bunnies << Bunny.new } if btn 0 + 5.times { $bunnies.pop } if btn 1 + + # Update + $bunnies.each &:update + + # Draw + cls 15 + $bunnies.each &:draw + + rect 0, 0, ScreenWidth, ToolbarHeight, 0 + print "Bunnies: #{$bunnies.count}", 1, 0, 11, false, 1, false + print "FPS: #{$fps.get}", ScreenWidth / 2, 0, 11, false, 1, false +end + +# +# 001:11111100111110dd111110dc111110dc111110dc111110dc111110dd111110dd +# 002:00011110ddd0110dccd0110dccd0110dccd0110dccd0110dcddd00dddddddddd +# 003:00001111dddd0111cccd0111cccd0111cccd0111cccd0111dcdd0111dddd0111 +# 004:1111111111111111111111111111111111111111111111111111111111111111 +# 017:111110dd111110dd111110dd111110dd10000ddd1eeeeddd1eeeeedd10000eed +# 018:d0ddddddd0ddddddddddddddddd0000dddddccddddddccdddddddddddddddddd +# 019:0ddd01110ddd0111dddd0111dddd0111ddddd000ddddddddddddddddddddd000 +# 020:1111111111111111111111111111111101111111d0111111d011111101111111 +# 033:111110ee111110ee111110ee111110ee111110ee111110ee111110ee111110ee +# 034:dddcccccddccccccddccccccddccccccddccccccdddcccccdddddddddddddddd +# 035:dddd0111cddd0111cddd0111cddd0111cddd0111dddd0111dddd0111dddd0111 +# 036:1111111111111111111111111111111111111111111111111111111111111111 +# 049:111110ee111110ee111110ee111110ee111110ee111110ee111110ee11111100 +# 050:dddeeeeeddeeeeeed00000000111111101111111011111110111111111111111 +# 051:eddd0111eedd01110eed011110ee011110ee011110ee011110ee011111001111 +# 052:1111111111111111111111111111111111111111111111111111111111111111 +# + +# +# 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57 +# + diff --git a/demos/rubydemo.rb b/demos/rubydemo.rb new file mode 100644 index 000000000..8483bf08c --- /dev/null +++ b/demos/rubydemo.rb @@ -0,0 +1,46 @@ +# title: game title +# author: game developer +# desc: short description +# script: ruby + +$t=0 +$x=96 +$y=24 + +def TIC + $y-=1 if btn 0 + $y+=1 if btn 1 + $x-=1 if btn 2 + $x+=1 if btn 3 + + cls 13 + spr 1+(($t%60)/30|0)*2,$x,$y,14,3,0,0,2,2 + print "HELLO WORLD!",84,84 + $t+=1 +end + +# +# 001:eccccccccc888888caaaaaaaca888888cacccccccacc0ccccacc0ccccacc0ccc +# 002:ccccceee8888cceeaaaa0cee888a0ceeccca0ccc0cca0c0c0cca0c0c0cca0c0c +# 003:eccccccccc888888caaaaaaaca888888cacccccccacccccccacc0ccccacc0ccc +# 004:ccccceee8888cceeaaaa0cee888a0ceeccca0cccccca0c0c0cca0c0c0cca0c0c +# 017:cacccccccaaaaaaacaaacaaacaaaaccccaaaaaaac8888888cc000cccecccccec +# 018:ccca00ccaaaa0ccecaaa0ceeaaaa0ceeaaaa0cee8888ccee000cceeecccceeee +# 019:cacccccccaaaaaaacaaacaaacaaaaccccaaaaaaac8888888cc000cccecccccec +# 020:ccca00ccaaaa0ccecaaa0ceeaaaa0ceeaaaa0cee8888ccee000cceeecccceeee +# + +# +# 000:00000000ffffffff00000000ffffffff +# 001:0123456789abcdeffedcba9876543210 +# 002:0123456789abcdef0123456789abcdef +# + +# +# 000:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304000000000 +# + +# +# 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57 +# + diff --git a/include/tic80_config.h b/include/tic80_config.h index 222981dab..1a884d19b 100644 --- a/include/tic80_config.h +++ b/include/tic80_config.h @@ -27,7 +27,8 @@ !defined(TIC_BUILD_WITH_FENNEL) && \ !defined(TIC_BUILD_WITH_JS) && \ !defined(TIC_BUILD_WITH_WREN) && \ - !defined(TIC_BUILD_WITH_SQUIRREL) + !defined(TIC_BUILD_WITH_SQUIRREL) && \ + !defined(TIC_BUILD_WITH_MRUBY) # define TIC_BUILD_WITH_LUA 1 # define TIC_BUILD_WITH_MOON 1 @@ -35,6 +36,7 @@ # define TIC_BUILD_WITH_JS 1 # define TIC_BUILD_WITH_WREN 1 # define TIC_BUILD_WITH_SQUIRREL 1 +# define TIC_BUILD_WITH_MRUBY 1 #endif diff --git a/src/api.h b/src/api.h index fc4d07790..450186e45 100644 --- a/src/api.h +++ b/src/api.h @@ -149,6 +149,8 @@ enum // definition // help // parameters count +// required parameters count +// callback? // return type // function parameters // ) @@ -166,6 +168,8 @@ enum "- To use a custom rastered font, check out `font()`.\n" \ "- To print to the console, check out `trace()`.", \ 7, \ + 1, \ + 0, \ s32, \ tic_mem*, const char* text, s32 x, s32 y, u8 color, bool fixed, s32 scale, bool alt) \ \ @@ -177,6 +181,8 @@ enum "When called this function clear all the screen using the color passed as argument.\n" \ "If no parameter is passed first color (0) is used.", \ 1, \ + 0, \ + 0, \ void, \ tic_mem*, u8 color) \ \ @@ -188,6 +194,8 @@ enum "When called with a color parameter, the pixel at the specified coordinates is set to that color.\n" \ "Calling the function without a color parameter returns the color of the pixel at the specified position.", \ 3, \ + 2, \ + 0, \ u8, \ tic_mem*, s32 x, s32 y, u8 color, bool get) \ \ @@ -197,6 +205,8 @@ enum \ "Draws a straight line from point (x0,y0) to point (x1,y1) in the specified color.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, u8 color) \ \ @@ -207,6 +217,8 @@ enum "This function draws a filled rectangle of the desired size and color at the specified position.\n" \ "If you only need to draw the the border or outline of a rectangle (ie not filled) see `rectb()`.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height, u8 color) \ \ @@ -217,6 +229,8 @@ enum "This function draws a one pixel thick rectangle border at the position requested.\n" \ "If you need to fill the rectangle with a color, see `rect()` instead.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height, u8 color) \ \ @@ -242,6 +256,8 @@ enum "You can draw a composite sprite (consisting of a rectangular region of sprites from the sprite sheet) " \ "by specifying the `w` and `h` parameters (which default to 1).", \ 9, \ + 3, \ + 0, \ void, \ tic_mem*, s32 index, s32 x, s32 y, s32 w, s32 h, \ u8* colors, s32 count, s32 scale, tic_flip flip, tic_rotate rotate) \ @@ -255,6 +271,8 @@ enum "It remains true for as long as the key is held down.\n" \ "If you want to test if a key was just pressed, use `btnp()` instead.", \ 1, \ + 1, \ + 0, \ u32, \ tic_mem*, s32 id) \ \ @@ -273,6 +291,8 @@ enum "Since time is expressed in ticks and TIC runs at 60 frames per second, " \ "we use the value of 120 to wait 2 seconds and 6 ticks (ie 60/10) as the interval for re-checking.", \ 3, \ + 1, \ + 0, \ u32, \ tic_mem*, s32 id, s32 hold, s32 period) \ \ @@ -299,6 +319,8 @@ enum "The `speed` in the range -4 to 3 can be specified and means how many `ticks+1` to play each step, " \ "so speed==0 means 1 tick per step.", \ 6, \ + 1, \ + 0, \ void, \ tic_mem*, s32 index, s32 note, s32 octave, \ s32 duration, s32 channel, s32 left, s32 right, s32 speed) \ @@ -323,6 +345,8 @@ enum "will cause tile(sprite) #1 to appear at top left when map() is called.\n" \ "To set the tile immediately below this we need to write to 0x08000 + 240, ie 0x080F0.", \ 9, \ + 0, \ + 1, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height, s32 sx, s32 sy, \ u8* colors, s32 count, s32 scale, RemapFunc remap, void* data) \ @@ -333,6 +357,8 @@ enum \ "Gets the sprite id at the given x and y map coordinate.", \ 2, \ + 2, \ + 0, \ u8, \ tic_mem*, s32 x, s32 y) \ \ @@ -345,6 +371,8 @@ enum "To make permanent changes to the map, see `sync()`.\n" \ "Related: `map()` `mget()` `sync()`.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, u8 value) \ \ @@ -360,6 +388,8 @@ enum "To write to a memory address, use `poke()`.\n" \ "`bits` allowed to be 1,2,4,8.", \ 2, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address, s32 bits) \ \ @@ -371,6 +401,8 @@ enum "The address should be specified in hexadecimal format, the value in decimal.\n" \ "`bits` allowed to be 1,2,4,8.", \ 3, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value, s32 bits) \ \ @@ -381,6 +413,8 @@ enum "This function enables you to read single bit values from TIC's RAM.\n" \ "The address is often specified in hexadecimal format.", \ 1, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address) \ \ @@ -391,6 +425,8 @@ enum "This function allows you to write single bit values directly to RAM.\n" \ "The address is often specified in hexadecimal format.", \ 2, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value) \ \ @@ -401,6 +437,8 @@ enum "This function enables you to read two bits values from TIC's RAM.\n" \ "The address is often specified in hexadecimal format.", \ 1, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address) \ \ @@ -411,6 +449,8 @@ enum "This function allows you to write two bits values directly to RAM.\n" \ "The address is often specified in hexadecimal format.", \ 2, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value) \ \ @@ -422,6 +462,8 @@ enum "The address is often specified in hexadecimal format.\n" \ "See 'poke4()' for detailed information on how nibble addressing compares with byte addressing.", \ 1, \ + 1, \ + 0, \ u8, \ tic_mem*, s32 address) \ \ @@ -435,6 +477,8 @@ enum "Therefore, to access the the RAM at byte address 0x4000\n" \ "you would need to access both the 0x8000 and 0x8001 nibble addresses.", \ 2, \ + 2, \ + 0, \ void, \ tic_mem*, s32 address, u8 value) \ \ @@ -445,6 +489,8 @@ enum "This function allows you to copy a continuous block of TIC's 96K RAM from one address to another.\n" \ "Addresses are specified are in hexadecimal format, values are decimal.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 dst, s32 src, s32 size) \ \ @@ -455,6 +501,8 @@ enum "This function allows you to set a continuous block of any part of TIC's RAM to the same value.\n" \ "The address is specified in hexadecimal format, the value in decimal.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 dst, u8 val, s32 size) \ \ @@ -468,6 +516,8 @@ enum "- The Lua concatenator for strings is .. (two points).\n" \ "- Use console cls command to clear the output from trace.", \ 2, \ + 1, \ + 0, \ void, \ tic_mem*, const char* text, u8 color) \ \ @@ -484,6 +534,8 @@ enum "- Use `saveid:` with a personalized string in the header metadata to override the default MD5 calculation.\n" \ "This allows the user to update a cart without losing their saved data.", \ 2, \ + 1, \ + 0, \ u32, \ tic_mem*, s32 index, u32 value, bool get) \ \ @@ -494,6 +546,8 @@ enum "This function returns the number of milliseconds elapsed since the cartridge began execution.\n" \ "Useful for keeping track of time, animating items and triggering events.", \ 0, \ + 0, \ + 0, \ double, \ tic_mem*) \ \ @@ -504,6 +558,8 @@ enum "This function returns the number of seconds elapsed since January 1st, 1970.\n" \ "Useful for creating persistent games which evolve over time between plays.", \ 0, \ + 0, \ + 0, \ s32, \ tic_mem*) \ \ @@ -513,6 +569,8 @@ enum \ "Interrupts program execution and returns to the console when the TIC function ends.", \ 0, \ + 0, \ + 0, \ void, \ tic_mem*) \ \ @@ -524,6 +582,8 @@ enum "To simply print to the screen, check out `print()`.\n" \ "To print to the console, check out `trace()`.", \ 8, \ + 6, \ + 0, \ s32, \ tic_mem*, const char* text, s32 x, s32 y, \ u8 chromakey, s32 w, s32 h, bool fixed, s32 scale, bool alt) \ @@ -535,6 +595,8 @@ enum "This function returns the mouse coordinates and a boolean value for the state of each mouse button," \ "with true indicating that a button is pressed.", \ 0, \ + 0, \ + 0, \ tic_point, \ tic_mem*) \ \ @@ -545,6 +607,8 @@ enum "This function draws a filled circle of the desired radius and color with its center at x, y.\n" \ "It uses the Bresenham algorithm.", \ 4, \ + 4, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 radius, u8 color) \ \ @@ -555,6 +619,8 @@ enum "Draws the circumference of a circle with its center at x, y using the radius and color requested.\n" \ "It uses the Bresenham algorithm.", \ 4, \ + 4, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 radius, u8 color) \ \ @@ -565,6 +631,8 @@ enum "This function draws a filled ellipse of the desired a, b radiuses and color with its center at x, y.\n" \ "It uses the Bresenham algorithm.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 a, s32 b, u8 color) \ \ @@ -575,6 +643,8 @@ enum "This function draws an ellipse border with the desired radiuses a b and color with its center at x, y.\n" \ "It uses the Bresenham algorithm.", \ 5, \ + 5, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 a, s32 b, u8 color) \ \ @@ -584,6 +654,8 @@ enum \ "This function draws a triangle filled with color, using the supplied vertices.", \ 7, \ + 7, \ + 0, \ void, \ tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) \ \ @@ -592,6 +664,8 @@ enum \ "This function draws a triangle border with color, using the supplied vertices.", \ 7, \ + 7, \ + 0, \ void, \ tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) \ \ @@ -609,6 +683,8 @@ enum "with U and V addressing its pixels directly, rather than by sprite ID.\n" \ "So for example the top left corner of sprite #2 would be located at u=16, v=0.", \ 14, \ + 12, \ + 0, \ void, \ tic_mem*, float x1, float y1, float x2, float y2, float x3, float y3, \ float u1, float v1, float u2, float v2, float u3, float v3, bool use_map, u8* colors, s32 count) \ @@ -621,6 +697,8 @@ enum "Things drawn outside of this area will not be visible.\n" \ "Calling clip() with no parameters will reset the drawing area to the entire screen.", \ 4, \ + 4, \ + 0, \ void, \ tic_mem*, s32 x, s32 y, s32 width, s32 height) \ \ @@ -631,6 +709,8 @@ enum "This function starts playing a track created in the Music Editor.\n" \ "Call without arguments to stop the music.", \ 7, \ + 0, \ + 0, \ void, \ tic_mem*, s32 track, s32 frame, s32 row, bool loop, bool sustain, s32 tempo, s32 speed) \ \ @@ -647,6 +727,8 @@ enum "This resets the whole runtime memory to the contents of bank 0." \ "Note that sync is not used to load code from banks; this is done automatically.", \ 3, \ + 0, \ + 0, \ void, \ tic_mem*, u32 mask, s32 bank, bool toCart) \ \ @@ -656,6 +738,8 @@ enum \ "VRAM contains 2x16K memory chips, use vbank(0) or vbank(1) to switch between them.", \ 1, \ + 1, \ + 0, \ s32, \ tic_mem*, s32 bank) \ \ @@ -665,6 +749,8 @@ enum \ "Resets the cartridge. To return to the console, see the `exit()`.", \ 0, \ + 0, \ + 0, \ void, \ tic_mem*) \ \ @@ -674,6 +760,8 @@ enum \ "The function returns true if the key denoted by keycode is pressed.", \ 1, \ + 0, \ + 0, \ bool, \ tic_mem*, tic_key key) \ \ @@ -684,6 +772,8 @@ enum "This function returns true if the given key is pressed but wasn't pressed in the previous frame.\n" \ "Refer to `btnp()` for an explanation of the optional hold and period parameters.", \ 3, \ + 0, \ + 0, \ bool, \ tic_mem*, tic_key key, s32 hold, s32 period) \ \ @@ -693,6 +783,8 @@ enum \ "Returns true if the specified flag of the sprite is set. See `fset()` for more details.", \ 2, \ + 2, \ + 0, \ bool, \ tic_mem*, s32 index, u8 flag) \ \ @@ -705,10 +797,12 @@ enum "flag 6 might indicate that the flag should be draw scaled etc.\n" \ "See algo `fget()`.", \ 3, \ + 3, \ + 0, \ void, \ tic_mem*, s32 index, u8 flag, bool value) -#define TIC_API_DEF(name, _, __, ___, ret, ...) ret tic_api_##name(__VA_ARGS__); +#define TIC_API_DEF(name, _, __, ___, ____, _____, ret, ...) ret tic_api_##name(__VA_ARGS__); TIC_API_LIST(TIC_API_DEF) #undef TIC_API_DEF diff --git a/src/api/mruby.c b/src/api/mruby.c new file mode 100644 index 000000000..840489cd3 --- /dev/null +++ b/src/api/mruby.c @@ -0,0 +1,1233 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com +// Copyright (c) 2020-2021 Jeremiasz Nelz + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include "core/core.h" + +#if defined(TIC_BUILD_WITH_MRUBY) + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + struct mrb_state* mrb; + struct mrbc_context* mrb_cxt; +} mrbVm; + +static tic_core* CurrentMachine = NULL; +static inline tic_core* getMRubyMachine(mrb_state* mrb) +{ + return CurrentMachine; +} + +static mrb_value mrb_peek(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_int bits = BITS_IN_BYTE; + mrb_get_args(mrb, "i|i", &address, &bits); + + return mrb_fixnum_value(tic_api_peek(tic, address, bits)); +} + +static mrb_value mrb_poke(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_int bits = BITS_IN_BYTE; + mrb_get_args(mrb, "ii|i", &address, &value, &bits); + + tic_api_poke(tic, address, value, bits); + + return mrb_nil_value(); +} + +static mrb_value mrb_peek1(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_get_args(mrb, "i", &address); + + return mrb_fixnum_value(tic_api_peek1(tic, address)); +} + +static mrb_value mrb_poke1(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_get_args(mrb, "ii", &address, &value); + + tic_api_poke1(tic, address, value); + + return mrb_nil_value(); +} + +static mrb_value mrb_peek2(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_get_args(mrb, "i", &address); + + return mrb_fixnum_value(tic_api_peek2(tic, address)); +} + +static mrb_value mrb_poke2(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_get_args(mrb, "ii", &address, &value); + + tic_api_poke2(tic, address, value); + + return mrb_nil_value(); +} + +static mrb_value mrb_peek4(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address; + mrb_get_args(mrb, "i", &address); + + return mrb_fixnum_value(tic_api_peek4(tic, address)); +} + +static mrb_value mrb_poke4(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = (tic_mem*)machine; + + mrb_int address, value; + mrb_get_args(mrb, "ii", &address, &value); + + tic_api_poke4(tic, address, value); + + return mrb_nil_value(); +} + +static mrb_value mrb_cls(mrb_state* mrb, mrb_value self) +{ + mrb_int color = 0; + mrb_get_args(mrb, "|i", &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_cls(memory, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_pix(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, color; + mrb_int argc = mrb_get_args(mrb, "ii|i", &x, &y, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if(argc == 3) + { + tic_api_pix(memory, x, y, color, false); + return mrb_nil_value(); + } + else + { + return mrb_fixnum_value(tic_api_pix(memory, x, y, 0, true)); + } +} + +static mrb_value mrb_line(mrb_state* mrb, mrb_value self) +{ + mrb_int x0, y0, x1, y1, color; + mrb_get_args(mrb, "iiiii", &x0, &y0, &x1, &y1, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_line(memory, x0, y0, x1, y1, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_rect(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, w, h, color; + mrb_get_args(mrb, "iiiii", &x, &y, &w, &h, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_rect(memory, x, y, w, h, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_rectb(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, w, h, color; + mrb_get_args(mrb, "iiiii", &x, &y, &w, &h, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_rectb(memory, x, y, w, h, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_circ(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, radius, color; + mrb_get_args(mrb, "iiii", &x, &y, &radius, &color); + + if(radius >= 0) { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_circ(memory, x, y, radius, color); + } else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "radius must be greater than or equal 0"); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_circb(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, radius, color; + mrb_get_args(mrb, "iiii", &x, &y, &radius, &color); + + if(radius >= 0) { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_circb(memory, x, y, radius, color); + } else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "radius must be greater than or equal 0"); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_elli(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, a, b, color; + mrb_get_args(mrb, "iiiii", &x, &y, &a, &b, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_elli(memory, x, y, a, b, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_ellib(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, a, b, color; + mrb_get_args(mrb, "iiiii", &x, &y, &a, &b, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_ellib(memory, x, y, a, b, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_tri(mrb_state* mrb, mrb_value self) +{ + mrb_int x1, y1, x2, y2, x3, y3, color; + mrb_get_args(mrb, "iiiiiii", &x1, &y1, &x2, &y2, &x3, &y3, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_tri(memory, x1, y1, x2, y2, x3, y3, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_trib(mrb_state* mrb, mrb_value self) +{ + mrb_int x1, y1, x2, y2, x3, y3, color; + mrb_get_args(mrb, "iiiiiii", &x1, &y1, &x2, &y2, &x3, &y3, &color); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_trib(memory, x1, y1, x2, y2, x3, y3, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_textri(mrb_state* mrb, mrb_value self) +{ + mrb_value chroma = mrb_fixnum_value(0xff); + mrb_bool use_map = false; + mrb_int x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3; + mrb_int argc = mrb_get_args(mrb, "iiiiiiiiiiii|bo", + &x1, &y1, &x2, &y2, &x3, &y3, + &u1, &v1, &u2, &v2, &u3, &v3, + &use_map, &chroma); + + mrb_int count; + u8 *chromas; + if (mrb_array_p(chroma)) + { + count = ARY_LEN(RARRAY(chroma)); + chromas = malloc(count * sizeof(u8)); + + for (mrb_int i = 0; i < count; ++i) + { + chromas[i] = mrb_integer(mrb_ary_entry(chroma, i)); + } + } + else + { + count = 1; + chromas = malloc(sizeof(u8)); + chromas[0] = mrb_integer(chroma); + } + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_textri(memory, + x1, y1, x2, y2, x3, y3, + u1, v1, u2, v2, u3, v3, + use_map, chromas, count); + + free(chromas); + + return mrb_nil_value(); +} + + +static mrb_value mrb_clip(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, w, h; + mrb_int argc = mrb_get_args(mrb, "|iiii", &x, &y, &w, &h); + + if(argc == 0) + { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); + } + else if(argc == 4) + { + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_clip((tic_mem*)getMRubyMachine(mrb), x, y, w, h); + } + else mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid parameters, use clip(x,y,w,h) or clip()"); + + return mrb_nil_value(); +} + +static mrb_value mrb_btnp(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* memory = (tic_mem*)machine; + + mrb_int index, hold, period; + mrb_int argc = mrb_get_args(mrb, "|iii", &index, &hold, &period); + + index &= 0x1f; + + if (argc == 0) + { + return mrb_fixnum_value(tic_api_btnp(memory, -1, -1, -1)); + } + else if(argc == 1) + { + return mrb_bool_value(tic_api_btnp(memory, index, -1, -1)); + } + else if (argc == 3) + { + return mrb_bool_value(tic_api_btnp(memory, index, hold, period)); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid params, btnp [ id [ hold period ] ]"); + return mrb_nil_value(); + } +} + +static mrb_value mrb_btn(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + + mrb_int index, hold, period; + mrb_int argc = mrb_get_args(mrb, "|i", &index, &hold, &period); + + index &= 0x1f; + + if (argc == 0) + { + return mrb_fixnum_value(machine->memory.ram.input.gamepads.data); + } + else if (argc == 1) + { + return mrb_bool_value(machine->memory.ram.input.gamepads.data & (1 << index)); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid params, btn [ id ]\n"); + return mrb_nil_value(); + } +} + +static mrb_value mrb_spr(mrb_state* mrb, mrb_value self) +{ + mrb_int index, x, y; + mrb_int w = 1, h = 1, scale = 1; + mrb_int flip = tic_no_flip, rotate = tic_no_rotate; + mrb_value colors_obj; + static u8 colors[TIC_PALETTE_SIZE]; + mrb_int count = 0; + + mrb_int argc = mrb_get_args(mrb, "iii|oiiiii", &index, &x, &y, &colors_obj, &scale, &flip, &rotate, &w, &h); + + if(mrb_array_p(colors_obj)) + { + for(; count < TIC_PALETTE_SIZE && count < ARY_LEN(RARRAY(colors_obj)); count++) // HACK + colors[count] = (u8) mrb_int(mrb, mrb_ary_entry(colors_obj, count)); + count++; + } + else if(mrb_fixnum_p(colors_obj)) + { + colors[0] = mrb_int(mrb, colors_obj); + count = 1; + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "color must be either an array or a palette index"); + return mrb_nil_value(); + } + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_spr(memory, index, x, y, w, h, colors, count, scale, flip, rotate); + + return mrb_nil_value(); +} + +static mrb_value mrb_mget(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y; + mrb_get_args(mrb, "ii", &x, &y); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + u8 value = tic_api_mget(memory, x, y); + return mrb_fixnum_value(value); +} + +static mrb_value mrb_mset(mrb_state* mrb, mrb_value self) +{ + mrb_int x, y, val; + mrb_get_args(mrb, "iii", &x, &y, &val); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_mset(memory, x, y, val); + + return mrb_nil_value(); +} + +static mrb_value mrb_tstamp(mrb_state* mrb, mrb_value self) +{ + tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); + + return mrb_fixnum_value(tic_api_tstamp(tic)); +} + +static mrb_value mrb_vbank(mrb_state* mrb, mrb_value self) +{ + tic_core *core = getMRubyMachine(mrb); + tic_mem *tic = (tic_mem*)core; + + s32 prev = core->state.vbank.id; + + mrb_int vbank; + mrb_int argc = mrb_get_args(mrb, "|i", &vbank); + + if (argc >= 1) + { + tic_api_vbank(tic, vbank); + } + + return mrb_fixnum_value(prev); +} + +static mrb_value mrb_fget(mrb_state* mrb, mrb_value self) +{ + mrb_int index, flag; + mrb_get_args(mrb, "ii", &index, &flag); + + tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); + + return mrb_bool_value(tic_api_fget(tic, index, flag)); +} + +static mrb_value mrb_fset(mrb_state* mrb, mrb_value self) +{ + mrb_int index, flag; + mrb_bool value; + mrb_get_args(mrb, "iib", &index, &flag, &value); + + tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); + + tic_api_fset(tic, index, flag, value); + + return mrb_nil_value(); +} + +typedef struct +{ + mrb_state* mrb; + mrb_value block; +} RemapData; + +static void remapCallback(void* data, s32 x, s32 y, RemapResult* result) +{ + RemapData* remap = (RemapData*)data; + mrb_state* mrb = remap->mrb; + + mrb_value vals[] = { + mrb_fixnum_value(result->index), + mrb_fixnum_value(x), + mrb_fixnum_value(y) + }; + mrb_value out = mrb_yield_argv(mrb, remap->block, 3, vals); + + if (mrb_array_p(out)) + { + mrb_int len = ARY_LEN(RARRAY(out)); + if (len > 3) len = 3; + switch (len) + { + case 3: + result->rotate = mrb_int(mrb, mrb_ary_entry(out, 2)); + case 2: + result->flip = mrb_int(mrb, mrb_ary_entry(out, 1)); + case 1: + result->index = mrb_int(mrb, mrb_ary_entry(out, 0)); + } + } + else + { + result->index = mrb_int(mrb, out); + } +} + +static mrb_value mrb_map(mrb_state* mrb, mrb_value self) +{ + mrb_int x = 0; + mrb_int y = 0; + mrb_int w = TIC_MAP_SCREEN_WIDTH; + mrb_int h = TIC_MAP_SCREEN_HEIGHT; + mrb_int sx = 0; + mrb_int sy = 0; + mrb_value chroma; + mrb_int scale = 1; + mrb_value block; + + mrb_int argc = mrb_get_args(mrb, "|iiiiiioi&", &x, &y, &w, &h, &sx, &sy, &chroma, &scale, &block); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + mrb_int count; + u8 *chromas; + + if (mrb_array_p(chroma)) + { + count = ARY_LEN(RARRAY(chroma)); + chromas = malloc(count * sizeof(u8)); + + for (mrb_int i = 0; i < count; ++i) + { + chromas[i] = mrb_integer(mrb_ary_entry(chroma, i)); + } + } + else + { + count = 1; + chromas = malloc(sizeof(u8)); + chromas[0] = mrb_integer(chroma); + } + + if (mrb_proc_p(block)) + { + RemapData data = { mrb, block }; + tic_api_map(memory, x, y, w, h, sx, sy, chromas, count, scale, remapCallback, &data); + } + else + { + tic_api_map(memory, x, y, w, h, sx, sy, chromas, count, scale, NULL, NULL); + } + + free(chromas); + + return mrb_nil_value(); +} + +static mrb_value mrb_music(mrb_state* mrb, mrb_value self) +{ + mrb_int track = 0; + mrb_int frame = -1; + mrb_int row = -1; + bool loop = true; + bool sustain = false; + mrb_int tempo = -1; + mrb_int speed = -1; + + mrb_int argc = mrb_get_args(mrb, "|iiibbii", &track, &frame, &row, &loop, &sustain, &tempo, &speed); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + tic_api_music(memory, -1, 0, 0, false, false, -1, -1); + + if(track >= 0) + { + tic_api_music(memory, track, frame, row, loop, sustain, tempo, speed); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_sfx(mrb_state* mrb, mrb_value self) +{ + mrb_int index; + + mrb_value note_obj; + s32 note = -1; + mrb_int octave = -1; + mrb_int duration = -1; + mrb_int channel = 0; + mrb_value volume = mrb_int_value(mrb, MAX_VOLUME); + mrb_int volumes[TIC_STEREO_CHANNELS]; + mrb_int speed = SFX_DEF_SPEED; + + mrb_int argc = mrb_get_args(mrb, "i|oiio!i", &index, ¬e_obj, &duration, &channel, &volume, &speed); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if (mrb_array_p(volume)) + { + for (mrb_int i = 0; i < TIC_STEREO_CHANNELS; ++i) + { + volumes[i] = mrb_integer(mrb_ary_entry(volume, i)); + } + } + else if (mrb_fixnum_p(volume)) + { + for (size_t ch = 0; ch < TIC_STEREO_CHANNELS; ++ch) + { + volumes[ch] = mrb_integer(volume); + } + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "volume must be an integer or a array of integers per channel"); + return mrb_nil_value(); + } + + if(index < SFX_COUNT) + { + if (index >= 0) + { + tic_sample* effect = memory->ram.sfx.samples.data + index; + + note = effect->note; + octave = effect->octave; + speed = effect->speed; + } + + if (argc >= 2) + { + if (mrb_fixnum_p(note_obj)) + { + mrb_int id = mrb_integer(note_obj); + note = id % NOTES; + octave = id / NOTES; + } + else if (mrb_string_p(note_obj)) + { + const char* noteStr = mrb_str_to_cstr(mrb, mrb_funcall(mrb, note_obj, "to_s", 0)); + + s32 octave32; + if (!tic_tool_parse_note(noteStr, ¬e, &octave32)) + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid note, should be like C#4"); + return mrb_nil_value(); + } + octave = octave32; + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "note must be either an integer number or a string like \"C#4\""); + return mrb_nil_value(); + } + } + + if (channel >= 0 && channel < TIC_SOUND_CHANNELS) + { + tic_api_sfx(memory, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); + } + else mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown channel"); + } + else mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown sfx index"); + + return mrb_nil_value(); +} + +static mrb_value mrb_sync(mrb_state* mrb, mrb_value self) +{ + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + mrb_int mask = 0; + mrb_int bank = 0; + mrb_bool toCart = false; + + mrb_int argc = mrb_get_args(mrb, "|iib", &mask, &bank, &toCart); + + if(bank >= 0 && bank < TIC_BANKS) + tic_api_sync(memory, mask, bank, toCart); + else + mrb_raise(mrb, E_ARGUMENT_ERROR, "sync() error, invalid bank"); + + return mrb_nil_value(); +} + +static mrb_value mrb_reset(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + + machine->state.initialized = false; + + return mrb_nil_value(); +} + +static mrb_value mrb_key(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* tic = &machine->memory; + + mrb_int key; + mrb_int argc = mrb_get_args(mrb, "|i", &key); + + if (argc == 0) + return mrb_bool_value(tic_api_key(tic, tic_key_unknown)); + else + { + if(key < tic_key_escape) + return mrb_bool_value(tic_api_key(tic, key)); + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown keyboard code"); + return mrb_nil_value(); + } + } +} + +static mrb_value mrb_keyp(mrb_state* mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + tic_mem* memory = (tic_mem*)machine; + + mrb_int key, hold, period; + mrb_int argc = mrb_get_args(mrb, "|iii", &key, &hold, &period); + + if (argc == 0) + { + return mrb_fixnum_value(tic_api_keyp(memory, -1, -1, -1)); + } + else if (key >= tic_key_escape) + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown keyboard code"); + } + else if(argc == 1) + { + return mrb_bool_value(tic_api_keyp(memory, key, -1, -1)); + } + else if (argc == 3) + { + return mrb_bool_value(tic_api_keyp(memory, key, hold, period)); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid params, btnp [ id [ hold period ] ]"); + return mrb_nil_value(); + } +} + +static mrb_value mrb_memcpy(mrb_state* mrb, mrb_value self) +{ + mrb_int dest, src, size; + mrb_int argc = mrb_get_args(mrb, "iii", &dest, &src, &size); + + s32 bound = sizeof(tic_ram) - size; + + if(size >= 0 && size <= sizeof(tic_ram) && dest >= 0 && src >= 0 && dest <= bound && src <= bound) + { + u8* base = (u8*)&getMRubyMachine(mrb)->memory; + memcpy(base + dest, base + src, size); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "memory address not in range!"); + } + + return mrb_nil_value(); +} + +static mrb_value mrb_memset(mrb_state* mrb, mrb_value self) +{ + mrb_int dest, value, size; + mrb_int argc = mrb_get_args(mrb, "iii", &dest, &value, &size); + + s32 bound = sizeof(tic_ram) - size; + + if(size >= 0 && size <= sizeof(tic_ram) && dest >= 0 && dest <= bound) + { + u8* base = (u8*)&getMRubyMachine(mrb)->memory; + memset(base + dest, value, size); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "memory address not in range!"); + } + + return mrb_nil_value(); +} + +static char* mrb_value_to_cstr(mrb_state* mrb, mrb_value value) +{ + mrb_value str = mrb_funcall(mrb, value, "to_s", 0); + return mrb_str_to_cstr(mrb, str); +} + +static mrb_value mrb_font(mrb_state* mrb, mrb_value self) +{ + mrb_value text_obj; + mrb_int x = 0; + mrb_int y = 0; + mrb_int width = TIC_SPRITESIZE; + mrb_int height = TIC_SPRITESIZE; + mrb_int chromakey = 0; + mrb_bool fixed = false; + mrb_int scale = 1; + mrb_bool alt = false; + mrb_get_args(mrb, "S|iiiiibib", + &text_obj, &x, &y, &chromakey, + &width, &height, &fixed, &scale, &alt); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if(scale == 0) + return mrb_fixnum_value(0); + + const char* text = mrb_value_to_cstr(mrb, text_obj); + + s32 size = tic_api_font(memory, text, x, y, width, height, chromakey, scale, fixed, alt); + return mrb_fixnum_value(size); +} + +static mrb_value mrb_print(mrb_state* mrb, mrb_value self) +{ + mrb_value text_obj; + mrb_int x = 0; + mrb_int y = 0; + mrb_int color = TIC_PALETTE_SIZE-1; + mrb_bool fixed = false; + mrb_int scale = 1; + mrb_bool alt = false; + mrb_get_args(mrb, "S|iiibib", + &text_obj, &x, &y, &color, + &fixed, &scale, &alt); + + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + + if(scale == 0) + return mrb_fixnum_value(0); + + const char* text = mrb_str_to_cstr(mrb, text_obj); + + s32 size = tic_api_print(memory, text, x, y, color, fixed, scale, alt); + return mrb_fixnum_value(size); +} + +static mrb_value mrb_trace(mrb_state *mrb, mrb_value self) +{ + mrb_value text_obj; + mrb_int color = TIC_DEFAULT_COLOR; + mrb_get_args(mrb, "S|i", &text_obj, &color); + + tic_core* machine = getMRubyMachine(mrb); + + const char* text = mrb_value_to_cstr(mrb, text_obj); + machine->data->trace(machine->data->data, text, color); + + return mrb_nil_value(); +} + +static mrb_value mrb_pmem(mrb_state *mrb, mrb_value self) +{ + mrb_int index, value; + mrb_int argc = mrb_get_args(mrb, "i|i", &index, &value); + + tic_core* machine = getMRubyMachine(mrb); + tic_mem* memory = &machine->memory; + + if(index < TIC_PERSISTENT_SIZE) + { + u32 val = tic_api_pmem((tic_mem*)machine, index, 0, false); + + if(argc == 2) + { + u32 val = tic_api_pmem((tic_mem*)machine, index, value, true); + } + + return mrb_fixnum_value(val); + } + else + { + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid persistent memory index"); + + return mrb_nil_value(); + } +} + +static mrb_value mrb_time(mrb_state *mrb, mrb_value self) +{ + tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); + return mrb_float_value(mrb, tic_api_time(memory)); +} + +static mrb_value mrb_exit(mrb_state *mrb, mrb_value self) +{ + tic_core* machine = getMRubyMachine(mrb); + machine->data->exit(machine->data->data); + + return mrb_nil_value(); +} + +static mrb_value mrb_mouse(mrb_state *mrb, mrb_value self) +{ + mrb_value sym_x = mrb_symbol_value(mrb_intern_cstr(mrb, "x")); + mrb_value sym_y = mrb_symbol_value(mrb_intern_cstr(mrb, "y")); + mrb_value sym_left = mrb_symbol_value(mrb_intern_cstr(mrb, "left")); + mrb_value sym_middle = mrb_symbol_value(mrb_intern_cstr(mrb, "middle")); + mrb_value sym_right = mrb_symbol_value(mrb_intern_cstr(mrb, "right")); + + tic_core* machine = getMRubyMachine(mrb); + + const tic80_mouse* mouse = &machine->memory.ram.input.mouse; + + mrb_value hash = mrb_hash_new(mrb); + + mrb_hash_set(mrb, hash, sym_x, mrb_fixnum_value(mouse->x)); + mrb_hash_set(mrb, hash, sym_y, mrb_fixnum_value(mouse->y)); + mrb_hash_set(mrb, hash, sym_left, mrb_bool_value(mouse->left)); + mrb_hash_set(mrb, hash, sym_middle, mrb_bool_value(mouse->middle)); + mrb_hash_set(mrb, hash, sym_right, mrb_bool_value(mouse->right)); + + return hash; +} + +static void closeMRuby(tic_mem* tic) +{ + tic_core* machine = (tic_core*)tic; + + if(machine->currentVM) + { + mrbVm *currentVM = (mrbVm*)machine->currentVM; + mrbc_context_free(currentVM->mrb, currentVM->mrb_cxt); + mrb_close(currentVM->mrb); + currentVM->mrb_cxt = NULL; + currentVM->mrb = NULL; + + free(currentVM); + CurrentMachine = machine->currentVM = NULL; + } +} + +static mrb_bool catcherr(tic_core* machine) +{ + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; + if (mrb->exc) + { + mrb_value ex = mrb_obj_value(mrb->exc); + mrb_value bt = mrb_exc_backtrace(mrb, ex); + if (!mrb_array_p(bt)) + bt = mrb_get_backtrace(mrb); + mrb_value insp = mrb_inspect(mrb, ex); + mrb_ary_unshift(mrb, bt, insp); + mrb_value msg = mrb_ary_join(mrb, bt, mrb_str_new_cstr(mrb, "\n")); + char* cmsg = mrb_str_to_cstr(mrb, msg); + machine->data->error(machine->data->data, cmsg); + mrb->exc = NULL; + + return false; + } + + return true; +} + +static bool initMRuby(tic_mem* tic, const char* code) +{ + tic_core* machine = (tic_core*)tic; + + closeMRuby(tic); + + CurrentMachine = machine; + + machine->currentVM = malloc(sizeof(mrbVm)); + mrbVm *currentVM = (mrbVm*)machine->currentVM; + + mrb_state* mrb = currentVM->mrb = mrb_open(); + mrbc_context* mrb_cxt = currentVM->mrb_cxt = mrbc_context_new(mrb); + mrb_cxt->capture_errors = 1; + mrbc_filename(mrb, mrb_cxt, "user code"); + +#define API_FUNC_DEF(name, _, __, nparam, nrequired, callback, ...) {mrb_ ## name, nrequired, (nparam - nrequired), callback, #name}, + static const struct{mrb_func_t func; s32 nrequired; s32 noptional; bool block; const char* name;} ApiItems[] = {TIC_API_LIST(API_FUNC_DEF)}; +#undef API_FUNC_DEF + + for (s32 i = 0; i < COUNT_OF(ApiItems); ++i) + { + mrb_aspec args = MRB_ARGS_NONE(); + if (ApiItems[i].nrequired > 0) + args |= MRB_ARGS_REQ(ApiItems[i].nrequired); + if (ApiItems[i].noptional > 0) + args |= MRB_ARGS_OPT(ApiItems[i].noptional); + if (ApiItems[i].block) + args |= MRB_ARGS_BLOCK(); + + mrb_define_method(mrb, mrb->kernel_module, ApiItems[i].name, ApiItems[i].func, args); + } + + mrb_load_string_cxt(mrb, code, mrb_cxt); + return catcherr(machine); +} + +static void evalMRuby(tic_mem* tic, const char* code) { + tic_core* machine = (tic_core*)tic; + + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb = mrb_open(); + + if (!mrb) + return; + + if (((mrbVm*)machine->currentVM)->mrb_cxt) + { + mrbc_context_free(mrb, ((mrbVm*)machine->currentVM)->mrb_cxt); + } + + mrbc_context* mrb_cxt = ((mrbVm*)machine->currentVM)->mrb_cxt = mrbc_context_new(mrb); + mrb_load_string_cxt(mrb, code, mrb_cxt); + catcherr(machine); +} + +static void callMRubyTick(tic_mem* tic) +{ + tic_core* machine = (tic_core*)tic; + const char* TicFunc = TIC_FN; + const char* OvrFunc = OVR_FN; + + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; + + if(mrb) + { + if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, TicFunc))) + { + mrb_funcall(mrb, mrb_top_self(mrb), TicFunc, 0); + catcherr(machine); + + if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, OvrFunc))) + { + OVR(machine) + { + mrb_funcall(mrb, mrb_top_self(mrb), OvrFunc, 0); + catcherr(machine); + } + } + } + else + { + machine->data->error(machine->data->data, "'def TIC...' isn't found :("); + } + } +} + +static void callMRubyScanlineName(tic_mem* memory, s32 row, void* data, const char* name) +{ + tic_core* machine = (tic_core*)memory; + mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; + + if (mrb && mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, name))) + { + mrb_funcall(mrb, mrb_top_self(mrb), name, 1, mrb_fixnum_value(row)); + catcherr(machine); + } +} + +static void callMRubyScanline(tic_mem* memory, s32 row, void* data) +{ + callMRubyScanlineName(memory, row, data, SCN_FN); + + callMRubyScanlineName(memory, row, data, "scanline"); +} + +static void callMRubyBorder(tic_mem* memory, s32 row, void* data) +{ + callMRubyScanlineName(memory, row, data, BDR_FN); +} + +/** + * External Resources + * ================== + * + * [Outdated official documentation regarding syntax](https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#resword) + * [Ruby for dummies reserved word listing](https://www.dummies.com/programming/ruby/rubys-reserved-words/) + */ +static const char* const MRubyKeywords [] = +{ + "BEGIN", "class", "ensure", "nil", "self", "when", + "END", "def", "false", "not", "super", "while", + "alias", "defined", "for", "or", "then", "yield", + "and", "do", "if", "redo", "true", + "begin", "else", "in", "rescue", "undef", + "break", "elsif", "module", "retry", "unless", + "case", "end", "next", "return", "until", + "__FILE__", "__LINE__" +}; + +static inline bool isalnum_(char c) {return isalnum(c) || c == '_' || c == '?' || c == '=' || c == '!';} + +static const tic_outline_item* getMRubyOutline(const char* code, s32* size) +{ + enum{Size = sizeof(tic_outline_item)}; + + *size = 0; + + static tic_outline_item* items = NULL; + + if(items) + { + free(items); + items = NULL; + } + + const char* ptr = code; + + while(true) + { + static const char FuncString[] = "def "; + + ptr = strstr(ptr, FuncString); + + if(ptr) + { + ptr += sizeof FuncString - 1; + + const char* start = ptr; + const char* end = start; + + while(*ptr) + { + char c = *ptr; + + if(isalnum_(c)); + else if(c == '(' || c == ' ' || c == '\n') + { + end = ptr; + break; + } + else break; + + ptr++; + } + + if(end > start) + { + items = realloc(items, (*size + 1) * Size); + + items[*size].pos = start; + items[*size].size = (s32)(end - start); + + (*size)++; + } + } + else break; + } + + return items; +} + +const tic_script_config MRubySyntaxConfig = +{ + .name = "ruby", + .fileExtension = ".rb", + .projectComment = "#", + .init = initMRuby, + .close = closeMRuby, + .tick = callMRubyTick, + + .callback = + { + .scanline = callMRubyScanline, + .border = callMRubyBorder, + }, + + .getOutline = getMRubyOutline, + .eval = evalMRuby, + + .blockCommentStart = "=begin", + .blockCommentEnd = "=end", + .blockCommentStart2 = NULL, + .blockCommentEnd2 = NULL, + .singleComment = "#", + .blockStringStart = NULL, + .blockStringEnd = NULL, + + .keywords = MRubyKeywords, + .keywordsCount = COUNT_OF(MRubyKeywords), +}; + +#endif /* defined(TIC_BUILD_WITH_MRUBY) */ diff --git a/src/core/languages.c b/src/core/languages.c index be30a486e..06dcd96e8 100644 --- a/src/core/languages.c +++ b/src/core/languages.c @@ -1,6 +1,10 @@ #include #include "api.h" +#if defined(TIC_BUILD_WITH_MRUBY) +extern tic_script_config MRubySyntaxConfig; +#endif + #if defined(TIC_BUILD_WITH_JS) extern tic_script_config JsSyntaxConfig; #endif @@ -31,6 +35,10 @@ tic_script_config* Languages[] = { &LuaSyntaxConfig, #endif + #if defined(TIC_BUILD_WITH_MRUBY) + &MRubySyntaxConfig, + #endif + #if defined(TIC_BUILD_WITH_JS) &JsSyntaxConfig, #endif diff --git a/src/studio/demos.c b/src/studio/demos.c index 44cb1b915..6c87b86b1 100644 --- a/src/studio/demos.c +++ b/src/studio/demos.c @@ -88,6 +88,29 @@ tic_script_config_extra JsSyntaxConfigExtra = #endif +#if defined(TIC_BUILD_WITH_MRUBY) + +static const u8 RubyDemoRom[] = +{ + #include "../build/assets/rubydemo.tic.dat" +}; + +static const u8 rubymark[] = +{ + #include "../build/assets/rubymark.tic.dat" +}; + +tic_script_config_extra MRubySyntaxConfigExtra = +{ + .name = "ruby", + .demoRom = RubyDemoRom, + .demoRomSize = sizeof RubyDemoRom, + .markRom = rubymark, + .markRomSize = sizeof rubymark, +}; + +#endif + #if defined(TIC_BUILD_WITH_WREN) static const u8 WrenDemoRom[] = @@ -163,6 +186,9 @@ tic_script_config_extra* LanguagesExtra[] = { #endif #if defined(TIC_BUILD_WITH_JS) &JsSyntaxConfigExtra, +#endif +#if defined(TIC_BUILD_WITH_MRUBY) + &MRubySyntaxConfigExtra, #endif NULL }; diff --git a/src/studio/project.c b/src/studio/project.c index d8bfc4a82..8351da601 100644 --- a/src/studio/project.c +++ b/src/studio/project.c @@ -208,13 +208,13 @@ static bool loadBinarySection(const char* project, const char* comment, const ch while(ptr < end) { static char lineStr[] = "999"; - memcpy(lineStr, ptr + sizeof("-- ") - 1, sizeof lineStr - 1); + memcpy(lineStr, ptr + strlen(comment) + 1, sizeof lineStr - 1); s32 index = atoi(lineStr); if(index < count) { - ptr += sizeof("-- 999:") - 1; + ptr += strlen(comment) + sizeof(" 999:") - 1; tic_tool_str2buf(ptr, size*2, (u8*)dst + size*index, flip); ptr += size*2 + 1; @@ -225,7 +225,7 @@ static bool loadBinarySection(const char* project, const char* comment, const ch } else { - ptr += sizeof("-- 999:") - 1; + ptr += strlen(comment) + sizeof(" 999:") - 1; tic_tool_str2buf(ptr, (s32)(end - ptr), (u8*)dst, flip); } diff --git a/vendor/mruby b/vendor/mruby new file mode 160000 index 000000000..0f45836b5 --- /dev/null +++ b/vendor/mruby @@ -0,0 +1 @@ +Subproject commit 0f45836b5954accf508f333f932741b925214471 From 8a8b39e6ca336efda6b049ebf1d98600dea2d2f3 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 11 Dec 2021 18:41:44 +0100 Subject: [PATCH 183/379] export: mruby -> ruby --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 86f48f5cc..a417c2c93 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -678,7 +678,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - script: [lua, moon, fennel, mruby, js, wren, squirrel] + script: [lua, moon, fennel, ruby, js, wren, squirrel] steps: - name: Download Windows XP artifact From 665ac8e90f8fa6ec21cc01baf12e0ece83ecb413 Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 11 Dec 2021 18:42:06 +0100 Subject: [PATCH 184/379] Remove deprecated OVR --- src/api/mruby.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/api/mruby.c b/src/api/mruby.c index 840489cd3..e2a9e0a2d 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -1068,7 +1068,6 @@ static void callMRubyTick(tic_mem* tic) { tic_core* machine = (tic_core*)tic; const char* TicFunc = TIC_FN; - const char* OvrFunc = OVR_FN; mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; @@ -1078,15 +1077,6 @@ static void callMRubyTick(tic_mem* tic) { mrb_funcall(mrb, mrb_top_self(mrb), TicFunc, 0); catcherr(machine); - - if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, OvrFunc))) - { - OVR(machine) - { - mrb_funcall(mrb, mrb_top_self(mrb), OvrFunc, 0); - catcherr(machine); - } - } } else { From f56def3b5d0c66a08a788f96a999655938067df8 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 12 Dec 2021 10:51:27 +0300 Subject: [PATCH 185/379] some Ruby build fixes #1726 --- .gitignore | 1 + CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4f1071a51..63d35244e 100644 --- a/.gitignore +++ b/.gitignore @@ -172,3 +172,4 @@ build/compile_commands.json CMakeSettings.json tic_mruby_build_config.rb.lock tic_mruby_wasm_build_config.rb.lock +build/mruby_vendor-prefix/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 3730da132..fcb4bb4e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -440,7 +440,7 @@ if(BUILD_STUB) MACRO_CORE(js TIC_BUILD_WITH_JS FALSE) MACRO_CORE(wren TIC_BUILD_WITH_WREN FALSE) MACRO_CORE(squirrel TIC_BUILD_WITH_SQUIRREL FALSE) - MACRO_CORE(mruby TIC_BUILD_WITH_MRUBY FALSE) + MACRO_CORE(ruby TIC_BUILD_WITH_MRUBY FALSE) endif() @@ -1166,7 +1166,7 @@ if(BUILD_STUB) MACRO_STUB(js) MACRO_STUB(wren) MACRO_STUB(squirrel) - MACRO_STUB(mruby) + MACRO_STUB(ruby) endif() From c538d54d594c3290727402718ce1612843586e48 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 10:17:01 +0300 Subject: [PATCH 186/379] fixed discord link #1735 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aadf50fe3..972a39a9a 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ For users who can't spend the money, we made it easy to build the pro version fr # Community You can play and share games, tools and music at [https://tic80.com/play](https://tic80.com/play). -The community also hangs out and discusses on [Telegram](https://t.me/tic80) or [Discord](https://discord.gg/DkD73dP). +The community also hangs out and discusses on [Telegram](https://t.me/tic80) or [Discord](https://discord.gg/HwZDw7n4dN). # Contributing You can contribute by reporting a bug or requesting a new feature on our [issues page](https://github.com/nesbox/TIC-80/issues). From f029595cc104282ce4c9e0e32e0f31a59fa39819 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 12:45:20 +0300 Subject: [PATCH 187/379] Fix buffer overflow in onHelp_api #1734 --- src/api.h | 16 +- src/studio/editors/code.c | 2 +- src/studio/screens/console.c | 392 ++++++++++++++++++----------------- 3 files changed, 207 insertions(+), 203 deletions(-) diff --git a/src/api.h b/src/api.h index 450186e45..7a2f6afdc 100644 --- a/src/api.h +++ b/src/api.h @@ -132,15 +132,15 @@ enum #define TIC_FN "TIC" #define SCN_FN "SCN" -#define OVR_FN "OVR" +#define OVR_FN "OVR" // deprecated since v1.0 #define BDR_FN "BDR" -#define TIC_CALLBACK_LIST(macro) \ - macro(TIC_FN, TIC_FN "()", "Main function. It's called at " DEF2STR(TIC80_FRAMERATE) \ - "fps (" DEF2STR(TIC80_FRAMERATE) " times every second).") \ - macro(SCN_FN, SCN_FN "(row)", "Allows you to execute code between the drawing of each scanline, " \ - "for example, to manipulate the palette.") \ - macro(BDR_FN, BDR_FN "(row)", "Allows you to execute code between the drawing of each fullscreen scanline, " \ +#define TIC_CALLBACK_LIST(macro) \ + macro(TIC, TIC_FN "()", "Main function. It's called at " DEF2STR(TIC80_FRAMERATE) \ + "fps (" DEF2STR(TIC80_FRAMERATE) " times every second).") \ + macro(SCN, SCN_FN "(row)", "Allows you to execute code between the drawing of each scanline, " \ + "for example, to manipulate the palette.") \ + macro(BDR, BDR_FN "(row)", "Allows you to execute code between the drawing of each fullscreen scanline, " \ "for example, to manipulate the palette.") // API DEFINITION TABLE @@ -683,7 +683,7 @@ enum "with U and V addressing its pixels directly, rather than by sprite ID.\n" \ "So for example the top left corner of sprite #2 would be located at u=16, v=0.", \ 14, \ - 12, \ + 12, \ 0, \ void, \ tic_mem*, float x1, float y1, float x2, float y2, float x3, float y3, \ diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index 70196ca2a..6df5f01d8 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -501,7 +501,7 @@ static void parseCode(const tic_script_config* config, const char* start, CodeSt { static const char* const ApiKeywords[] = { -#define TIC_CALLBACK_DEF(name, ...) name, +#define TIC_CALLBACK_DEF(name, ...) #name, TIC_CALLBACK_LIST(TIC_CALLBACK_DEF) #undef TIC_CALLBACK_DEF diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index ac9eb95c0..a3016eaf8 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2499,6 +2499,164 @@ static const char HelpUsage[] = "help [" #undef HELP_CMD_DEF "]"; +#define SECTION_DEF(NAME, ...) "|" #NAME +#define EXPORT_CMD_DEF(name) #name "|" +#define EXPORT_KEYS_DEF(name) #name "=0 " +#define IMPORT_CMD_DEF(name) #name "|" +#define IMPORT_KEYS_DEF(key) #key"=0 " + +#if defined(CAN_ADDGET_FILE) +#define ADDGET_FILE(macro) \ + macro("add", \ + NULL, \ + "upload file to the browser local storage.", \ + NULL, \ + onAddCommand) \ + \ + macro("get", \ + NULL, \ + "download file from the browser local storage.", \ + "get ", \ + onGetCommand) \ + +#else +#define ADDGET_FILE(macro) +#endif + +// macro(name, alt, help, usage, handler) +#define COMMANDS_LIST(macro) \ + macro("help", \ + NULL, \ + "show help info about commands/api/...", \ + HelpUsage, \ + onHelpCommand) \ + \ + macro("exit", \ + "quit", \ + "exit the application.", \ + NULL, \ + onExitCommand) \ + \ + macro("new", \ + NULL, \ + "creates a new `Hello World` cartridge.", \ + "new [$LANG_NAMES_PIPE$...]", \ + onNewCommand) \ + \ + macro("load", \ + NULL, \ + "load cartridge from the local filesystem" \ + "(there's no need to type the .tic extension).\n" \ + "you can also load just the section (sprites, map etc) from another cart.", \ + "load [code" TIC_SYNC_LIST(SECTION_DEF) "]", \ + onLoadCommand) \ + \ + macro("save", \ + NULL, \ + "save cartridge to the local filesystem, use $LANG_EXTENSIONS$" \ + "cart extension to save it in text format (PRO feature).", \ + "save ", \ + onSaveCommand) \ + \ + macro("run", \ + NULL, \ + "run current cart / project.", \ + NULL, \ + onRunCommand) \ + \ + macro("resume", \ + NULL, \ + "resume last run cart / project.", \ + NULL, \ + onResumeCommand) \ + \ + macro("eval", \ + "=", \ + "run code provided code.", \ + NULL, \ + onEvalCommand) \ + \ + macro("dir", \ + "ls", \ + "show list of local files.", \ + NULL, \ + onDirCommand) \ + \ + macro("cd", \ + NULL, \ + "change directory.", \ + "\ncd \ncd /\ncd ..", \ + onChangeDirectory) \ + \ + macro("mkdir", \ + NULL, \ + "make a directory.", \ + "mkdir ", \ + onMakeDirectory) \ + \ + macro("folder", \ + NULL, \ + "open working directory in OS.", \ + NULL, \ + onFolderCommand) \ + \ + macro("export", \ + NULL, \ + "export cart to HTML,\n" \ + "native build (win linux rpi mac),\n" \ + "export sprites/map/... as a .png image " \ + "or export sfx and music to .wav files.", \ + "\nexport [" EXPORT_CMD_LIST(EXPORT_CMD_DEF) "...]" \ + " [" EXPORT_KEYS_LIST(EXPORT_KEYS_DEF) "...]" , \ + onExportCommand) \ + \ + macro("import", \ + NULL, \ + "import code/sprites/map/... from an external file.", \ + "\nimport [" IMPORT_CMD_LIST(IMPORT_CMD_DEF) "...]" \ + " [" IMPORT_KEYS_LIST(IMPORT_KEYS_DEF) "...]", \ + onImportCommand) \ + \ + macro("del", \ + NULL, \ + "delete from the filesystem.", \ + "del ", \ + onDelCommand) \ + \ + macro("cls", \ + "clear", \ + "clear console screen.", \ + NULL, \ + onClsCommand) \ + \ + macro("demo", \ + NULL, \ + "install demo carts to the current directory.", \ + NULL, \ + onInstallDemosCommand) \ + \ + macro("config", \ + NULL, \ + "edit system configuration cartridge,\n" \ + "use `reset` param to reset current configuration,\n" \ + "use `default` to edit default cart template.", \ + "config [reset|default]", \ + onConfigCommand) \ + \ + macro("surf", \ + NULL, \ + "open carts browser.", \ + NULL, \ + onSurfCommand) \ + \ + macro("menu", \ + NULL, \ + "show game menu where you can setup keyboard/gamepad buttons mapping.", \ + NULL, \ + onGameMenuCommand) \ + \ + ADDGET_FILE(macro) + static struct Command { const char* name; @@ -2509,203 +2667,27 @@ static struct Command } Commands[] = { - { - "help", - NULL, - "show help info about commands/api/...", - HelpUsage, - onHelpCommand - }, - { - "exit", - "quit", - "exit the application.", - NULL, - onExitCommand - }, - { - "new", - NULL, - "creates a new `Hello World` cartridge.", - "new [$LANG_NAMES_PIPE$...]", - onNewCommand - }, - { - "load", - NULL, - "load cartridge from the local filesystem (there's no need to type the .tic extension).\n" - "you can also load just the section (sprites, map etc) from another cart.", - "load [code" -#define SECTION_DEF(NAME, ...) "|" #NAME - TIC_SYNC_LIST(SECTION_DEF) -#undef SECTION_DEF - "]", - onLoadCommand}, - { - "save", - NULL, - "save cartridge to the local filesystem, use $LANG_EXTENSIONS$" - "cart extension to save it in text format (PRO feature).", - "save ", - onSaveCommand - }, - - { - "run", - NULL, - "run current cart / project.", - NULL, - onRunCommand - }, - { - "resume", - NULL, - "resume last run cart / project.", - NULL, - onResumeCommand - }, - { - "eval", - "=", - "run code provided code.", - NULL, - onEvalCommand - }, - { - "dir", - "ls", - "show list of local files.", - NULL, - onDirCommand - }, - { - "cd", - NULL, - "change directory.", - "\ncd \ncd /\ncd ..", - onChangeDirectory - }, - { - "mkdir", - NULL, - "make a directory.", - "mkdir ", - onMakeDirectory - }, - { - "folder", - NULL, - "open working directory in OS.", - NULL, - onFolderCommand - }, - -#if defined(CAN_ADDGET_FILE) - { - "add", - NULL, - "upload file to the browser local storage.", - NULL, - onAddCommand - }, - { - "get", - NULL, - "download file from the browser local storage.", - "get ", - onGetCommand - }, -#endif - - { - "export", - NULL, - "export cart to HTML,\n" - "native build (win linux rpi mac),\n" - "export sprites/map/... as a .png image " - "or export sfx and music to .wav files.", - "\nexport [" -#define EXPORT_CMD_DEF(name) #name "|" - EXPORT_CMD_LIST(EXPORT_CMD_DEF) -#undef EXPORT_CMD_DEF - "...] [" -#define EXPORT_KEYS_DEF(name) #name "=0 " - EXPORT_KEYS_LIST(EXPORT_KEYS_DEF) -#undef EXPORT_KEYS_DEF - "...]", - onExportCommand - }, - { - "import", - NULL, - "import code/sprites/map/... from an external file.", - "import [" -#define IMPORT_CMD_DEF(name) #name "|" - IMPORT_CMD_LIST(IMPORT_CMD_DEF) -#undef IMPORT_CMD_DEF - "...] [" -#define IMPORT_KEYS_DEF(key) #key"=0 " - IMPORT_KEYS_LIST(IMPORT_KEYS_DEF) -#undef IMPORT_KEYS_DEF - "...]", - onImportCommand - }, - { - "del", - NULL, - "delete from the filesystem.", - "del ", - onDelCommand - }, - { - "cls", - "clear", - "clear console screen.", - NULL, - onClsCommand - }, - { - "demo", - NULL, - "install demo carts to the current directory.", - NULL, - onInstallDemosCommand - }, - { - "config", - NULL, - "edit system configuration cartridge,\n" - "use `reset` param to reset current configuration,\n" - "use `default` to edit default cart template.", - "config [reset|default]", - onConfigCommand - }, - { - "surf", - NULL, - "open carts browser.", - NULL, - onSurfCommand - }, - { - "menu", - NULL, - "show game menu where you can setup keyboard/gamepad buttons mapping.", - NULL, - onGameMenuCommand - }, +#define COMMANDS_DEF(name, alt, help, usage, handler) {name, alt, help, usage, handler}, + COMMANDS_LIST(COMMANDS_DEF) +#undef COMMANDS_DEF }; +#undef SECTION_DEF +#undef EXPORT_CMD_DEF +#undef EXPORT_KEYS_DEF +#undef IMPORT_CMD_DEF +#undef IMPORT_KEYS_DEF + typedef struct Command Command; +#define API_LIST(macro) \ + TIC_CALLBACK_LIST(macro) \ + TIC_API_LIST(macro) + static struct ApiItem {const char* name; const char* def; const char* help;} Api[] = { -#define TIC_CALLBACK_DEF(name, def, help) {name, def, help}, - TIC_CALLBACK_LIST(TIC_CALLBACK_DEF) -#undef TIC_CALLBACK_DEF - #define TIC_API_DEF(name, def, help, ...) {#name, def, help}, - TIC_API_LIST(TIC_API_DEF) + API_LIST(TIC_API_DEF) #undef TIC_API_DEF }; @@ -2964,10 +2946,21 @@ static void onHelp_api(Console* console) { consolePrint(console, "\nAPI functions:\n", tic_color_blue); { - char buf[TICNAME_MAX] = {[0] = 0}; + const char Sep[] = " "; + + // calc buf size on compile time + enum + { + Size = 1 +#define API_DEF(name, ...) + STRLEN(#name) + STRLEN(Sep) + API_LIST(API_DEF) +#undef API_DEF + }; + + char buf[Size] = {[0] = 0}; FOR(const ApiItem*, api, Api) - strcat(buf, api->name), strcat(buf, " "); + strcat(buf, api->name), strcat(buf, Sep); printBack(console, buf); } @@ -2977,10 +2970,21 @@ static void onHelp_commands(Console* console) { consolePrint(console, "\nConsole commands:\n", tic_color_green); { - char buf[TICNAME_MAX] = {[0] = 0}; + const char Sep[] = " "; + + // calc buf size on compile time + enum + { + Size = 1 +#define COMMANDS_DEF(name, ...) + STRLEN(#name) + STRLEN(Sep) + COMMANDS_LIST(COMMANDS_DEF) +#undef COMMANDS_DEF + }; + + char buf[Size] = {[0] = 0}; FOR(const Command*, cmd, Commands) - strcat(buf, cmd->name), strcat(buf, " "); + strcat(buf, cmd->name), strcat(buf, Sep); printBack(console, buf); } From 353510c59a3d719ed84dc24177a4ce0a9fc543cb Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 14:22:37 +0300 Subject: [PATCH 188/379] optimizing ruby support + added RPi PRO build #1733 --- .github/workflows/build.yml | 77 ++++++++++++++++++------------------- CMakeLists.txt | 5 ++- build/android/Dockerfile | 3 ++ 3 files changed, 44 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a417c2c93..eb6891f56 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -248,10 +248,6 @@ jobs: submodules: recursive fetch-depth: 0 - # - uses: ruby/setup-ruby@v1 - # with: - # ruby-version: 2.6 - - name: Install Host toolchain run: | apt-get update @@ -282,6 +278,41 @@ jobs: name: 'tic80-rpi-stub' path: build/bin/tic80* +# === Raspberry PI PRO === + rpi-pro: + runs-on: ubuntu-latest + container: nesbox/rpi-tic80:latest + + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_PRO=On -DCMAKE_TOOLCHAIN_FILE=rpi/toolchain.cmake .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + + - name: Deploy DEB + uses: actions/upload-artifact@v2 + with: + name: 'tic80-rpi-dep-pro' + path: build/tic80.deb + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: 'tic80-rpi-pro' + path: build/bin/tic80 + # === Raspberry PI 1-3 Bare Metal === rpi-baremetal: runs-on: ubuntu-latest @@ -293,10 +324,6 @@ jobs: submodules: recursive fetch-depth: 0 - # - uses: ruby/setup-ruby@v1 - # with: - # ruby-version: 2.6 - - name: Install Host toolchain run: | apt-get update @@ -352,10 +379,6 @@ jobs: submodules: recursive fetch-depth: 0 - # - uses: ruby/setup-ruby@v1 - # with: - # ruby-version: 2.6 - - name: Install Host toolchain run: | apt-get update @@ -414,10 +437,6 @@ jobs: submodules: recursive fetch-depth: 0 - # - uses: ruby/setup-ruby@v1 - # with: - # ruby-version: 2.6 - - name: Install Host toolchain run: | apt-get update @@ -518,28 +537,6 @@ jobs: submodules: recursive fetch-depth: 0 - # - uses: ruby/setup-ruby@v1 - # with: - # ruby-version: 2.6 - - - name: Install Host toolchain - run: | - apt-get update - apt-get install --assume-yes build-essential ruby-full python3 - - - name: Recreate standalone NDK toolchains - run: | - for ARCH in arm arm64 x86 x86_64; do \ - API=24; \ - SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; \ - python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" \ - --api "$API" --arch "$ARCH" \ - --install-dir "$SYSROOT" --force ; \ - ln -Ffs "$SYSROOT/sysroot/usr" "$SYSROOT/usr" ; \ - done - mkdir -p /usr/local/opt - ln -Ffs "$ANDROID_NDK_HOME" /usr/local/opt/android-ndk - - name: Build run: | cd build/android @@ -741,7 +738,7 @@ jobs: # === Delete stub === delete-stub: - needs: [export-stub] + needs: [export-stub winxp-pro windows-pro linux-pro macos-pro rpi-pro] runs-on: ubuntu-latest steps: @@ -761,3 +758,5 @@ jobs: tic80-windows-pro tic80-linux-deb-pro tic80-linux-pro + tic80-rpi-deb-pro + tic80-rpi-pro diff --git a/CMakeLists.txt b/CMakeLists.txt index fcb4bb4e7..69f2d8617 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.15) set(VERSION_MAJOR 1) set(VERSION_MINOR 0) @@ -122,6 +122,7 @@ if(MSVC) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin ) # use static runtime + # !TODO: use set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") instead if(CMAKE_C_FLAGS_${OUTPUTCONFIG} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS_${OUTPUTCONFIG} "${CMAKE_C_FLAGS_${OUTPUTCONFIG}}") endif() @@ -137,7 +138,7 @@ else() endif() if(RPI) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11") endif() if(ANDROID) diff --git a/build/android/Dockerfile b/build/android/Dockerfile index 0f4354143..799e48d66 100644 --- a/build/android/Dockerfile +++ b/build/android/Dockerfile @@ -4,5 +4,8 @@ RUN apt-get remove git -y RUN apt-get install software-properties-common -y RUN add-apt-repository ppa:git-core/ppa -y RUN apt-get install git -y +RUN for ARCH in arm arm64 x86 x86_64; do API=24; SYSROOT=$ANDROID_NDK_HOME/platforms/android-$API/arch-$ARCH; python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" --api "$API" --arch "$ARCH" --install-dir "$SYSROOT" --force ; ln -Ffs "$SYSROOT/sysroot/usr" "$SYSROOT/usr" ; done +RUN mkdir -p /usr/local/opt +RUN ln -Ffs "$ANDROID_NDK_HOME" /usr/local/opt/android-ndk RUN mkdir /src WORKDIR /src From 34b59e0dd9575d9f40bbd193d074a3ce6df67204 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 18:13:51 +0300 Subject: [PATCH 189/379] CI build fix --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb6891f56..1af0d72e8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -738,7 +738,7 @@ jobs: # === Delete stub === delete-stub: - needs: [export-stub winxp-pro windows-pro linux-pro macos-pro rpi-pro] + needs: [export-stub, winxp-pro, windows-pro, linux-pro, macos-pro, rpi-pro] runs-on: ubuntu-latest steps: From 1d27590e4e49fc91328031bce7fc34d3f6835dbb Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 18:15:37 +0300 Subject: [PATCH 190/379] CI build optimization --- .github/workflows/build.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1af0d72e8..dcf4f3f01 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -736,9 +736,9 @@ jobs: mac${{ matrix.script }} html${{ matrix.script }} -# === Delete stub === +# === Delete stub artifacts === delete-stub: - needs: [export-stub, winxp-pro, windows-pro, linux-pro, macos-pro, rpi-pro] + needs: [export-stub] runs-on: ubuntu-latest steps: @@ -752,6 +752,17 @@ jobs: tic80-rpi-stub tic80-macos-stub tic80-wasm-stub + +# === Delete PRO artifacts === + delete-stub: + needs: [winxp-pro, windows-pro, linux-pro, macos-pro, rpi-pro] + runs-on: ubuntu-latest + + steps: + - name: Delete artifacts + uses: geekyeggo/delete-artifact@v1 + with: + name: | tic80-macos-pro tic80-macos-dmg-pro tic80-winxp-pro From 20e2e21befb12eb04d3c12ed683b4585ee52005f Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 18:16:08 +0300 Subject: [PATCH 191/379] CI build fix --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dcf4f3f01..e20957149 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -754,7 +754,7 @@ jobs: tic80-wasm-stub # === Delete PRO artifacts === - delete-stub: + delete-pro: needs: [winxp-pro, windows-pro, linux-pro, macos-pro, rpi-pro] runs-on: ubuntu-latest From b857fb33efb6ecf246af3cb52b99a5171a9c91bb Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 18:20:56 +0300 Subject: [PATCH 192/379] build fix --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69f2d8617..2f78d2bec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.13) set(VERSION_MAJOR 1) set(VERSION_MINOR 0) @@ -122,7 +122,7 @@ if(MSVC) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin ) # use static runtime - # !TODO: use set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") instead + # !TODO: use set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") from cmake 3.15 instead if(CMAKE_C_FLAGS_${OUTPUTCONFIG} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS_${OUTPUTCONFIG} "${CMAKE_C_FLAGS_${OUTPUTCONFIG}}") endif() From 58152ff2087e0ff100da036dc9be63e19d08a149 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 18:34:10 +0300 Subject: [PATCH 193/379] build fix --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f78d2bec..35a60dc3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.3) set(VERSION_MAJOR 1) set(VERSION_MINOR 0) From 708c89fcc2ca2eea8c8e13c2a74bb1246b2286f4 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 18:45:21 +0300 Subject: [PATCH 194/379] typo fix --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e20957149..c053f5a70 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -304,7 +304,7 @@ jobs: - name: Deploy DEB uses: actions/upload-artifact@v2 with: - name: 'tic80-rpi-dep-pro' + name: 'tic80-rpi-deb-pro' path: build/tic80.deb - name: Deploy From de67219adbf240b4d9c98d22991f1395255b7457 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 13 Dec 2021 19:03:37 +0300 Subject: [PATCH 195/379] some optimizations for #1734 (buffer overflow in onHelp_api) --- src/studio/screens/console.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index a3016eaf8..63f9c2007 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2942,6 +2942,8 @@ static void printApi(Console* console, const char* param) } } +#define STRBUF_SIZE(name, ...) + STRLEN(#name) + STRLEN(Sep) + static void onHelp_api(Console* console) { consolePrint(console, "\nAPI functions:\n", tic_color_blue); @@ -2949,15 +2951,7 @@ static void onHelp_api(Console* console) const char Sep[] = " "; // calc buf size on compile time - enum - { - Size = 1 -#define API_DEF(name, ...) + STRLEN(#name) + STRLEN(Sep) - API_LIST(API_DEF) -#undef API_DEF - }; - - char buf[Size] = {[0] = 0}; + char buf[API_LIST(STRBUF_SIZE) + 1] = {[0] = 0}; FOR(const ApiItem*, api, Api) strcat(buf, api->name), strcat(buf, Sep); @@ -2973,15 +2967,7 @@ static void onHelp_commands(Console* console) const char Sep[] = " "; // calc buf size on compile time - enum - { - Size = 1 -#define COMMANDS_DEF(name, ...) + STRLEN(#name) + STRLEN(Sep) - COMMANDS_LIST(COMMANDS_DEF) -#undef COMMANDS_DEF - }; - - char buf[Size] = {[0] = 0}; + char buf[COMMANDS_LIST(STRBUF_SIZE) + 1] = {[0] = 0}; FOR(const Command*, cmd, Commands) strcat(buf, cmd->name), strcat(buf, Sep); @@ -2990,6 +2976,8 @@ static void onHelp_commands(Console* console) } } +#undef STRBUF_SIZE + static void printTable(Console* console, const char* text) { #ifndef BAREMETALPI From 093c755a676a2fc57d5454fe2f25952c6d9b9232 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 14 Dec 2021 16:09:46 +0300 Subject: [PATCH 196/379] added missed license headers --- src/api/fennel.c | 22 ++++++++++++++++++++++ src/api/lua_api.h | 27 +++++++++++++++++++++++---- src/api/moonscript.c | 22 ++++++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/api/fennel.c b/src/api/fennel.c index d34ca836d..2460d6f84 100644 --- a/src/api/fennel.c +++ b/src/api/fennel.c @@ -1,3 +1,25 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + #include "core/core.h" // Fennel requires Lua diff --git a/src/api/lua_api.h b/src/api/lua_api.h index 9f34c07ce..93881d2d3 100644 --- a/src/api/lua_api.h +++ b/src/api/lua_api.h @@ -1,4 +1,26 @@ -#ifndef lua_api_h +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#pragma once #include #include @@ -18,6 +40,3 @@ extern void callLuaOverline(tic_mem* tic, void* data); extern void closeLua(tic_mem* tic); extern void callLuaTick(tic_mem* tic); extern void lua_open_builtins(lua_State *lua); - -#define lua_api_h -#endif \ No newline at end of file diff --git a/src/api/moonscript.c b/src/api/moonscript.c index 6a116bcc2..a0367fb08 100644 --- a/src/api/moonscript.c +++ b/src/api/moonscript.c @@ -1,3 +1,25 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + #include "core/core.h" // Moonscript requires Lua From a8118739d923df7ca1868e21a73355a1f09f9951 Mon Sep 17 00:00:00 2001 From: blinry Date: Mon, 6 Dec 2021 17:29:24 +0100 Subject: [PATCH 197/379] Add Shift+Return shortcut to the code editor that auto-closes a block For example, in Ruby and Lua, it would insert an "end" keyword, and place the cursor in an indented line between. --- src/api.h | 1 + src/api/fennel.c | 3 ++- src/api/js.c | 1 + src/api/lua.c | 1 + src/api/moonscript.c | 3 ++- src/api/mruby.c | 1 + src/api/squirrel.c | 1 + src/api/wren.c | 1 + src/studio/editors/code.c | 23 +++++++++++++++++++++++ 9 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/api.h b/src/api.h index 7a2f6afdc..9e41c0604 100644 --- a/src/api.h +++ b/src/api.h @@ -91,6 +91,7 @@ typedef struct const char* blockStringStart; const char* blockStringEnd; const char* singleComment; + const char* blockEnd; const char* const * keywords; s32 keywordsCount; diff --git a/src/api/fennel.c b/src/api/fennel.c index 2460d6f84..e6e0c640d 100644 --- a/src/api/fennel.c +++ b/src/api/fennel.c @@ -200,6 +200,7 @@ tic_script_config FennelSyntaxConfig = .blockStringStart = NULL, .blockStringEnd = NULL, .singleComment = ";", + .blockEnd = NULL, .keywords = FennelKeywords, .keywordsCount = COUNT_OF(FennelKeywords), @@ -207,4 +208,4 @@ tic_script_config FennelSyntaxConfig = #endif /* defined(TIC_BUILD_WITH_FENNEL) */ -#endif \ No newline at end of file +#endif diff --git a/src/api/js.c b/src/api/js.c index 5e47dcaab..9c1def6a3 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -1168,6 +1168,7 @@ const tic_script_config JsSyntaxConfig = .blockStringStart = NULL, .blockStringEnd = NULL, .singleComment = "//", + .blockEnd = "}", .keywords = JsKeywords, .keywordsCount = COUNT_OF(JsKeywords), diff --git a/src/api/lua.c b/src/api/lua.c index da71f4d8d..5d1856174 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1693,6 +1693,7 @@ tic_script_config LuaSyntaxConfig = .singleComment = "--", .blockStringStart = "[[", .blockStringEnd = "]]", + .blockEnd = "end", .keywords = LuaKeywords, .keywordsCount = COUNT_OF(LuaKeywords), diff --git a/src/api/moonscript.c b/src/api/moonscript.c index a0367fb08..997bd4e84 100644 --- a/src/api/moonscript.c +++ b/src/api/moonscript.c @@ -192,6 +192,7 @@ tic_script_config MoonSyntaxConfig = .blockStringStart = NULL, .blockStringEnd = NULL, .singleComment = "--", + .blockEnd = NULL, .keywords = MoonKeywords, .keywordsCount = COUNT_OF(MoonKeywords), @@ -199,4 +200,4 @@ tic_script_config MoonSyntaxConfig = #endif /* defined(TIC_BUILD_WITH_MOON) */ -#endif /* defined(TIC_BUILD_WITH_LUA) */ \ No newline at end of file +#endif /* defined(TIC_BUILD_WITH_LUA) */ diff --git a/src/api/mruby.c b/src/api/mruby.c index e2a9e0a2d..1486bdb71 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -1215,6 +1215,7 @@ const tic_script_config MRubySyntaxConfig = .singleComment = "#", .blockStringStart = NULL, .blockStringEnd = NULL, + .blockEnd = "end", .keywords = MRubyKeywords, .keywordsCount = COUNT_OF(MRubyKeywords), diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 3cbc2b36a..078964c2c 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1831,6 +1831,7 @@ tic_script_config SquirrelSyntaxConfig = .singleComment = "//", .blockStringStart = "@\"", .blockStringEnd = "\"", + .blockEnd = "}", .keywords = SquirrelKeywords, .keywordsCount = COUNT_OF(SquirrelKeywords), diff --git a/src/api/wren.c b/src/api/wren.c index b1f4138c3..92b21099d 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -1699,6 +1699,7 @@ tic_script_config WrenSyntaxConfig = .blockStringStart = NULL, .blockStringEnd = NULL, .singleComment = "//", + .blockEnd = "}", .keywords = WrenKeywords, .keywordsCount = COUNT_OF(WrenKeywords), diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index 6df5f01d8..e2b6056b4 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -1157,6 +1157,24 @@ static void doTab(Code* code, bool shift, bool crtl) else inputSymbolBase(code, '\t'); } +// Add a block-ending keyword or symbol, and put the cursor in the line between. +static void newLineAutoClose(Code* code) +{ + newLine(code); + + const char* blockEnd = tic_core_script_config(code->tic)->blockEnd; + if (blockEnd != NULL) + { + newLine(code); + for(size_t i = 0; i < strlen(blockEnd); i++) + inputSymbol(code, blockEnd[i]); + upLine(code); + goEnd(code); + } + + doTab(code, false, true); +} + static void setFindMode(Code* code) { if(code->cursor.selection) @@ -1571,6 +1589,11 @@ static void processKeyboard(Code* code) else if(keyWasPressed(tic_key_backspace)) backspaceWord(code); else usedKeybinding = false; } + else if(shift) + { + if(keyWasPressed(tic_key_return)) newLineAutoClose(code); + else usedKeybinding = false; + } else if(alt) { if(keyWasPressed(tic_key_left)) leftWord(code); From fa1730bd5130da4aecae91e6b993394c15307779 Mon Sep 17 00:00:00 2001 From: blinry Date: Fri, 17 Dec 2021 00:18:10 +0100 Subject: [PATCH 198/379] When listing language options in the spec, use "x, y, or z" format --- src/studio/screens/console.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 63f9c2007..7c0bee4cb 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -261,15 +261,23 @@ static char* replaceHelpTokens(const char* text) char langnames[10240] = {0}; char langextensions[10240] = {0}; char langnamespipe[10240] = {0}; + FOR_EACH_LANG(ln) + bool isLast = *(conf+1) == NULL; + bool isSecondToLast = *(conf+2) == NULL; + strcat(langnames, ln->name); - strcat(langnames, " "); + if (!isLast) + strcat(langnames, ", "); + if (isSecondToLast) + strcat(langnames, "or "); strcat(langextensions, ln->fileExtension); strcat(langextensions, " "); strcat(langnamespipe, ln->name); - strcat(langnamespipe, "|"); + if (!isLast) + strcat(langnamespipe, "|"); FOR_EACH_LANG_END @@ -2540,7 +2548,7 @@ static const char HelpUsage[] = "help [" macro("new", \ NULL, \ "creates a new `Hello World` cartridge.", \ - "new [$LANG_NAMES_PIPE$...]", \ + "new [$LANG_NAMES_PIPE$]", \ onNewCommand) \ \ macro("load", \ From e1726cf101040c7f52e720ea3cfc2d82d5a76a15 Mon Sep 17 00:00:00 2001 From: blinry Date: Sat, 18 Dec 2021 11:07:26 +0100 Subject: [PATCH 199/379] On Linux, use Ctrl+L to clear the console, per default of other shells Closes #1741. --- src/studio/screens/console.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 63f9c2007..b814c5fe2 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -3540,8 +3540,14 @@ static void processKeyboard(Console* console) else if(keyWasPressed(tic_key_pageup)) processConsolePgUp(console); else if(keyWasPressed(tic_key_pagedown)) processConsolePgDown(console); - if(tic_api_key(tic, tic_key_ctrl) - && keyWasPressed(tic_key_k)) +# if defined(__TIC_LINUX__) + tic_keycode clearKey = tic_key_l; +# else + tic_keycode clearKey = tic_key_k; +# endif + + if(tic_api_key(tic, tic_key_ctrl) + && keyWasPressed(clearKey)) { onClsCommand(console); return; From 6e80263922801d75e45742fca75cbdc8f8d0287f Mon Sep 17 00:00:00 2001 From: blinry Date: Fri, 17 Dec 2021 11:24:10 +0100 Subject: [PATCH 200/379] Add help topics for keys and buttons --- src/studio/screens/console.c | 139 +++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 63f9c2007..43c7ab65e 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -79,6 +79,8 @@ macro(vram) \ macro(commands) \ macro(api) \ + macro(keys) \ + macro(buttons) \ macro(startup) \ macro(terms) \ macro(license) @@ -2767,6 +2769,129 @@ static s32 createVRamTable(char* buf) return strlen(buf); } +static s32 createKeysTable(char* buf) +{ + char* ptr = buf; + ptr += sprintf(ptr, "\n+------+-----+ +------+--------------+" + "\n| CODE | KEY | | CODE | KEY |" + "\n+------+-----+ +------+--------------+"); + + static const struct Row {s32 code; const char* key;} Rows[] = + { + {1, "A"}, + {2, "B"}, + {3, "C"}, + {4, "D"}, + {5, "E"}, + {6, "F"}, + {7, "G"}, + {8, "H"}, + {9, "I"}, + {10, "J"}, + {11, "K"}, + {12, "L"}, + {13, "M"}, + {14, "N"}, + {15, "O"}, + {16, "P"}, + {17, "Q"}, + {18, "R"}, + {19, "S"}, + {20, "T"}, + {21, "U"}, + {22, "V"}, + {23, "W"}, + {24, "X"}, + {25, "Y"}, + {26, "Z"}, + {27, "0"}, + {28, "1"}, + {29, "2"}, + {30, "3"}, + {31, "4"}, + {32, "5"}, + {33, "6"}, + {34, "7"}, + {35, "8"}, + {36, "9"}, + {37, "MINUS"}, + {38, "EQUALS"}, + {39, "LEFTBRACKET"}, + {40, "RIGHTBRACKET"}, + {41, "BACKSLASH"}, + {42, "SEMICOLON"}, + {43, "APOSTROPHE"}, + {44, "GRAVE"}, + {45, "COMMA"}, + {46, "PERIOD"}, + {47, "SLASH"}, + {48, "SPACE"}, + {49, "TAB"}, + {50, "RETURN"}, + {51, "BACKSPACE"}, + {52, "DELETE"}, + {53, "INSERT"}, + {54, "PAGEUP"}, + {55, "PAGEDOWN"}, + {56, "HOME"}, + {57, "END"}, + {58, "UP"}, + {59, "DOWN"}, + {60, "LEFT"}, + {61, "RIGHT"}, + {62, "CAPSLOCK"}, + {63, "CTRL"}, + {64, "SHIFT"}, + {65, "ALT"}, + }; + + int lastAlphaNumeric = 36; + for(const struct Row* row = Rows, *end = row + lastAlphaNumeric; row < end; row++) + { + const struct Row* otherRow = row + lastAlphaNumeric; + ptr += sprintf(ptr, "\n| "); + ptr += sprintf(ptr, "%4d | %-3s |", row->code, row->key); + if (otherRow < Rows + COUNT_OF(Rows)) + ptr += sprintf(ptr, " | %4d | %-12s |", otherRow->code, otherRow->key); + else + ptr += sprintf(ptr, " | %4s | %12s |", "", ""); + } + + ptr += sprintf(ptr, "\n+------+-----+ +------+--------------+\n"); + + return strlen(buf); +} + +static s32 createButtonsTable(char* buf) +{ + char* ptr = buf; + ptr += sprintf(ptr, "\n+--------+----+----+----+----+" + "\n| ACTION | P1 | P2 | P3 | P4 |" + "\n+--------+----+----+----+----+"); + + static const struct Row {const char* action;} Rows[] = + { + {"UP"}, + {"DOWN"}, + {"LEFT"}, + {"RIGHT"}, + {"A"}, + {"B"}, + {"X"}, + {"Y"}, + }; + + int id = 0; + for(const struct Row* row = Rows, *end = row + COUNT_OF(Rows); row < end; row++) { + ptr += sprintf(ptr, "\n| %6s | %2d | %2d | %2d | %2d |", row->action, id, id + 8, id + 16, id + 24); + id++; + } + + ptr += sprintf(ptr, "\n+--------+----+----+----+----+"); + + return strlen(buf); +} + static void onExport_help(Console* console, const char* param, const char* name, ExportParams params) { const char* filename = getFilename(name, ".md"); @@ -3031,6 +3156,20 @@ static void onHelp_vram(Console* console) printTable(console, buf); } +static void onHelp_keys(Console* console) +{ + char buf[4096]; + createKeysTable(buf); + printTable(console, buf); +} + +static void onHelp_buttons(Console* console) +{ + char buf[1024]; + createButtonsTable(buf); + printTable(console, buf); +} + static void onHelp_version(Console* console) { consolePrint(console, "\n"TIC_VERSION, CONSOLE_BACK_TEXT_COLOR); From ad872ad1a2c07506819af319cf41ed627d0f0c17 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sat, 25 Dec 2021 00:13:04 +0300 Subject: [PATCH 201/379] Added new Game Menu WIP based on the Surf animations #1748 --- CMakeLists.txt | 1 - build/assets/config.tic.dat | 2 +- config.lua | 2 +- src/studio/screens/console.c | 18 +- src/studio/screens/dialog.c | 242 ------------ src/studio/screens/dialog.h | 56 --- src/studio/screens/menu.c | 638 ++++++++++++------------------ src/studio/screens/menu.h | 59 ++- src/studio/screens/surf.c | 57 +-- src/studio/screens/surf.h | 2 +- src/studio/studio.c | 377 +++++++++++++----- src/studio/studio.h | 19 +- src/studio/system.h | 4 +- src/system/baremetalpi/kernel.cpp | 11 +- src/system/n3ds/main.c | 11 +- src/system/sdl/main.c | 42 +- src/system/sokol/sokol.c | 11 +- 17 files changed, 628 insertions(+), 924 deletions(-) delete mode 100644 src/studio/screens/dialog.c delete mode 100644 src/studio/screens/dialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 35a60dc3d..15373c438 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -811,7 +811,6 @@ set(TIC80LIB_DIR ${CMAKE_SOURCE_DIR}/src) set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/studio/screens/console.c ${TIC80LIB_DIR}/studio/screens/run.c - ${TIC80LIB_DIR}/studio/screens/dialog.c ${TIC80LIB_DIR}/studio/screens/menu.c ${TIC80LIB_DIR}/studio/screens/surf.c ${TIC80LIB_DIR}/studio/screens/start.c diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 73ecdb3fc..6ae99776c 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x64, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x92, 0x58, 0x16, 0x49, 0x15, 0x49, 0xad, 0xec, 0x72, 0xb9, 0x18, 0x10, 0x1c, 0x90, 0x88, 0x41, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x13, 0x3b, 0x1d, 0xac, 0x37, 0xb6, 0xf3, 0x34, 0x45, 0x3b, 0xef, 0x07, 0x84, 0x68, 0xe3, 0xbc, 0x9c, 0x6c, 0x95, 0xf2, 0x7d, 0xfd, 0x98, 0xe9, 0x99, 0xe9, 0x19, 0x4a, 0x6b, 0xd9, 0xde, 0x30, 0xec, 0x61, 0xab, 0xa7, 0xfb, 0xeb, 0xef, 0xeb, 0xef, 0x3d, 0x3d, 0x3d, 0x28, 0x0d, 0x5b, 0x96, 0xf5, 0xdc, 0xbb, 0x9f, 0xb2, 0x7a, 0x0c, 0xca, 0xed, 0xdb, 0xb7, 0xef, 0x1c, 0x1d, 0x1d, 0xdd, 0xc1, 0x16, 0xba, 0x77, 0x18, 0xf5, 0x2a, 0x63, 0xfd, 0xc1, 0xed, 0xdb, 0x6c, 0x70, 0x74, 0x44, 0x07, 0xb7, 0x7f, 0x83, 0x0e, 0xd8, 0x1d, 0xca, 0xe8, 0x1d, 0x4a, 0x55, 0xe5, 0xf8, 0xc3, 0xc3, 0xc3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x53, 0x15, 0xf1, 0x87, 0x87, 0xd9, 0x20, 0x9d, 0xa6, 0x83, 0xe1, 0x57, 0x01, 0x3f, 0x47, 0x07, 0x54, 0xd4, 0x3e, 0xcd, 0x59, 0x8c, 0xe3, 0x03, 0xee, 0x6c, 0xb1, 0x58, 0x9c, 0xc5, 0x16, 0xba, 0xb3, 0x04, 0x2a, 0xe0, 0xce, 0x4a, 0xfc, 0x74, 0x9a, 0x0d, 0x8a, 0x45, 0x3a, 0x48, 0x17, 0x00, 0x7f, 0x96, 0x0e, 0x08, 0x54, 0x3a, 0x0b, 0xf8, 0xb3, 0x12, 0xbf, 0xdb, 0xed, 0x36, 0x6a, 0xb5, 0x5a, 0x03, 0x5b, 0xe8, 0xf2, 0x4a, 0x2c, 0x82, 0x2d, 0xe2, 0x77, 0xbb, 0x6c, 0x50, 0xab, 0xd1, 0x41, 0x77, 0x1b, 0xf0, 0x1b, 0x40, 0xb3, 0x41, 0xa9, 0x05, 0x15, 0xdb, 0xaf, 0x1f, 0x1f, 0xbf, 0x78, 0x8c, 0xe5, 0xe1, 0x83, 0xe3, 0xe3, 0xc1, 0xe0, 0xf8, 0xe1, 0x60, 0xf0, 0x00, 0xbb, 0xf0, 0xcf, 0xc3, 0xef, 0x0c, 0x06, 0x2f, 0x29, 0x38, 0x1f, 0x07, 0x38, 0x9f, 0x17, 0x81, 0x3f, 0x90, 0xf8, 0xb2, 0x85, 0x7e, 0x00, 0xfe, 0x50, 0xd2, 0x7f, 0x28, 0xf1, 0x1f, 0xfa, 0xf8, 0x3f, 0x5f, 0xab, 0xfd, 0x44, 0xed, 0xe6, 0x76, 0xad, 0xb6, 0x7d, 0x53, 0xd4, 0x6e, 0x97, 0xb7, 0x30, 0x72, 0x73, 0xaf, 0xdb, 0x7d, 0xc1, 0x4e, 0xa7, 0x3f, 0x91, 0x1e, 0x7e, 0x35, 0x9d, 0x7e, 0xf5, 0x95, 0xb4, 0xde, 0xc2, 0xdd, 0x2b, 0x3f, 0x35, 0x3c, 0xfc, 0xdc, 0xbb, 0x47, 0x47, 0xa9, 0xa3, 0x2f, 0xbf, 0x73, 0xc4, 0xeb, 0x3b, 0x5f, 0x3e, 0x52, 0xf7, 0x70, 0xf7, 0xce, 0xaf, 0x7c, 0xe9, 0x4b, 0x43, 0x13, 0xc5, 0xe2, 0x85, 0x62, 0xe1, 0xb5, 0x22, 0xaf, 0xaf, 0xa5, 0x41, 0xcb, 0xd8, 0x16, 0x8a, 0x05, 0xf8, 0x17, 0x69, 0x73, 0x7b, 0xa3, 0xed, 0xf9, 0xf5, 0x35, 0x7e, 0xff, 0xcb, 0xe0, 0x07, 0xcc, 0xa2, 0xa8, 0xdb, 0x1e, 0xbb, 0x63, 0x31, 0xb0, 0x7d, 0xff, 0x0e, 0xd8, 0xff, 0x48, 0x56, 0xf4, 0x07, 0x8b, 0xf6, 0x07, 0x8c, 0x0d, 0x06, 0xdc, 0xde, 0x68, 0xfb, 0xf4, 0x3d, 0x68, 0xf1, 0x4a, 0xa7, 0x7f, 0x1a, 0xfc, 0xc0, 0xc3, 0xcf, 0x51, 0x0a, 0xb6, 0xe7, 0x35, 0x97, 0xa6, 0x8c, 0xfb, 0xc1, 0xb0, 0x8f, 0xcf, 0xed, 0x8d, 0xb6, 0xbf, 0x7f, 0xff, 0xfe, 0x6c, 0x71, 0x76, 0x16, 0xef, 0x91, 0x86, 0x87, 0x3f, 0x4b, 0x29, 0xd8, 0x9e, 0xde, 0x87, 0x3a, 0x5b, 0xa4, 0x8c, 0xfb, 0x41, 0xda, 0xc7, 0xe7, 0xb6, 0x46, 0xdb, 0xd7, 0xb0, 0xfd, 0x0a, 0xbf, 0xff, 0x45, 0xf0, 0x03, 0x0f, 0xbf, 0x61, 0x31, 0xb0, 0x7d, 0xbf, 0x01, 0xf6, 0xaf, 0xc9, 0x8a, 0xfe, 0xa0, 0xf0, 0x21, 0x0c, 0xac, 0x38, 0x1f, 0xc0, 0x71, 0x1d, 0x1e, 0xf6, 0x81, 0x20, 0x3c, 0xea, 0x03, 0x01, 0xb8, 0xc1, 0x07, 0x14, 0x3c, 0xce, 0x07, 0x70, 0x1c, 0xe1, 0x71, 0x3e, 0x80, 0xe3, 0x08, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0xb8, 0x31, 0x7e, 0x79, 0x49, 0xe7, 0x72, 0xec, 0x9e, 0x29, 0x7e, 0x01, 0x0e, 0xf6, 0x84, 0x7a, 0x0f, 0xaa, 0xf5, 0x0c, 0xca, 0xf6, 0x75, 0xe7, 0x05, 0xeb, 0x87, 0x54, 0xd0, 0xb9, 0x22, 0x95, 0x11, 0x5e, 0x41, 0xfd, 0x45, 0x2c, 0x11, 0xf8, 0xb7, 0x5f, 0xf4, 0xe6, 0x14, 0x2f, 0x58, 0x16, 0xaf, 0xdf, 0x7b, 0xfc, 0x98, 0xb7, 0xdf, 0x78, 0xf1, 0xb8, 0xa8, 0x17, 0x05, 0xd7, 0xe7, 0x69, 0xc5, 0xfa, 0x98, 0x17, 0x3f, 0x7e, 0xb1, 0xbd, 0xc7, 0xa2, 0xf1, 0x6b, 0x61, 0xcc, 0xf6, 0x21, 0x76, 0xb9, 0x0f, 0x84, 0xe3, 0xf7, 0x59, 0xf0, 0xf0, 0xe8, 0xf1, 0x63, 0xeb, 0xbc, 0x9c, 0x97, 0xf3, 0xf2, 0x63, 0x2a, 0x84, 0x88, 0x0a, 0xd9, 0x9c, 0x12, 0xc6, 0xab, 0x5e, 0x28, 0x23, 0x00, 0x82, 0x4a, 0x31, 0x2b, 0xe0, 0x24, 0x16, 0x4a, 0xb2, 0x08, 0x87, 0x8b, 0x09, 0x5c, 0x6c, 0x83, 0x04, 0x80, 0x36, 0xb3, 0xc4, 0x38, 0x93, 0xfd, 0x00, 0xbe, 0x18, 0xe3, 0x70, 0x39, 0x37, 0xb8, 0x3e, 0x13, 0xf4, 0xd5, 0x1a, 0x8c, 0x44, 0xd6, 0x47, 0xfe, 0x05, 0xbe, 0x25, 0xaa, 0x02, 0x41, 0x12, 0x8f, 0xab, 0x3e, 0x7b, 0x1a, 0x7d, 0xbc, 0x88, 0x41, 0x3e, 0xaa, 0xd6, 0x66, 0xfc, 0x3e, 0x28, 0x9e, 0xaf, 0x33, 0x93, 0xfe, 0x84, 0x4c, 0x54, 0xe8, 0x8e, 0xeb, 0x2f, 0xcc, 0x3f, 0xcc, 0x27, 0x94, 0x57, 0x23, 0x3e, 0x23, 0xa0, 0x7a, 0xe6, 0x55, 0xec, 0x07, 0xcc, 0x47, 0x09, 0xb2, 0x44, 0xa0, 0x25, 0xd8, 0x52, 0x1a, 0x84, 0x7b, 0x7c, 0x2b, 0xfb, 0x58, 0xd4, 0x60, 0x5f, 0x26, 0x2a, 0xb7, 0x11, 0x33, 0x38, 0x09, 0xf5, 0x6b, 0xc4, 0xbe, 0x52, 0x46, 0x2a, 0xed, 0x17, 0xde, 0x15, 0x48, 0x18, 0xfa, 0x8f, 0xa5, 0x6c, 0x6c, 0xf2, 0x1f, 0x4e, 0xdb, 0x84, 0x1f, 0xf2, 0x0f, 0x1a, 0xf5, 0x0f, 0x53, 0xab, 0x4d, 0x00, 0x25, 0xa1, 0x76, 0xf1, 0x0f, 0x1d, 0x99, 0x45, 0xfd, 0x4b, 0xd9, 0x57, 0xb6, 0x11, 0xe9, 0xb9, 0x5e, 0x0c, 0xbc, 0xe9, 0x3c, 0x32, 0x62, 0xc4, 0xc5, 0xc5, 0xa5, 0xde, 0x08, 0x8f, 0x21, 0x2b, 0x28, 0xbf, 0xf2, 0x27, 0x65, 0x17, 0x1a, 0xd9, 0x56, 0xe1, 0xba, 0x54, 0xf8, 0xb8, 0xc1, 0x7d, 0x3c, 0x7c, 0x1a, 0x83, 0xaf, 0xfb, 0xaf, 0xd2, 0x71, 0x84, 0x3e, 0x91, 0xf2, 0x11, 0xc9, 0x6f, 0x88, 0x7d, 0x26, 0xe3, 0x8c, 0x45, 0xc1, 0x9e, 0xde, 0xa5, 0x8d, 0xa9, 0x41, 0xbf, 0x8a, 0x2f, 0x55, 0x23, 0xba, 0x93, 0xf9, 0x45, 0xf0, 0x62, 0x45, 0xfc, 0xd3, 0xf2, 0x3d, 0x24, 0xea, 0x7f, 0xc4, 0xa7, 0xc1, 0xdb, 0x88, 0x7e, 0xb0, 0xca, 0xfc, 0x45, 0x85, 0x0e, 0x63, 0xe3, 0x83, 0x05, 0xf3, 0x17, 0x15, 0x39, 0x44, 0x0d, 0x10, 0xef, 0x9e, 0x6a, 0xe3, 0x31, 0x6a, 0xd3, 0xdd, 0x4f, 0xd5, 0x38, 0xd7, 0xa1, 0x71, 0xae, 0xa5, 0xf9, 0x95, 0x9e, 0xb3, 0xf4, 0xfc, 0x96, 0xe8, 0x9b, 0xd4, 0x92, 0xb9, 0x57, 0x86, 0x1e, 0x53, 0xf9, 0xd6, 0x60, 0x5a, 0x16, 0x35, 0x31, 0x64, 0x4a, 0x02, 0x59, 0x87, 0x30, 0xfd, 0x92, 0x7d, 0x3d, 0xbf, 0x42, 0x17, 0xb3, 0x97, 0x85, 0x6d, 0x20, 0xbf, 0xca, 0xd8, 0xc6, 0x0c, 0x45, 0xa0, 0x43, 0x3c, 0x1b, 0x12, 0x4f, 0xf7, 0x5c, 0x06, 0xcd, 0x37, 0x82, 0x31, 0x48, 0x14, 0xf3, 0x5c, 0x4e, 0x5c, 0x96, 0xe8, 0x2e, 0xcc, 0x88, 0x1f, 0x77, 0xea, 0x39, 0x46, 0x7c, 0x5d, 0x10, 0x42, 0x88, 0xa4, 0x12, 0x6c, 0xe5, 0xb8, 0xee, 0x3c, 0x54, 0x30, 0x0e, 0x82, 0x30, 0x9e, 0x26, 0xce, 0xcb, 0x79, 0x39, 0xeb, 0x85, 0x1f, 0x91, 0x0d, 0x06, 0x83, 0x3e, 0xbe, 0xe9, 0x63, 0xe1, 0x6d, 0xaf, 0x27, 0xdb, 0x81, 0x04, 0xf7, 0x74, 0x70, 0xaf, 0x27, 0xa6, 0x0f, 0x44, 0xeb, 0x17, 0x03, 0x9d, 0x10, 0x38, 0x42, 0xe7, 0xdc, 0x02, 0x3f, 0xde, 0xd2, 0xef, 0xa1, 0x21, 0xc1, 0x6e, 0x50, 0xd1, 0x40, 0x2c, 0x5a, 0x06, 0x5a, 0xe9, 0x85, 0x81, 0xca, 0x4f, 0x90, 0x4e, 0x0c, 0xbe, 0xf2, 0x13, 0x23, 0xfe, 0xb9, 0x05, 0x3e, 0x46, 0xf1, 0x6f, 0xa8, 0xcc, 0x37, 0x6b, 0x2f, 0xa6, 0x9a, 0xf0, 0x31, 0xc0, 0x61, 0xac, 0x3f, 0x30, 0xe1, 0xe3, 0xb9, 0xd2, 0x00, 0x6b, 0x2f, 0x0e, 0xbf, 0x3f, 0x10, 0x95, 0x19, 0xf1, 0x11, 0x8f, 0xd7, 0x53, 0xd7, 0x8f, 0xe2, 0x0f, 0x42, 0xd5, 0x80, 0x3f, 0xd0, 0x6b, 0x22, 0xff, 0x66, 0x7c, 0x4f, 0xf6, 0xbe, 0x54, 0xa1, 0x8e, 0xaf, 0xcb, 0x8e, 0xf7, 0xa7, 0xc7, 0x1f, 0x04, 0x17, 0xc4, 0x8d, 0xac, 0x8c, 0xc5, 0x04, 0x28, 0x7b, 0xc2, 0xa2, 0x07, 0x33, 0x0b, 0xdb, 0xdb, 0xcc, 0x8b, 0x66, 0xeb, 0x28, 0x2f, 0x52, 0xce, 0x58, 0x7c, 0x69, 0xe3, 0x04, 0x7c, 0xd6, 0x4f, 0xc2, 0xef, 0xb1, 0x1f, 0x0c, 0x5f, 0xb3, 0x53, 0x1c, 0xbe, 0xb2, 0xf5, 0x0f, 0xb2, 0x7e, 0x3f, 0x09, 0xbf, 0x97, 0x80, 0x1f, 0x2e, 0x3d, 0xc1, 0x33, 0xaf, 0xfd, 0x27, 0xa8, 0x09, 0x71, 0xe9, 0xc7, 0xe7, 0x53, 0x38, 0x87, 0x29, 0xfe, 0x59, 0x72, 0x1e, 0x48, 0xc2, 0xef, 0x27, 0xe1, 0xf7, 0x4e, 0xc5, 0xef, 0x0f, 0x92, 0xf0, 0xbd, 0xfc, 0xf1, 0x11, 0xd6, 0x0f, 0xc4, 0xaf, 0x19, 0xdf, 0x8b, 0xff, 0x8f, 0xc8, 0x7f, 0x3f, 0x09, 0x5f, 0xe5, 0x01, 0xdd, 0x77, 0x63, 0x9e, 0x9f, 0xba, 0xef, 0x9c, 0x1a, 0xdb, 0x4f, 0x93, 0x07, 0x58, 0x9c, 0x5f, 0x05, 0x79, 0x31, 0xf8, 0x54, 0x3f, 0x14, 0x3f, 0x5e, 0xbe, 0x8e, 0xe0, 0x0f, 0xb4, 0x7c, 0x6d, 0xc6, 0xef, 0xab, 0xf8, 0xeb, 0x1b, 0xf1, 0x65, 0x9e, 0xef, 0x25, 0xae, 0x9f, 0x80, 0x1f, 0xcd, 0xf7, 0x71, 0xf8, 0x81, 0x3c, 0x10, 0xc6, 0x8f, 0x5f, 0xbf, 0x3f, 0xd0, 0x72, 0x40, 0xdf, 0xc4, 0xbf, 0xca, 0x01, 0xbd, 0xa7, 0xb0, 0x65, 0x4f, 0xca, 0xf2, 0x89, 0xaf, 0x7e, 0xca, 0xc2, 0xaf, 0x23, 0xef, 0xbd, 0x0c, 0xf5, 0x43, 0xa8, 0xec, 0x65, 0xa8, 0x1f, 0x8a, 0xf6, 0xf1, 0x87, 0xd6, 0x23, 0x0b, 0x00, 0x8f, 0xd4, 0x84, 0xc7, 0xd6, 0x23, 0x00, 0xbc, 0x07, 0x13, 0x1e, 0x31, 0x39, 0xe9, 0xd1, 0x63, 0xfc, 0x13, 0xb7, 0x80, 0xaf, 0x57, 0x09, 0x3e, 0x2f, 0xe7, 0xe5, 0xbc, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xa2, 0xdf, 0x4f, 0xa8, 0x65, 0x25, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd0, 0x86, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xe8, 0xf1, 0xab, 0x7f, 0xee, 0x4a, 0x55, 0x3f, 0x74, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7a, 0xbe, 0x4c, 0x93, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1c, 0x1f, 0x7b, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x8b, 0x3f, 0xc3, 0xd5, 0x3f, 0x65, 0xc4, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xe8, 0xf9, 0xbd, 0x15, 0xd1, 0x5f, 0x94, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfa, 0xf9, 0xc2, 0x3b, 0xdf, 0x55, 0x3e, 0x10, 0xfe, 0x3e, 0xc6, 0xbc, 0xef, 0x6b, 0x72, 0x4a, 0x04, 0x4e, 0xbc, 0xef, 0x6e, 0x84, 0xc6, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x22, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x68, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0xe2, 0x75, 0x6e, 0xd2, 0x7f, 0x18, 0x1e, 0xb1, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x00, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x61, 0xfb, 0x0b, 0x98, 0xdf, 0x9a, 0xf1, 0xe3, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x8f, 0xf3, 0xaf, 0x00, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x41, 0xd9, 0xc2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0x44, 0x95, 0x60, 0xb2, 0x4f, 0x1c, 0xff, 0x61, 0x18, 0x89, 0x3e, 0x3f, 0x08, 0xf1, 0x75, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xc1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x86, 0xed, 0xaf, 0xe5, 0x96, 0xc8, 0x67, 0x34, 0x16, 0x7a, 0xbe, 0x24, 0x7c, 0x5e, 0xf4, 0x6f, 0xa2, 0xcf, 0x04, 0xef, 0xf9, 0x43, 0x62, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xb0, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x21, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0x45, 0x13, 0x64, 0x12, 0xfd, 0xe0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x8a, 0x51, 0x66, 0xc8, 0x41, 0x11, 0x01, 0xad, 0x78, 0xff, 0x0c, 0x27, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe2, 0x3f, 0x14, 0xc3, 0xa6, 0x67, 0xc8, 0xe9, 0x39, 0x20, 0x64, 0x1f, 0x1a, 0xf3, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xc3, 0xb6, 0x33, 0xc9, 0x9f, 0x10, 0xff, 0xe1, 0x18, 0x36, 0xf9, 0x72, 0x20, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xf7, 0x0d, 0xdd, 0x04, 0x0f, 0xcb, 0x4e, 0x93, 0x72, 0x40, 0x4c, 0xfc, 0xd3, 0x98, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0xc5, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x97, 0xf3, 0x72, 0x5e, 0xce, 0x4b, 0x70, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4d, 0x3d, 0x16, 0x49, 0xd8, 0x3f, 0x10, 0xe2, 0xfd, 0x84, 0xd2, 0x6b, 0x23, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf0, 0xee, 0x4a, 0x62, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x78, 0x06, 0x43, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x88, 0xd3, 0x21, 0x3b, 0xed, 0x1c, 0x22, 0x74, 0x1c, 0x61, 0x45, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xfe, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x49, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xa0, 0x8f, 0x45, 0xf4, 0x46, 0x82, 0xc7, 0x3c, 0x11, 0xfa, 0x24, 0x19, 0x3f, 0x89, 0x3f, 0x2b, 0x21, 0x36, 0x4c, 0xf0, 0x84, 0xe3, 0x99, 0xd8, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0x89, 0x3f, 0x4f, 0x0c, 0xc8, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6c, 0x4d, 0xf6, 0xf1, 0x8e, 0xd7, 0x62, 0xf0, 0xe3, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x42, 0x70, 0x12, 0xb7, 0x7e, 0x4c, 0x7e, 0x20, 0xe4, 0x14, 0xf9, 0x42, 0xf9, 0x21, 0xce, 0xbf, 0xac, 0xe0, 0x4f, 0x03, 0xa3, 0xf4, 0x63, 0x72, 0x65, 0x78, 0xeb, 0x67, 0xa2, 0xcf, 0x42, 0x31, 0x9a, 0xa4, 0x3f, 0x12, 0x63, 0x3f, 0x12, 0xc3, 0x5f, 0xc0, 0x7e, 0x26, 0xfd, 0x85, 0x74, 0x14, 0x67, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x5c, 0xfc, 0x87, 0xf5, 0x1b, 0xa7, 0xbf, 0xd3, 0xec, 0x47, 0x4e, 0xd1, 0xbf, 0xc7, 0x63, 0x0c, 0x3e, 0x8d, 0xb3, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xce, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x4a, 0x0c, 0x9b, 0x8e, 0xdf, 0x03, 0xfe, 0x17, 0x63, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x50, 0x9e, 0x08, 0xf3, 0xce, 0xac, 0xf8, 0xf8, 0x0d, 0xe7, 0x00, 0x1a, 0xf3, 0xf3, 0xf0, 0x38, 0xfb, 0x06, 0x72, 0x54, 0x1c, 0x7e, 0xc8, 0x8f, 0xac, 0x84, 0x1c, 0x17, 0x3e, 0x23, 0x25, 0x86, 0x18, 0x8a, 0xcb, 0xdd, 0x46, 0xfa, 0x24, 0x18, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xca, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xc9, 0x39, 0xc0, 0x4a, 0x88, 0x61, 0x6a, 0x25, 0xe3, 0xb3, 0xb8, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xfe, 0xf1, 0xe8, 0x1f, 0x3f, 0xc7, 0xed, 0x2f, 0x48, 0xfc, 0xfe, 0x2b, 0x1c, 0xc3, 0xf4, 0x34, 0xb8, 0x15, 0x0f, 0x37, 0xc5, 0x7f, 0x78, 0xff, 0x46, 0x12, 0xe8, 0xc7, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x2d, 0x7a, 0xd7, 0x74, 0x7d, 0xe7, 0xbb, 0xa6, 0xeb, 0x2c, 0xbc, 0x9c, 0xb0, 0x3f, 0x32, 0x5d, 0xfd, 0x87, 0xa6, 0xeb, 0x4c, 0xbc, 0x8c, 0xfd, 0x3f, 0xb3, 0xef, 0xd7, 0xdf, 0x0f, 0x5f, 0x68, 0xdf, 0x47, 0x1f, 0x84, 0xaf, 0x73, 0xfb, 0x9e, 0x15, 0xfb, 0xe2, 0x15, 0xb5, 0x2f, 0x5e, 0xe7, 0xf6, 0x3d, 0xb7, 0xef, 0xc7, 0xbd, 0x9c, 0x18, 0xcc, 0xdb, 0xbb, 0x7b, 0x62, 0x30, 0xef, 0xe0, 0x4c, 0xd8, 0xf7, 0xc4, 0x60, 0xde, 0x6f, 0x3f, 0x38, 0x31, 0x98, 0xf7, 0xc3, 0x07, 0x67, 0x41, 0xde, 0xaf, 0xfd, 0x61, 0xd4, 0xc0, 0xc7, 0x0f, 0xfe, 0xe9, 0x9f, 0xa3, 0x06, 0x3e, 0x3e, 0x13, 0xf2, 0xfe, 0xc5, 0x5f, 0x9a, 0xe2, 0xf7, 0xbf, 0xff, 0xe7, 0xcc, 0xe6, 0xe7, 0xde, 0x5d, 0xfe, 0x27, 0xcb, 0xdd, 0x13, 0x5e, 0x20, 0x58, 0xf9, 0x9f, 0x2c, 0xdf, 0x15, 0xa3, 0x67, 0x22, 0x3f, 0xbf, 0xf7, 0x3e, 0xff, 0x93, 0xe5, 0xfd, 0x93, 0x93, 0x7b, 0xf7, 0x4f, 0x4e, 0x1e, 0xfd, 0xcb, 0x07, 0xfc, 0x4f, 0x96, 0x0f, 0x4e, 0x4e, 0xfe, 0xea, 0xaf, 0xcf, 0x86, 0xbc, 0x27, 0x91, 0xf2, 0xc7, 0xdf, 0x38, 0x31, 0x94, 0x7f, 0xfd, 0xde, 0x19, 0x91, 0xf7, 0xdd, 0x5f, 0x0d, 0xc8, 0xf5, 0x95, 0xdf, 0xff, 0xdd, 0xdf, 0xfb, 0x83, 0xaf, 0x9e, 0xfc, 0xda, 0xaf, 0x07, 0x46, 0xff, 0xee, 0xef, 0xff, 0xe6, 0x6f, 0xff, 0xe1, 0x1f, 0xcf, 0x84, 0xbc, 0xbf, 0xf9, 0x5b, 0x01, 0xc9, 0xfe, 0xe4, 0x4f, 0xbf, 0xf9, 0xad, 0x3f, 0xfb, 0xf3, 0x93, 0xdf, 0xfe, 0x9d, 0xc0, 0xe8, 0x7f, 0xfc, 0xe7, 0xbf, 0xfd, 0xfb, 0x7f, 0x7d, 0x7f, 0xe8, 0xae, 0x65, 0x7d, 0x92, 0x5f, 0x2f, 0x0f, 0xe1, 0xf5, 0x93, 0xfc, 0xe2, 0xf7, 0xd6, 0x93, 0x5c, 0xfc, 0x7f, 0xc7, 0xb2, 0x2e, 0xe0, 0xf5, 0x3c, 0x5c, 0x2f, 0xc0, 0x45, 0x2e, 0x90, 0x21, 0x2b, 0x78, 0x91, 0xd0, 0xa5, 0x53, 0xb8, 0x00, 0x24, 0x7e, 0xc9, 0x7a, 0xc9, 0x7a, 0xe9, 0xb9, 0x97, 0x9e, 0x7b, 0xb2, 0x35, 0xc3, 0xd7, 0xf3, 0x9f, 0xfc, 0xfe, 0x2b, 0xd6, 0xfa, 0x95, 0xf2, 0x52, 0xb9, 0x94, 0x7a, 0x3b, 0x35, 0x34, 0xbf, 0xb2, 0x50, 0xb6, 0x4b, 0xa9, 0x21, 0xb8, 0x1d, 0x7a, 0xe3, 0xb2, 0x8d, 0xa5, 0x34, 0x39, 0x9d, 0x83, 0xde, 0x25, 0xd5, 0x2b, 0x60, 0x6f, 0x6d, 0x7d, 0x75, 0x71, 0xf9, 0xb2, 0x5d, 0x9a, 0xc2, 0xce, 0xf2, 0xf5, 0xa5, 0x37, 0xca, 0xab, 0x00, 0x9a, 0xc4, 0xde, 0x67, 0xca, 0x9f, 0xbb, 0xb1, 0xb2, 0xba, 0x50, 0x2a, 0x62, 0x67, 0xee, 0xda, 0x22, 0xc7, 0xe2, 0x24, 0xe6, 0x57, 0x96, 0x96, 0xca, 0xcb, 0xeb, 0xa5, 0x49, 0x8e, 0xb5, 0xb6, 0x78, 0x79, 0x99, 0x13, 0xe4, 0x13, 0xd7, 0xca, 0x57, 0xcb, 0xf3, 0xeb, 0xb6, 0x84, 0xcd, 0x5f, 0x5f, 0x5d, 0x5b, 0x01, 0x8a, 0x62, 0xad, 0x2b, 0x73, 0x0b, 0x2b, 0x37, 0xec, 0x52, 0xc7, 0xdd, 0x77, 0x38, 0xcd, 0xab, 0xeb, 0x1b, 0x97, 0x56, 0x80, 0x4e, 0xad, 0xd2, 0x68, 0xf3, 0x91, 0xa5, 0xb9, 0xf5, 0xf9, 0x2b, 0x1b, 0x0b, 0xe5, 0xab, 0x8b, 0x4b, 0x8b, 0xeb, 0xe5, 0xd5, 0x35, 0x35, 0xf5, 0x56, 0x2e, 0x95, 0x1a, 0xba, 0x3c, 0xb7, 0x54, 0xbe, 0x36, 0xb7, 0x20, 0x85, 0x5a, 0x5f, 0xb9, 0x3e, 0x7f, 0x05, 0xee, 0x79, 0x07, 0x48, 0x5d, 0xbb, 0x32, 0x57, 0x9a, 0x7c, 0x7d, 0x02, 0xa9, 0xdc, 0x12, 0x18, 0xb7, 0x52, 0xa9, 0xf9, 0x2b, 0xe5, 0xf9, 0xcf, 0x6c, 0x2c, 0x97, 0x6f, 0x6c, 0xbc, 0x09, 0xd4, 0x16, 0x57, 0x96, 0x39, 0xc1, 0xd4, 0xf2, 0xca, 0xc6, 0xda, 0xca, 0xf5, 0xe5, 0x05, 0xb1, 0x70, 0xea, 0xf2, 0xe2, 0xa5, 0x8d, 0xab, 0xe5, 0xe5, 0xcb, 0xeb, 0x57, 0x4a, 0x85, 0x09, 0x7b, 0x6c, 0xcc, 0xae, 0x37, 0xed, 0xb6, 0x53, 0x6d, 0x35, 0xb7, 0xda, 0xa9, 0xb5, 0x95, 0x4b, 0xeb, 0x37, 0xe6, 0x56, 0xcb, 0x1b, 0xab, 0xe5, 0xe5, 0x85, 0x32, 0xea, 0x4a, 0x22, 0xbd, 0xb9, 0xf6, 0xb9, 0xe5, 0x79, 0x41, 0x6e, 0x7e, 0x75, 0x7d, 0x63, 0x69, 0x65, 0x79, 0x71, 0x7d, 0x65, 0x55, 0xa3, 0xb8, 0x36, 0x3f, 0x77, 0xb5, 0x5c, 0x2a, 0xa6, 0xae, 0x2f, 0xca, 0xdb, 0xa9, 0x54, 0x6a, 0x2c, 0xbe, 0xa4, 0x6a, 0xfb, 0xcd, 0x6a, 0xa7, 0xde, 0x6a, 0xda, 0xeb, 0x8b, 0xf3, 0x99, 0x6c, 0x6a, 0xa8, 0xda, 0x68, 0x63, 0xd3, 0x68, 0x55, 0x2b, 0x0d, 0xbb, 0x51, 0xd9, 0x74, 0x1a, 0xa5, 0xf4, 0xfa, 0x4e, 0xbd, 0x6d, 0xc3, 0x5f, 0xfb, 0xb0, 0xdd, 0x71, 0x76, 0x6d, 0x60, 0xb1, 0x56, 0xdf, 0xde, 0x77, 0x2b, 0x1c, 0xaf, 0x5a, 0x71, 0x3b, 0x6e, 0x7d, 0x6b, 0xdb, 0x49, 0x2b, 0xac, 0x76, 0xfd, 0x2d, 0xa7, 0xb4, 0xe7, 0xd6, 0x9b, 0x9d, 0x0c, 0x27, 0x90, 0x9b, 0xc8, 0x8d, 0xcd, 0x00, 0x4d, 0x7d, 0x28, 0x53, 0x98, 0x9a, 0x18, 0xc3, 0x89, 0xd9, 0xf1, 0xf1, 0x42, 0x2e, 0x33, 0x59, 0x9c, 0x81, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xcd, 0xad, 0x14, 0x97, 0x0d, 0xed, 0x56, 0x5e, 0xe5, 0x6e, 0x05, 0x6a, 0x5c, 0x2f, 0x7f, 0xb6, 0xf4, 0xf9, 0xcf, 0x83, 0x9a, 0x5f, 0xbb, 0xe9, 0xb8, 0x6d, 0x5c, 0x78, 0x72, 0x72, 0x02, 0xba, 0x95, 0x0e, 0xac, 0xbe, 0xb9, 0xdf, 0x71, 0xec, 0x9b, 0x4e, 0xb5, 0x68, 0x6f, 0xef, 0xed, 0x6f, 0xbc, 0xe9, 0xb8, 0x1d, 0xe7, 0xe0, 0x62, 0x18, 0x58, 0xe0, 0xc0, 0x75, 0xe7, 0x60, 0xbe, 0xd5, 0x72, 0xb7, 0x22, 0xe0, 0x29, 0x0e, 0x9e, 0x6f, 0x35, 0x5a, 0x2e, 0xc2, 0xf6, 0x9b, 0xf5, 0x5a, 0xcb, 0xdd, 0xb5, 0x77, 0x2b, 0x1d, 0x01, 0x59, 0x6a, 0x6d, 0x39, 0x8d, 0x37, 0xeb, 0x4e, 0xf7, 0x9a, 0xdb, 0xfa, 0x05, 0x87, 0xeb, 0x6c, 0xa9, 0x02, 0xf8, 0x7c, 0xa1, 0x9b, 0x15, 0xf7, 0xb0, 0xde, 0xdc, 0x16, 0x74, 0xaa, 0x8a, 0x86, 0x36, 0x5a, 0xb0, 0x3b, 0xda, 0xc2, 0x37, 0x5b, 0xf5, 0x2d, 0xa0, 0x5c, 0x6f, 0x66, 0xf0, 0x2e, 0xab, 0xdc, 0x89, 0x23, 0xda, 0xa5, 0x20, 0x23, 0x43, 0x0a, 0x11, 0x00, 0x48, 0x28, 0xa3, 0x4b, 0x91, 0xe5, 0x33, 0xb6, 0x1b, 0x1b, 0xd7, 0x5a, 0xed, 0x3a, 0x37, 0x47, 0x29, 0x99, 0x59, 0x7b, 0x84, 0xf3, 0x98, 0xf1, 0xf5, 0x94, 0xb3, 0x27, 0xf3, 0x13, 0x9c, 0xce, 0xad, 0xd4, 0xd0, 0x17, 0xbe, 0x00, 0x4e, 0x7c, 0x6d, 0xf1, 0xb3, 0xe5, 0xab, 0x46, 0x65, 0x8f, 0x8f, 0xef, 0xb9, 0x4e, 0xb5, 0xce, 0x47, 0x76, 0xea, 0xdb, 0x3b, 0x7b, 0x76, 0xad, 0xd1, 0xaa, 0x74, 0x12, 0x65, 0x55, 0x8a, 0x6c, 0x57, 0x76, 0xf7, 0x1a, 0x8e, 0x5b, 0x58, 0xb0, 0xdb, 0xad, 0x7d, 0xb7, 0xea, 0xe8, 0x30, 0x4e, 0xc5, 0xee, 0xb8, 0xdb, 0x1b, 0x07, 0xe6, 0xe1, 0x43, 0xf3, 0x70, 0xd7, 0x3c, 0xbc, 0x13, 0x1d, 0x6e, 0x57, 0x5d, 0xd3, 0x6c, 0x1c, 0x86, 0xd9, 0x5c, 0x34, 0xbb, 0xbc, 0xbb, 0xdf, 0xa8, 0x74, 0x9c, 0x2d, 0x08, 0xc4, 0xbd, 0xfd, 0x8e, 0xed, 0x3a, 0xed, 0x56, 0x63, 0x1f, 0x55, 0x97, 0x47, 0xf9, 0x50, 0x2e, 0x18, 0x2a, 0x71, 0x1b, 0x14, 0xa6, 0x67, 0xf2, 0x13, 0xb9, 0xc9, 0xa9, 0x29, 0xae, 0x3a, 0x81, 0x7e, 0xa5, 0xe2, 0x6e, 0x35, 0x9d, 0x76, 0xdb, 0x6e, 0xd5, 0x80, 0x6e, 0xa5, 0xd9, 0xa8, 0x37, 0x9d, 0xbc, 0x00, 0xd9, 0x63, 0xaf, 0xe7, 0x27, 0xc0, 0x34, 0xed, 0x56, 0xad, 0x23, 0x46, 0xc6, 0x26, 0x67, 0xf8, 0xc8, 0xae, 0xb3, 0x55, 0xdf, 0xdf, 0x85, 0x31, 0xc1, 0xcf, 0x0e, 0xd0, 0x58, 0x03, 0xdc, 0x12, 0x22, 0x98, 0x08, 0xef, 0xd5, 0x0f, 0x9c, 0x46, 0x9b, 0xa7, 0x8a, 0xe0, 0x12, 0x63, 0x85, 0xf0, 0x0a, 0x53, 0x7c, 0x00, 0x29, 0x06, 0xc8, 0x5f, 0xab, 0x1f, 0x94, 0xc6, 0x8a, 0x3e, 0xf5, 0x85, 0x7a, 0x7b, 0xaf, 0x51, 0x39, 0xb4, 0xbb, 0x15, 0x77, 0x4f, 0xd2, 0x9a, 0xe0, 0x98, 0xcd, 0x56, 0xd3, 0x11, 0x7d, 0x70, 0x90, 0x71, 0x21, 0x80, 0x73, 0xd0, 0x71, 0x9d, 0x5d, 0x47, 0xe9, 0x03, 0x71, 0x84, 0x42, 0x70, 0xca, 0xcc, 0x14, 0xea, 0x04, 0x6e, 0xa6, 0x5e, 0x47, 0xb5, 0xd8, 0x72, 0x81, 0xb9, 0xdd, 0xd6, 0x7e, 0xb3, 0xc3, 0xb5, 0xb2, 0x53, 0xd9, 0x6a, 0x75, 0xc1, 0xf1, 0xdb, 0x5f, 0xcc, 0x7b, 0x3c, 0x61, 0x6f, 0xa1, 0xe2, 0x7e, 0xb1, 0x34, 0x91, 0x9f, 0xbe, 0x18, 0x18, 0xbd, 0x0a, 0x1e, 0xd6, 0x29, 0x4d, 0xe2, 0x30, 0xa7, 0x34, 0xf6, 0x8c, 0x8a, 0xe4, 0xab, 0xbd, 0x7a, 0xf9, 0x0d, 0xbb, 0xd3, 0xb2, 0xaf, 0x82, 0x12, 0x2b, 0xae, 0x14, 0x7d, 0xae, 0xdd, 0xde, 0x47, 0x37, 0xde, 0x6f, 0xe3, 0xbf, 0x62, 0xca, 0xe1, 0x1e, 0xf8, 0x04, 0xb8, 0x74, 0x67, 0x1f, 0xec, 0x6f, 0x77, 0x30, 0x19, 0xb6, 0x77, 0x5a, 0xfb, 0x8d, 0x2d, 0x50, 0x51, 0xc7, 0xde, 0x74, 0xec, 0xa6, 0xe3, 0x6c, 0x39, 0x5b, 0xbe, 0x48, 0xeb, 0x2d, 0x41, 0x73, 0x32, 0x23, 0xfa, 0xd5, 0xec, 0xdb, 0xae, 0x03, 0xd8, 0xcd, 0x4c, 0x75, 0x16, 0xc4, 0x9c, 0x98, 0x9a, 0x98, 0x9a, 0xce, 0x7e, 0xba, 0x3a, 0x3e, 0x59, 0xc8, 0xff, 0x6c, 0xe1, 0xe7, 0xf6, 0x5a, 0xdd, 0x4c, 0xa6, 0x3a, 0x0a, 0xe3, 0xd3, 0xd3, 0xd9, 0xf1, 0x49, 0x6c, 0x72, 0x85, 0xfc, 0x54, 0xf6, 0xe2, 0x2d, 0xa1, 0xe6, 0xa2, 0x47, 0x2f, 0xc3, 0x7b, 0x1e, 0x35, 0x9e, 0xf1, 0x32, 0xfe, 0x62, 0xd5, 0xbc, 0x9b, 0xcd, 0xe9, 0xdd, 0xed, 0x60, 0x77, 0x33, 0x8b, 0x34, 0x85, 0x9c, 0x62, 0x14, 0xc5, 0x47, 0x19, 0x9f, 0xad, 0xf0, 0x6b, 0xee, 0xf6, 0xa6, 0x49, 0x74, 0x90, 0x70, 0xa2, 0x38, 0x59, 0x9c, 0x78, 0xfd, 0xd3, 0xd5, 0x11, 0x21, 0x3a, 0x17, 0x76, 0x04, 0x15, 0x50, 0xcd, 0x4d, 0xe4, 0xa7, 0x26, 0x67, 0x66, 0x66, 0xb2, 0x63, 0x42, 0x11, 0xba, 0xf4, 0x48, 0x30, 0x46, 0x76, 0xb1, 0x96, 0x94, 0x5c, 0x75, 0xb6, 0xf5, 0x8e, 0x2e, 0xf5, 0x32, 0xc8, 0xec, 0xb4, 0x3b, 0xb6, 0xa3, 0x22, 0x5d, 0x24, 0x25, 0x7b, 0xbb, 0x7e, 0xd3, 0x69, 0x8a, 0x94, 0x80, 0x92, 0xef, 0xb5, 0xe0, 0x41, 0x05, 0xff, 0xca, 0x94, 0x5a, 0x69, 0x72, 0x0d, 0x38, 0x0d, 0xf0, 0xe1, 0x5a, 0xdb, 0xe9, 0x28, 0x6d, 0x35, 0xda, 0x2d, 0xfb, 0x2d, 0xc7, 0x6d, 0xfd, 0x0c, 0x46, 0x26, 0xc6, 0xbc, 0xeb, 0x38, 0x2a, 0x57, 0x14, 0xed, 0x4b, 0x4e, 0xa7, 0xba, 0x93, 0xe1, 0x61, 0x02, 0x94, 0x72, 0xfc, 0x06, 0xa6, 0x65, 0x79, 0xa6, 0x87, 0x91, 0x12, 0x6a, 0xa8, 0xe5, 0x66, 0xe0, 0x76, 0x04, 0x98, 0x1a, 0x45, 0xd8, 0x28, 0x8f, 0x25, 0x08, 0x04, 0xd0, 0xc6, 0x74, 0x36, 0x3b, 0x0e, 0xe3, 0x3c, 0xc1, 0x4b, 0x99, 0x3d, 0x3f, 0x98, 0xcc, 0x17, 0x20, 0x91, 0x4b, 0xab, 0x14, 0x16, 0x32, 0x22, 0xa3, 0xe6, 0x80, 0x54, 0xfe, 0xe0, 0x30, 0xc7, 0x73, 0x4b, 0x36, 0x0f, 0xf2, 0xfb, 0x92, 0x43, 0x94, 0x77, 0x2a, 0xcd, 0xaa, 0x83, 0x99, 0xc3, 0x93, 0x5e, 0x26, 0x13, 0x70, 0x82, 0xa6, 0x54, 0x0c, 0x17, 0xd3, 0x4b, 0x77, 0x88, 0xe4, 0x49, 0x90, 0x7d, 0x1b, 0x99, 0x96, 0xdc, 0x5e, 0x94, 0x1c, 0x8d, 0x65, 0x90, 0xff, 0x31, 0x4f, 0x92, 0x6c, 0x76, 0x4c, 0x89, 0x90, 0x15, 0x26, 0x1c, 0x1a, 0x92, 0x39, 0x64, 0xc1, 0xbe, 0x5c, 0xd9, 0x6f, 0xb7, 0xeb, 0x95, 0xa6, 0xef, 0x2b, 0x38, 0x22, 0x1d, 0x05, 0x75, 0xa4, 0x72, 0x72, 0xa5, 0xe1, 0x78, 0x76, 0x76, 0x0e, 0xf6, 0x0a, 0x19, 0x3e, 0x34, 0x82, 0x6b, 0xe3, 0x1a, 0x9e, 0x50, 0xc5, 0xb1, 0x4e, 0x65, 0xcf, 0x23, 0x6b, 0xd7, 0xea, 0x8d, 0x8e, 0xe3, 0xda, 0x95, 0x46, 0x0b, 0x6c, 0xb8, 0xd3, 0x72, 0xdf, 0xb2, 0x55, 0x7e, 0xe4, 0x06, 0xb9, 0x02, 0x23, 0x45, 0xdf, 0x20, 0x62, 0x31, 0xcf, 0x22, 0x7c, 0xca, 0x66, 0x49, 0x58, 0x4d, 0x19, 0x2c, 0x33, 0x06, 0x1e, 0x9a, 0xc3, 0x39, 0xe2, 0x41, 0x2b, 0x7c, 0x30, 0x3c, 0x09, 0xf3, 0x65, 0x78, 0xd2, 0x56, 0x64, 0x52, 0x90, 0x92, 0x58, 0x7d, 0xab, 0xdd, 0x29, 0x71, 0x25, 0xa3, 0x58, 0x79, 0xfe, 0xec, 0x43, 0xb9, 0xe6, 0x5b, 0x4d, 0x78, 0xee, 0x02, 0x58, 0x19, 0x0d, 0x2c, 0xd4, 0x75, 0x30, 0x1b, 0xe6, 0x7d, 0x5c, 0xae, 0x93, 0x92, 0xcc, 0xe8, 0x1a, 0xcd, 0xee, 0x66, 0x89, 0xab, 0x15, 0x68, 0x73, 0xee, 0x85, 0x3a, 0xf5, 0x09, 0x55, 0x6f, 0x02, 0x26, 0x1d, 0xc3, 0x84, 0x2d, 0x7f, 0x42, 0x88, 0x02, 0x30, 0xb7, 0x2a, 0xec, 0x22, 0x94, 0xed, 0x85, 0x50, 0x5e, 0x73, 0xd3, 0xcc, 0xe6, 0x48, 0x77, 0x73, 0xb4, 0x3a, 0xd2, 0xad, 0x8e, 0x6e, 0x8d, 0x74, 0xb7, 0xb2, 0xe3, 0x19, 0xe8, 0x42, 0x07, 0x6e, 0x3d, 0xd3, 0x4d, 0x3f, 0xb5, 0xe9, 0xa6, 0x93, 0x4d, 0x57, 0x89, 0x98, 0xae, 0x10, 0xb5, 0xca, 0x8f, 0xce, 0xbe, 0x7c, 0x92, 0x13, 0x99, 0x54, 0xf8, 0x51, 0x39, 0x41, 0xc5, 0x77, 0x82, 0x82, 0xd1, 0xc6, 0x3f, 0x4c, 0x2f, 0x91, 0x13, 0x1c, 0x7f, 0x42, 0xe1, 0xa3, 0xb8, 0x51, 0x65, 0xa4, 0x5b, 0x19, 0x0d, 0xfa, 0xd2, 0xa8, 0x33, 0xd2, 0x75, 0xd0, 0xa1, 0x2a, 0xa3, 0xca, 0xa7, 0x46, 0x61, 0xc0, 0x73, 0x2b, 0x49, 0x55, 0xed, 0x8d, 0x34, 0x85, 0x09, 0x9e, 0x70, 0x6f, 0x15, 0xeb, 0x47, 0x26, 0x73, 0x1c, 0xea, 0xf9, 0xd7, 0x13, 0x07, 0x50, 0x72, 0x6a, 0xab, 0xe6, 0x2f, 0x3e, 0xd7, 0x68, 0xc0, 0xee, 0xc6, 0x4b, 0xa5, 0x3b, 0xf0, 0x38, 0xe0, 0x6e, 0xcc, 0x33, 0xac, 0x53, 0xab, 0xc1, 0x3e, 0x5c, 0xa4, 0x5c, 0xcf, 0xaf, 0xd7, 0xdd, 0xba, 0x96, 0x5f, 0x35, 0x5f, 0x16, 0xb9, 0x0a, 0x79, 0x1c, 0x53, 0xbb, 0x73, 0xe5, 0xc1, 0x22, 0x16, 0x10, 0x84, 0x7e, 0x19, 0xf0, 0x5b, 0x1f, 0xcb, 0xdb, 0xd3, 0xfb, 0xfe, 0xc0, 0x45, 0x0f, 0x52, 0xf4, 0x5c, 0xc1, 0x83, 0xf9, 0x24, 0x3d, 0x2f, 0xf0, 0x61, 0x1e, 0x9e, 0x54, 0x47, 0xd0, 0x3e, 0x81, 0x47, 0x4d, 0xcb, 0xe5, 0x4f, 0x4e, 0x6d, 0x27, 0x0c, 0xf8, 0xf8, 0x1c, 0x85, 0xb7, 0x3b, 0x31, 0x8a, 0xcf, 0x4a, 0x88, 0xf7, 0xbd, 0x9d, 0x8a, 0xf7, 0xb8, 0xb9, 0x01, 0xbb, 0xc9, 0x90, 0x3a, 0xd4, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x88, 0x87, 0x01, 0x72, 0x7c, 0xc4, 0xdb, 0x78, 0x8e, 0x22, 0x7b, 0xf9, 0xc3, 0x11, 0xfe, 0x6f, 0x76, 0x84, 0x6f, 0x64, 0x0f, 0x72, 0x1e, 0xe0, 0x80, 0x03, 0x0e, 0x24, 0xe0, 0x30, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x28, 0xee, 0x3d, 0x15, 0xff, 0x6b, 0xc1, 0x5d, 0x2a, 0xd7, 0xed, 0x12, 0x74, 0xa2, 0xac, 0xe5, 0x0f, 0x46, 0x4b, 0x62, 0x69, 0xbe, 0x9f, 0x56, 0x86, 0x40, 0xcc, 0x12, 0xdf, 0x9f, 0xa8, 0xbd, 0x6d, 0x2e, 0x72, 0x23, 0xb8, 0xe0, 0x34, 0x4a, 0x35, 0xb7, 0x52, 0xed, 0x08, 0x56, 0xc7, 0x67, 0x94, 0x8e, 0xeb, 0x35, 0x31, 0x02, 0xbb, 0xa6, 0x62, 0xb1, 0x98, 0xe5, 0xdc, 0xb8, 0x25, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0xdb, 0xa6, 0x89, 0x1c, 0xb2, 0x19, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xc5, 0x5b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xcd, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x21, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0x3b, 0x25, 0x78, 0x2f, 0xbd, 0xe4, 0x56, 0xb6, 0xf9, 0xab, 0x20, 0x6c, 0x4c, 0xc4, 0xd6, 0x80, 0xbf, 0xe5, 0xe5, 0xc4, 0x5b, 0x9d, 0x10, 0x95, 0x4f, 0xce, 0x1f, 0x96, 0xf8, 0xcb, 0xd8, 0x98, 0xec, 0xf1, 0x3d, 0xff, 0x90, 0x52, 0x79, 0x89, 0xfb, 0x06, 0x07, 0x8d, 0x7b, 0x54, 0xba, 0x82, 0xca, 0x4e, 0x56, 0xbc, 0x82, 0x0d, 0x79, 0xcb, 0xc1, 0x9b, 0x33, 0xee, 0x7e, 0x4a, 0x18, 0x5e, 0x68, 0xaf, 0x11, 0x6e, 0xbe, 0x10, 0x37, 0xde, 0xab, 0xb3, 0x87, 0x23, 0x5e, 0xb0, 0xa7, 0xe4, 0xae, 0x32, 0x13, 0x26, 0x97, 0x0d, 0xbd, 0x29, 0xa7, 0x6e, 0xa5, 0xfe, 0x17, 0x5c, 0x2e, 0x00, 0x32, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x12, 0x59, 0x16, 0x49, 0x15, 0x09, 0xad, 0xec, 0x72, 0xb9, 0x18, 0x10, 0x1c, 0x90, 0x88, 0x21, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x13, 0x3b, 0x1d, 0xac, 0x37, 0xb6, 0xf3, 0xb4, 0x44, 0x3b, 0xef, 0x07, 0x84, 0x70, 0xe3, 0xbc, 0x9c, 0x6c, 0x95, 0xf2, 0x7d, 0xfd, 0x98, 0xe9, 0x99, 0xe9, 0x19, 0x4a, 0x6b, 0xd9, 0xde, 0x30, 0xec, 0x61, 0xab, 0xa7, 0xfb, 0xeb, 0xef, 0xeb, 0xef, 0x3d, 0x3d, 0x3d, 0x28, 0x8d, 0x5a, 0x96, 0xf5, 0xdc, 0xbb, 0x9f, 0xb2, 0xfa, 0x0c, 0xca, 0xed, 0xdb, 0xb7, 0xef, 0x1c, 0x1e, 0x1e, 0xde, 0xc1, 0x16, 0xba, 0x77, 0x18, 0xf5, 0x2a, 0x63, 0x83, 0xe1, 0xed, 0xdb, 0x6c, 0x78, 0x78, 0x48, 0x87, 0xb7, 0x7f, 0x83, 0x0e, 0xd9, 0x1d, 0xca, 0xe8, 0x1d, 0x4a, 0x55, 0xe5, 0xf8, 0xa3, 0xa3, 0xa3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x53, 0x15, 0xf1, 0x47, 0x47, 0xd9, 0x30, 0x9d, 0xa6, 0xc3, 0xd1, 0x57, 0x01, 0x3f, 0x47, 0x87, 0x54, 0xd4, 0x01, 0xcd, 0x59, 0x8c, 0xe3, 0x03, 0xee, 0x6c, 0xb1, 0x58, 0x9c, 0xc5, 0x16, 0xba, 0xb3, 0x04, 0x2a, 0xe0, 0xce, 0x4a, 0xfc, 0x74, 0x9a, 0x0d, 0x8b, 0x45, 0x3a, 0x4c, 0x17, 0x00, 0x7f, 0x96, 0x0e, 0x09, 0x54, 0x3a, 0x0b, 0xf8, 0xb3, 0x12, 0xbf, 0xd7, 0xeb, 0x35, 0xeb, 0xf5, 0x7a, 0x13, 0x5b, 0xe8, 0xf2, 0x4a, 0x2c, 0x82, 0x2d, 0xe2, 0xf7, 0x7a, 0x6c, 0x58, 0xaf, 0xd3, 0x61, 0x6f, 0x1b, 0xf0, 0x9b, 0x40, 0xb3, 0x49, 0xa9, 0x05, 0x15, 0xdb, 0xaf, 0x3f, 0x78, 0xf0, 0xe2, 0x03, 0x2c, 0x8f, 0x1e, 0x3e, 0x78, 0x30, 0x1c, 0x3e, 0x78, 0x34, 0x1c, 0x3e, 0xc4, 0x2e, 0xfc, 0xf3, 0xe8, 0x3b, 0xc3, 0xe1, 0x4b, 0x0a, 0xce, 0xc7, 0x01, 0xce, 0xe7, 0x45, 0xe0, 0x0f, 0x25, 0xbe, 0x6c, 0xa1, 0x1f, 0x80, 0x3f, 0x92, 0xf4, 0x1f, 0x49, 0xfc, 0x47, 0x3e, 0xfe, 0xcf, 0xd7, 0xeb, 0x3f, 0x51, 0xbf, 0xb9, 0x5d, 0xaf, 0x6f, 0xdf, 0x14, 0xb5, 0xd7, 0xe3, 0x2d, 0x8c, 0xdc, 0xdc, 0xed, 0xf5, 0x5e, 0xb0, 0xd3, 0xe9, 0x4f, 0xa4, 0x47, 0x5f, 0x4d, 0xa7, 0x5f, 0x7d, 0x25, 0xad, 0xb7, 0x70, 0xf7, 0xca, 0x4f, 0x8d, 0x8e, 0x3e, 0xf7, 0xee, 0xe1, 0x61, 0xea, 0xf0, 0xcb, 0xef, 0x1c, 0xf2, 0xfa, 0xce, 0x97, 0x0f, 0xd5, 0x3d, 0xdc, 0xbd, 0xf3, 0x2b, 0x5f, 0xfa, 0xd2, 0xc8, 0x54, 0xb1, 0x78, 0xae, 0x58, 0x78, 0xad, 0xc8, 0xeb, 0x6b, 0x69, 0xd0, 0x32, 0xb6, 0x85, 0x62, 0x01, 0xfe, 0x45, 0xda, 0xdc, 0xde, 0x68, 0x7b, 0x7e, 0x7d, 0x8d, 0xdf, 0xff, 0x32, 0xf8, 0x01, 0xb3, 0x28, 0xea, 0xb6, 0xcf, 0xee, 0x58, 0x0c, 0x6c, 0x3f, 0xb8, 0x03, 0xf6, 0x3f, 0x94, 0x15, 0xfd, 0xc1, 0xa2, 0x83, 0x21, 0x63, 0xc3, 0x21, 0xb7, 0x37, 0xda, 0x3e, 0x7d, 0x0f, 0x5a, 0xbc, 0xd2, 0xe9, 0x9f, 0x06, 0x3f, 0xf0, 0xf0, 0x73, 0x94, 0x82, 0xed, 0x79, 0xcd, 0xa5, 0x29, 0xe3, 0x7e, 0x30, 0xea, 0xe3, 0x73, 0x7b, 0xa3, 0xed, 0xef, 0xdf, 0xbf, 0x3f, 0x5b, 0x9c, 0x9d, 0xc5, 0x7b, 0xa4, 0xe1, 0xe1, 0xcf, 0x52, 0x0a, 0xb6, 0xa7, 0xf7, 0xa1, 0xce, 0x16, 0x29, 0xe3, 0x7e, 0x90, 0xf6, 0xf1, 0xb9, 0xad, 0xd1, 0xf6, 0x75, 0x6c, 0xbf, 0xc2, 0xef, 0x7f, 0x11, 0xfc, 0xc0, 0xc3, 0x6f, 0x5a, 0x0c, 0x6c, 0x3f, 0x68, 0x82, 0xfd, 0xeb, 0xb2, 0xa2, 0x3f, 0x28, 0x7c, 0x08, 0x03, 0x2b, 0xce, 0x07, 0x70, 0x5c, 0x87, 0x87, 0x7d, 0x20, 0x08, 0x8f, 0xfa, 0x40, 0x00, 0x6e, 0xf0, 0x01, 0x05, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0x38, 0xc2, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0x6e, 0x8c, 0x5f, 0x5e, 0xd2, 0xb9, 0x1c, 0xbb, 0x67, 0x8a, 0x5f, 0x80, 0x83, 0x3d, 0xa1, 0xde, 0x83, 0x6a, 0x3d, 0x83, 0xb2, 0x7d, 0xcd, 0x79, 0xc1, 0xfa, 0x21, 0x15, 0x74, 0xae, 0x48, 0x65, 0x84, 0x57, 0x50, 0x7f, 0x11, 0x4b, 0x04, 0xfe, 0xed, 0x17, 0xbd, 0x39, 0xc5, 0x73, 0x96, 0xc5, 0xeb, 0xf7, 0x1e, 0x3f, 0xe6, 0xed, 0x37, 0x5e, 0x7c, 0x50, 0xd4, 0x8b, 0x82, 0xeb, 0xf3, 0xb4, 0x62, 0x7d, 0xcc, 0x8b, 0x1f, 0xbf, 0xd8, 0xde, 0x63, 0xd1, 0xf8, 0xb5, 0x30, 0x66, 0x07, 0x10, 0xbb, 0xdc, 0x07, 0xc2, 0xf1, 0xfb, 0x2c, 0x78, 0x38, 0x7e, 0xfc, 0xd8, 0x3a, 0x2b, 0x67, 0xe5, 0xac, 0xfc, 0x98, 0x0a, 0x21, 0xa2, 0x42, 0x36, 0xa7, 0x84, 0xf1, 0xaa, 0x17, 0xca, 0x08, 0x80, 0xa0, 0x52, 0xcc, 0x0a, 0x38, 0x89, 0x85, 0x92, 0x2c, 0xc2, 0xe1, 0x62, 0x02, 0x17, 0xdb, 0x20, 0x01, 0xa0, 0xcd, 0x2c, 0x31, 0xce, 0x64, 0x3f, 0x80, 0x2f, 0xc6, 0x38, 0x5c, 0xce, 0x0d, 0xae, 0xcf, 0x04, 0x7d, 0xb5, 0x06, 0x23, 0x91, 0xf5, 0x91, 0x7f, 0x81, 0x6f, 0x89, 0xaa, 0x40, 0x90, 0xc4, 0xe3, 0xaa, 0xcf, 0x9e, 0x46, 0x1f, 0x2f, 0x62, 0x90, 0x8f, 0xaa, 0xb5, 0x19, 0xbf, 0x0f, 0x8a, 0xe7, 0xeb, 0xcc, 0xa4, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x0b, 0xf3, 0x0f, 0xf3, 0x09, 0xe5, 0xd5, 0x88, 0xcf, 0x08, 0xa8, 0x9e, 0x79, 0x15, 0xfb, 0x01, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x06, 0xe1, 0x1e, 0xdf, 0xca, 0x3e, 0x16, 0x35, 0xd8, 0x97, 0x89, 0xca, 0x6d, 0xc4, 0x0c, 0x4e, 0x42, 0xfd, 0x1a, 0xb1, 0xaf, 0x94, 0x91, 0x4a, 0xfb, 0x85, 0x77, 0x05, 0x12, 0x86, 0xfe, 0x63, 0x29, 0x1b, 0x9b, 0xfc, 0x87, 0xd3, 0x36, 0xe1, 0x87, 0xfc, 0x83, 0x46, 0xfd, 0xc3, 0xd4, 0x6a, 0x13, 0x40, 0x49, 0xa8, 0x5d, 0xfc, 0x43, 0x47, 0x66, 0x51, 0xff, 0x52, 0xf6, 0x95, 0x6d, 0x44, 0x7a, 0xae, 0x17, 0x03, 0x6f, 0x3a, 0x8f, 0x8c, 0x18, 0x71, 0x71, 0x71, 0xa9, 0x37, 0xc2, 0x63, 0xc8, 0x0a, 0xca, 0xaf, 0xfc, 0x49, 0xd9, 0x85, 0x46, 0xb6, 0x55, 0xb8, 0x2e, 0x15, 0x3e, 0x6e, 0x70, 0x1f, 0x0f, 0x9f, 0xc6, 0xe0, 0xeb, 0xfe, 0xab, 0x74, 0x1c, 0xa1, 0x4f, 0xa4, 0x7c, 0x44, 0xf2, 0x1b, 0x62, 0x9f, 0xc9, 0x38, 0x63, 0x51, 0xb0, 0xa7, 0x77, 0x69, 0x63, 0x6a, 0xd0, 0xaf, 0xe2, 0x4b, 0xd5, 0x88, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x58, 0x11, 0xff, 0xb4, 0x7c, 0x0f, 0x89, 0xfa, 0x1f, 0xf1, 0x69, 0xf0, 0x36, 0xa2, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xd8, 0xf8, 0x60, 0xc1, 0xfc, 0x45, 0x45, 0x0e, 0x51, 0x03, 0xc4, 0xbb, 0xa7, 0xda, 0x78, 0x8c, 0xda, 0x74, 0xf7, 0x53, 0x35, 0xce, 0x75, 0x68, 0x9c, 0x6b, 0x69, 0x7e, 0xa5, 0xe7, 0x2c, 0x3d, 0xbf, 0x25, 0xfa, 0x26, 0xb5, 0x64, 0xee, 0x95, 0xa1, 0xc7, 0x54, 0xbe, 0x35, 0x98, 0x96, 0x45, 0x4d, 0x0c, 0x99, 0x92, 0x40, 0xd6, 0x21, 0x4c, 0xbf, 0x64, 0x5f, 0xcf, 0xaf, 0xd0, 0xc5, 0xec, 0x65, 0x61, 0x1b, 0xc8, 0xaf, 0x32, 0xb6, 0x31, 0x43, 0x11, 0xe8, 0x10, 0xcf, 0x86, 0xc4, 0xd3, 0x3d, 0x97, 0x41, 0xf3, 0x8d, 0x60, 0x0c, 0x12, 0xc5, 0x3c, 0x97, 0x13, 0x97, 0x25, 0xba, 0x0b, 0x33, 0xe2, 0xc7, 0x9d, 0x7a, 0x8e, 0x11, 0x5f, 0x17, 0x84, 0x10, 0x22, 0xa9, 0x04, 0x5b, 0x39, 0xae, 0x3b, 0x0f, 0x15, 0x8c, 0x83, 0x20, 0x8c, 0xa7, 0x89, 0xb3, 0x72, 0x56, 0x4e, 0x7b, 0xe1, 0x47, 0x64, 0xc3, 0xe1, 0x70, 0x80, 0x6f, 0xfa, 0x58, 0x78, 0xdb, 0xef, 0xcb, 0x76, 0x28, 0xc1, 0x7d, 0x1d, 0xdc, 0xef, 0x8b, 0xe9, 0x43, 0xd1, 0xfa, 0xc5, 0x40, 0x27, 0x04, 0x8e, 0xd0, 0x39, 0xb3, 0xc0, 0x8f, 0xb7, 0x0c, 0xfa, 0x68, 0x48, 0xb0, 0x1b, 0x54, 0x34, 0x10, 0x8b, 0x96, 0xa1, 0x56, 0xfa, 0x61, 0xa0, 0xf2, 0x13, 0xa4, 0x13, 0x83, 0xaf, 0xfc, 0xc4, 0x88, 0x7f, 0x66, 0x81, 0x8f, 0x51, 0xfc, 0x1b, 0x2a, 0xf3, 0xcd, 0xda, 0x8f, 0xa9, 0x26, 0x7c, 0x0c, 0x70, 0x18, 0x1b, 0x0c, 0x4d, 0xf8, 0x78, 0xae, 0x34, 0xc4, 0xda, 0x8f, 0xc3, 0x1f, 0x0c, 0x45, 0x65, 0x46, 0x7c, 0xc4, 0xe3, 0xf5, 0xc4, 0xf5, 0xa3, 0xf8, 0xc3, 0x50, 0x35, 0xe0, 0x0f, 0xf5, 0x9a, 0xc8, 0xbf, 0x19, 0xdf, 0x93, 0x7d, 0x20, 0x55, 0xa8, 0xe3, 0xeb, 0xb2, 0xe3, 0xfd, 0xc9, 0xf1, 0x07, 0xc1, 0x05, 0x71, 0x23, 0x2b, 0x63, 0x31, 0x01, 0xca, 0x9e, 0xb0, 0xe8, 0xc1, 0xcc, 0xc2, 0xf6, 0x36, 0xf3, 0xa2, 0xd9, 0x3a, 0xca, 0x8b, 0x94, 0x33, 0x16, 0x5f, 0xda, 0x38, 0x01, 0x9f, 0x0d, 0x92, 0xf0, 0xfb, 0xec, 0x07, 0xc3, 0xd7, 0xec, 0x14, 0x87, 0xaf, 0x6c, 0xfd, 0x83, 0xac, 0x3f, 0x48, 0xc2, 0xef, 0x27, 0xe0, 0x87, 0x4b, 0x5f, 0xf0, 0xcc, 0xeb, 0xe0, 0x09, 0x6a, 0x42, 0x5c, 0xfa, 0xf1, 0xf9, 0x14, 0xce, 0x61, 0x8a, 0x7f, 0x96, 0x9c, 0x07, 0x92, 0xf0, 0x07, 0x49, 0xf8, 0xfd, 0x13, 0xf1, 0x07, 0xc3, 0x24, 0x7c, 0x2f, 0x7f, 0x7c, 0x84, 0xf5, 0x03, 0xf1, 0x6b, 0xc6, 0xf7, 0xe2, 0xff, 0x23, 0xf2, 0x3f, 0x48, 0xc2, 0x57, 0x79, 0x40, 0xf7, 0xdd, 0x98, 0xe7, 0xa7, 0xee, 0x3b, 0x27, 0xc6, 0xf6, 0xd3, 0xe4, 0x01, 0x16, 0xe7, 0x57, 0x41, 0x5e, 0x0c, 0x3e, 0x35, 0x08, 0xc5, 0x8f, 0x97, 0xaf, 0x23, 0xf8, 0x43, 0x2d, 0x5f, 0x9b, 0xf1, 0x07, 0x2a, 0xfe, 0x06, 0x46, 0x7c, 0x99, 0xe7, 0xfb, 0x89, 0xeb, 0x27, 0xe0, 0x47, 0xf3, 0x7d, 0x1c, 0x7e, 0x20, 0x0f, 0x84, 0xf1, 0xe3, 0xd7, 0x1f, 0x0c, 0xb5, 0x1c, 0x30, 0x30, 0xf1, 0xaf, 0x72, 0x40, 0xff, 0x29, 0x6c, 0xd9, 0x97, 0xb2, 0x7c, 0xe2, 0xab, 0x9f, 0xb2, 0xf0, 0xeb, 0xc8, 0x7b, 0x2f, 0x43, 0xfd, 0x10, 0x2a, 0x7b, 0x19, 0xea, 0x87, 0xa2, 0x85, 0x81, 0xe3, 0x63, 0x18, 0x3c, 0x56, 0x13, 0x1e, 0x5b, 0xc7, 0x00, 0x78, 0x0f, 0x26, 0x1c, 0x33, 0x39, 0xe9, 0xf8, 0x31, 0xfe, 0x89, 0x5b, 0x9c, 0xaa, 0x55, 0x09, 0x3e, 0x2b, 0x67, 0xe5, 0xac, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xa2, 0xdf, 0x4f, 0xa8, 0x65, 0x25, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd0, 0x86, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xe8, 0xf1, 0xab, 0x7f, 0xee, 0x4a, 0x55, 0x3f, 0x74, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7a, 0xbe, 0x4c, 0x93, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1c, 0x1f, 0x7b, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x8b, 0x3f, 0xc3, 0xd5, 0x3f, 0x65, 0xc4, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xe8, 0xf9, 0xbd, 0x15, 0xd1, 0x5f, 0x94, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfa, 0xf9, 0xc2, 0x3b, 0xdf, 0x55, 0x3e, 0x10, 0xfe, 0x3e, 0xc6, 0xbc, 0xef, 0x6b, 0x72, 0x4a, 0x04, 0x4e, 0xbc, 0xef, 0x6e, 0x84, 0xc6, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x22, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x68, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0xe2, 0x75, 0x6e, 0xd2, 0x7f, 0x18, 0x1e, 0xb1, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x00, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x61, 0xfb, 0x0b, 0x98, 0xdf, 0x9a, 0xf1, 0xe3, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x8f, 0xf3, 0xaf, 0x00, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x41, 0xd9, 0xc2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0x44, 0x95, 0x60, 0xb2, 0x4f, 0x1c, 0xff, 0x61, 0x18, 0x89, 0x3e, 0x3f, 0x08, 0xf1, 0x75, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xc1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x86, 0xed, 0xaf, 0xe5, 0x96, 0xc8, 0x67, 0x34, 0x16, 0x7a, 0xbe, 0x24, 0x7c, 0x5e, 0xf4, 0x6f, 0xa2, 0xcf, 0x04, 0xef, 0xf9, 0x43, 0x62, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xb0, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x21, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0x45, 0x13, 0x64, 0x12, 0xfd, 0xe0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x8a, 0x51, 0x66, 0xc8, 0x41, 0x11, 0x01, 0xad, 0x78, 0xff, 0x0c, 0x27, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe2, 0x3f, 0x14, 0xc3, 0xa6, 0x67, 0xc8, 0xc9, 0x39, 0x20, 0x64, 0x1f, 0x1a, 0xf3, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xc3, 0xb6, 0x33, 0xc9, 0x9f, 0x10, 0xff, 0xe1, 0x18, 0x36, 0xf9, 0x72, 0x20, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xf7, 0x0d, 0xdd, 0x04, 0x0f, 0xcb, 0x4e, 0x93, 0x72, 0x40, 0x4c, 0xfc, 0xd3, 0x98, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0xc5, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x95, 0xb3, 0x72, 0x56, 0xce, 0x4a, 0x70, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4d, 0x3d, 0x16, 0x49, 0xd8, 0x3f, 0x10, 0xe2, 0xfd, 0x84, 0xd2, 0x6b, 0x23, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf0, 0xee, 0x4a, 0x62, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x78, 0x06, 0x43, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x88, 0xd3, 0x21, 0x3b, 0xe9, 0x1c, 0x22, 0x74, 0x1c, 0x61, 0x45, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xfe, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x49, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xa0, 0x8f, 0x45, 0xf4, 0x46, 0x82, 0xc7, 0x3c, 0x11, 0xfa, 0x24, 0x19, 0x3f, 0x89, 0x3f, 0x2b, 0x21, 0x36, 0x4c, 0xf0, 0x84, 0xe3, 0x99, 0xd8, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0x89, 0x3f, 0x4f, 0x0c, 0xc8, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6c, 0x4d, 0xf6, 0xf1, 0x8e, 0xd7, 0x62, 0xf0, 0xe3, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x42, 0x70, 0x12, 0xb7, 0x7e, 0x4c, 0x7e, 0x20, 0xe4, 0x04, 0xf9, 0x42, 0xf9, 0x21, 0xce, 0xbf, 0xac, 0xe0, 0x4f, 0x03, 0xa3, 0xf4, 0x63, 0x72, 0x65, 0x78, 0xeb, 0x67, 0xa2, 0xcf, 0x42, 0x31, 0x9a, 0xa4, 0x3f, 0x12, 0x63, 0x3f, 0x12, 0xc3, 0x5f, 0xc0, 0x7e, 0x26, 0xfd, 0x85, 0x74, 0x14, 0x67, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x5c, 0xfc, 0x87, 0xf5, 0x1b, 0xa7, 0xbf, 0x93, 0xec, 0x47, 0x4e, 0xd0, 0xbf, 0xc7, 0x63, 0x0c, 0x3e, 0x8d, 0xb3, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xce, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x42, 0x0c, 0x9b, 0x8e, 0xdf, 0x03, 0xfe, 0x17, 0x63, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x50, 0x9e, 0x08, 0xf3, 0xce, 0xac, 0xf8, 0xf8, 0x0d, 0xe7, 0x00, 0x1a, 0xf3, 0xf3, 0xf0, 0x38, 0xfb, 0x06, 0x72, 0x54, 0x1c, 0x7e, 0xc8, 0x8f, 0xac, 0x84, 0x1c, 0x17, 0x3e, 0x23, 0x25, 0x86, 0x18, 0x8a, 0xcb, 0xdd, 0x46, 0xfa, 0x24, 0x18, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xca, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xc9, 0x39, 0xc0, 0x4a, 0x88, 0x61, 0x6a, 0x25, 0xe3, 0xb3, 0xb8, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xfe, 0xf1, 0xe8, 0x1f, 0x3f, 0xc7, 0xed, 0x2f, 0x48, 0xfc, 0xfe, 0x2b, 0x1c, 0xc3, 0xf4, 0x24, 0xb8, 0x15, 0x0f, 0x37, 0xc5, 0x7f, 0x78, 0xff, 0x46, 0x12, 0xe8, 0xc7, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x2d, 0x7a, 0xd7, 0x74, 0x7d, 0xe7, 0xbb, 0xa6, 0xeb, 0x34, 0xbc, 0x9c, 0xb0, 0x3f, 0x32, 0x5d, 0x83, 0x47, 0xa6, 0xeb, 0x54, 0xbc, 0x8c, 0xfd, 0x3f, 0xb3, 0xef, 0xd7, 0xdf, 0x0f, 0x5f, 0x68, 0xdf, 0xe3, 0x0f, 0xc2, 0xd7, 0x99, 0x7d, 0x4f, 0x8b, 0x7d, 0xf1, 0x8a, 0xda, 0x17, 0xaf, 0x33, 0xfb, 0x9e, 0xd9, 0xf7, 0xe3, 0x5e, 0x8e, 0x0c, 0xe6, 0xed, 0xdf, 0x3d, 0x32, 0x98, 0x77, 0x78, 0x2a, 0xec, 0x7b, 0x64, 0x30, 0xef, 0xb7, 0x1f, 0x1e, 0x19, 0xcc, 0xfb, 0xe1, 0xc3, 0xd3, 0x20, 0xef, 0xd7, 0xfe, 0x30, 0x6a, 0xe0, 0x07, 0x0f, 0xff, 0xe9, 0x9f, 0xa3, 0x06, 0x7e, 0x70, 0x2a, 0xe4, 0xfd, 0x8b, 0xbf, 0x34, 0xc5, 0xef, 0x7f, 0xff, 0xcf, 0xa9, 0xcd, 0xcf, 0xfd, 0xbb, 0xfc, 0x4f, 0x96, 0xbb, 0x47, 0xbc, 0x40, 0xb0, 0xf2, 0x3f, 0x59, 0xbe, 0x2b, 0x46, 0x4f, 0x45, 0x7e, 0x7e, 0xef, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x47, 0x47, 0xf7, 0xee, 0x1f, 0x1d, 0x1d, 0xff, 0xcb, 0x07, 0xfc, 0x4f, 0x96, 0x0f, 0x8e, 0x8e, 0xfe, 0xea, 0xaf, 0x4f, 0x87, 0xbc, 0x47, 0x91, 0xf2, 0xc7, 0xdf, 0x38, 0x32, 0x94, 0x7f, 0xfd, 0xde, 0x29, 0x91, 0xf7, 0xdd, 0x5f, 0x0d, 0xc8, 0xf5, 0x95, 0xdf, 0xff, 0xdd, 0xdf, 0xfb, 0x83, 0xaf, 0x1e, 0xfd, 0xda, 0xaf, 0x07, 0x46, 0xff, 0xee, 0xef, 0xff, 0xe6, 0x6f, 0xff, 0xe1, 0x1f, 0x4f, 0x85, 0xbc, 0xbf, 0xf9, 0x5b, 0x01, 0xc9, 0xfe, 0xe4, 0x4f, 0xbf, 0xf9, 0xad, 0x3f, 0xfb, 0xf3, 0xa3, 0xdf, 0xfe, 0x9d, 0xc0, 0xe8, 0x7f, 0xfc, 0xe7, 0xbf, 0xfd, 0xfb, 0x7f, 0x7d, 0x7f, 0xe4, 0xae, 0x65, 0x7d, 0x92, 0x5f, 0x2f, 0x8f, 0xe0, 0xf5, 0x93, 0xfc, 0xe2, 0xf7, 0xd6, 0x93, 0x5c, 0xfc, 0x7f, 0xc7, 0xb2, 0xce, 0xe1, 0xf5, 0x3c, 0x5c, 0x2f, 0xc0, 0x45, 0xce, 0x91, 0x11, 0x2b, 0x78, 0x91, 0xd0, 0xa5, 0x53, 0x38, 0x07, 0x24, 0x7e, 0xc9, 0x7a, 0xc9, 0x7a, 0xe9, 0xb9, 0x97, 0x9e, 0x7b, 0xb2, 0x35, 0xc3, 0xd7, 0xf3, 0x9f, 0xfc, 0xfe, 0x2b, 0x56, 0x65, 0xb1, 0xbc, 0x5c, 0x2e, 0xa5, 0xde, 0x4e, 0x8d, 0xcc, 0xaf, 0x2e, 0x94, 0xed, 0x52, 0x6a, 0x04, 0x6e, 0x47, 0xde, 0xb8, 0x6c, 0x63, 0x29, 0x4d, 0x9f, 0xcf, 0x41, 0xef, 0x92, 0xea, 0x15, 0xb0, 0xb7, 0x5e, 0x59, 0x5b, 0x5a, 0xb9, 0x6c, 0x97, 0x66, 0xb0, 0xb3, 0x72, 0x6d, 0xf9, 0x8d, 0xf2, 0x1a, 0x80, 0xa6, 0xb1, 0xf7, 0x99, 0xf2, 0xe7, 0xae, 0xaf, 0xae, 0x2d, 0x94, 0x8a, 0xd8, 0x99, 0xbb, 0xba, 0xc4, 0xb1, 0x38, 0x89, 0xf9, 0xd5, 0xe5, 0xe5, 0xf2, 0x4a, 0xa5, 0x34, 0xcd, 0xb1, 0xd6, 0x97, 0x2e, 0xaf, 0x70, 0x82, 0x7c, 0xe2, 0x7a, 0xf9, 0x4a, 0x79, 0xbe, 0x62, 0x4b, 0xd8, 0xfc, 0xb5, 0xb5, 0xf5, 0x55, 0xa0, 0x28, 0xd6, 0x5a, 0x9c, 0x5b, 0x58, 0xbd, 0x6e, 0x97, 0xba, 0xee, 0x9e, 0xc3, 0x69, 0x5e, 0xa9, 0x6c, 0x5c, 0x5a, 0x05, 0x3a, 0xf5, 0x6a, 0xb3, 0xc3, 0x47, 0x96, 0xe7, 0x2a, 0xf3, 0x8b, 0x1b, 0x0b, 0xe5, 0x2b, 0x4b, 0xcb, 0x4b, 0x95, 0xf2, 0xda, 0xba, 0x9a, 0x7a, 0x2b, 0x97, 0x4a, 0x8d, 0x5c, 0x9e, 0x5b, 0x2e, 0x5f, 0x9d, 0x5b, 0x90, 0x42, 0x55, 0x56, 0xaf, 0xcd, 0x2f, 0xc2, 0x3d, 0xef, 0x00, 0xa9, 0xab, 0x8b, 0x73, 0xa5, 0xe9, 0xd7, 0xa7, 0x90, 0xca, 0x2d, 0x81, 0x71, 0x2b, 0x95, 0x9a, 0x5f, 0x2c, 0xcf, 0x7f, 0x66, 0x63, 0xa5, 0x7c, 0x7d, 0xe3, 0x4d, 0xa0, 0xb6, 0xb4, 0xba, 0xc2, 0x09, 0xa6, 0x56, 0x56, 0x37, 0xd6, 0x57, 0xaf, 0xad, 0x2c, 0x88, 0x85, 0x53, 0x97, 0x97, 0x2e, 0x6d, 0x5c, 0x29, 0xaf, 0x5c, 0xae, 0x2c, 0x96, 0x0a, 0x53, 0xf6, 0xc4, 0x84, 0xdd, 0x68, 0xd9, 0x1d, 0xa7, 0xd6, 0x6e, 0x6d, 0x75, 0x52, 0xeb, 0xab, 0x97, 0x2a, 0xd7, 0xe7, 0xd6, 0xca, 0x1b, 0x6b, 0xe5, 0x95, 0x85, 0x32, 0xea, 0x4a, 0x22, 0xbd, 0xb9, 0xfe, 0xb9, 0x95, 0x79, 0x41, 0x6e, 0x7e, 0xad, 0xb2, 0xb1, 0xbc, 0xba, 0xb2, 0x54, 0x59, 0x5d, 0xd3, 0x28, 0xae, 0xcf, 0xcf, 0x5d, 0x29, 0x97, 0x8a, 0xa9, 0x6b, 0x4b, 0xf2, 0x76, 0x26, 0x95, 0x9a, 0x88, 0x2f, 0xa9, 0xfa, 0x5e, 0xab, 0xd6, 0x6d, 0xb4, 0x5b, 0x76, 0x65, 0x69, 0x3e, 0x93, 0x4d, 0x8d, 0xd4, 0x9a, 0x1d, 0x6c, 0x9a, 0xed, 0x5a, 0xb5, 0x69, 0x37, 0xab, 0x9b, 0x4e, 0xb3, 0x94, 0xae, 0xec, 0x34, 0x3a, 0x36, 0xfc, 0x75, 0x0e, 0x3a, 0x5d, 0xe7, 0x86, 0x0d, 0x2c, 0xd6, 0x1b, 0xdb, 0x7b, 0x6e, 0x95, 0xe3, 0xd5, 0xaa, 0x6e, 0xd7, 0x6d, 0x6c, 0x6d, 0x3b, 0x69, 0x85, 0xd5, 0x69, 0xbc, 0xe5, 0x94, 0x76, 0xdd, 0x46, 0xab, 0x9b, 0xe1, 0x04, 0x72, 0x53, 0xb9, 0x89, 0x0b, 0x40, 0x53, 0x1f, 0xca, 0x14, 0x66, 0xa6, 0x26, 0x70, 0x62, 0x76, 0x72, 0xb2, 0x90, 0xcb, 0x4c, 0x17, 0x2f, 0xc0, 0x14, 0xb8, 0xcd, 0xa6, 0x9c, 0xd6, 0x56, 0x8a, 0xcb, 0x86, 0x76, 0x2b, 0xaf, 0x71, 0xb7, 0x02, 0x35, 0x56, 0xca, 0x9f, 0x2d, 0x7d, 0xfe, 0xf3, 0xa0, 0xe6, 0xd7, 0x6e, 0x3a, 0x6e, 0x07, 0x17, 0x9e, 0x9e, 0x9e, 0x82, 0x6e, 0xb5, 0x0b, 0xab, 0x6f, 0xee, 0x75, 0x1d, 0xfb, 0xa6, 0x53, 0x2b, 0xda, 0xdb, 0xbb, 0x7b, 0x1b, 0x6f, 0x3a, 0x6e, 0xd7, 0xd9, 0xbf, 0x18, 0x06, 0x16, 0x38, 0xb0, 0xe2, 0xec, 0xcf, 0xb7, 0xdb, 0xee, 0x56, 0x04, 0x3c, 0xc3, 0xc1, 0xf3, 0xed, 0x66, 0xdb, 0x45, 0xd8, 0x5e, 0xab, 0x51, 0x6f, 0xbb, 0x37, 0xec, 0x1b, 0xd5, 0xae, 0x80, 0x2c, 0xb7, 0xb7, 0x9c, 0xe6, 0x9b, 0x0d, 0xa7, 0x77, 0xd5, 0x6d, 0xff, 0x82, 0xc3, 0x75, 0xb6, 0x5c, 0x05, 0x7c, 0xbe, 0xd0, 0xcd, 0xaa, 0x7b, 0xd0, 0x68, 0x6d, 0x0b, 0x3a, 0x35, 0x45, 0x43, 0x1b, 0x2d, 0xd8, 0x5d, 0x6d, 0xe1, 0x9b, 0xed, 0xc6, 0x16, 0x50, 0x6e, 0xb4, 0x32, 0x78, 0x97, 0x55, 0xee, 0xc4, 0x11, 0xed, 0x52, 0x90, 0x91, 0x11, 0x85, 0x08, 0x00, 0x24, 0x94, 0xd1, 0xa5, 0xc8, 0xf2, 0x19, 0xdb, 0xcd, 0x8d, 0xab, 0xed, 0x4e, 0x83, 0x9b, 0xa3, 0x94, 0xcc, 0xac, 0x3d, 0xc6, 0x79, 0xcc, 0xf8, 0x7a, 0xca, 0xd9, 0xd3, 0xf9, 0x29, 0x4e, 0xe7, 0x56, 0x6a, 0xe4, 0x0b, 0x5f, 0x00, 0x27, 0xbe, 0xba, 0xf4, 0xd9, 0xf2, 0x15, 0xa3, 0xb2, 0x27, 0x27, 0x77, 0x5d, 0xa7, 0xd6, 0xe0, 0x23, 0x3b, 0x8d, 0xed, 0x9d, 0x5d, 0xbb, 0xde, 0x6c, 0x57, 0xbb, 0x89, 0xb2, 0x2a, 0x45, 0x76, 0xaa, 0x37, 0x76, 0x9b, 0x8e, 0x5b, 0x58, 0xb0, 0x3b, 0xed, 0x3d, 0xb7, 0xe6, 0xe8, 0x30, 0x4e, 0xc5, 0xee, 0xba, 0xdb, 0x1b, 0xfb, 0xe6, 0xe1, 0x03, 0xf3, 0x70, 0xcf, 0x3c, 0xbc, 0x13, 0x1d, 0xee, 0xd4, 0x5c, 0xd3, 0x6c, 0x1c, 0x86, 0xd9, 0x5c, 0x34, 0xbb, 0x7c, 0x63, 0xaf, 0x59, 0xed, 0x3a, 0x5b, 0x10, 0x88, 0xbb, 0x7b, 0x5d, 0xdb, 0x75, 0x3a, 0xed, 0xe6, 0x1e, 0xaa, 0x2e, 0x8f, 0xf2, 0xa1, 0x5c, 0x30, 0x54, 0xe2, 0x36, 0x28, 0x9c, 0xbf, 0x90, 0x9f, 0xca, 0x4d, 0xcf, 0xcc, 0x70, 0xd5, 0x09, 0xf4, 0xc5, 0xaa, 0xbb, 0xd5, 0x72, 0x3a, 0x1d, 0xbb, 0x5d, 0x07, 0xba, 0xd5, 0x56, 0xb3, 0xd1, 0x72, 0xf2, 0x02, 0x64, 0x4f, 0xbc, 0x9e, 0x9f, 0x02, 0xd3, 0x74, 0xda, 0xf5, 0xae, 0x18, 0x99, 0x98, 0xbe, 0xc0, 0x47, 0x6e, 0x38, 0x5b, 0x8d, 0xbd, 0x1b, 0x30, 0x26, 0xf8, 0xd9, 0x01, 0x1a, 0xeb, 0x80, 0x5b, 0x42, 0x04, 0x13, 0xe1, 0xdd, 0xc6, 0xbe, 0xd3, 0xec, 0xf0, 0x54, 0x11, 0x5c, 0x62, 0xa2, 0x10, 0x5e, 0x61, 0x86, 0x0f, 0x20, 0xc5, 0x00, 0xf9, 0xab, 0x8d, 0xfd, 0xd2, 0x44, 0xd1, 0xa7, 0xbe, 0xd0, 0xe8, 0xec, 0x36, 0xab, 0x07, 0x76, 0xaf, 0xea, 0xee, 0x4a, 0x5a, 0x53, 0x1c, 0xb3, 0xd5, 0x6e, 0x39, 0xa2, 0x0f, 0x0e, 0x32, 0x29, 0x04, 0x70, 0xf6, 0xbb, 0xae, 0x73, 0xc3, 0x51, 0xfa, 0x40, 0x1c, 0xa1, 0x10, 0x9c, 0x72, 0x61, 0x06, 0x75, 0x02, 0x37, 0x33, 0xaf, 0xa3, 0x5a, 0x6c, 0xb9, 0xc0, 0xdc, 0x8d, 0xf6, 0x5e, 0xab, 0xcb, 0xb5, 0xb2, 0x53, 0xdd, 0x6a, 0xf7, 0xc0, 0xf1, 0x3b, 0x5f, 0xcc, 0x7b, 0x3c, 0x61, 0x6f, 0xa1, 0xea, 0x7e, 0xb1, 0x34, 0x95, 0x3f, 0x7f, 0x31, 0x30, 0x7a, 0x05, 0x3c, 0xac, 0x5b, 0x9a, 0xc6, 0x61, 0x4e, 0x69, 0xe2, 0x19, 0x15, 0xc9, 0x57, 0x67, 0xed, 0xf2, 0x1b, 0x76, 0xb7, 0x6d, 0x5f, 0x01, 0x25, 0x56, 0x5d, 0x29, 0xfa, 0x5c, 0xa7, 0xb3, 0x87, 0x6e, 0xbc, 0xd7, 0xc1, 0x7f, 0xc5, 0x94, 0x83, 0x5d, 0xf0, 0x09, 0x70, 0xe9, 0xee, 0x1e, 0xd8, 0xdf, 0xee, 0x62, 0x32, 0xec, 0xec, 0xb4, 0xf7, 0x9a, 0x5b, 0xa0, 0xa2, 0xae, 0xbd, 0xe9, 0xd8, 0x2d, 0xc7, 0xd9, 0x72, 0xb6, 0x7c, 0x91, 0x2a, 0x6d, 0x41, 0x73, 0x3a, 0x23, 0xfa, 0xb5, 0xec, 0xdb, 0xae, 0x03, 0xd8, 0xad, 0x4c, 0x6d, 0x16, 0xc4, 0x9c, 0x9a, 0x99, 0x9a, 0x39, 0x9f, 0xfd, 0x74, 0x6d, 0x72, 0xba, 0x90, 0xff, 0xd9, 0xc2, 0xcf, 0xed, 0xb6, 0x7b, 0x99, 0x4c, 0x6d, 0x1c, 0xc6, 0xcf, 0x9f, 0xcf, 0x4e, 0x4e, 0x63, 0x93, 0x2b, 0xe4, 0x67, 0xb2, 0x17, 0x6f, 0x09, 0x35, 0x17, 0x3d, 0x7a, 0x19, 0xde, 0xf3, 0xa8, 0xf1, 0x8c, 0x97, 0xf1, 0x17, 0xab, 0xe5, 0xdd, 0x6c, 0x4e, 0xef, 0x6e, 0x07, 0xbb, 0x9b, 0x59, 0xa4, 0x29, 0xe4, 0x14, 0xa3, 0x28, 0x3e, 0xca, 0xf8, 0x6c, 0x85, 0x5f, 0x77, 0xb7, 0x37, 0x4d, 0xa2, 0x83, 0x84, 0x53, 0xc5, 0xe9, 0xe2, 0xd4, 0xeb, 0x9f, 0xae, 0x8d, 0x09, 0xd1, 0xb9, 0xb0, 0x63, 0xa8, 0x80, 0x5a, 0x6e, 0x2a, 0x3f, 0x33, 0x7d, 0xe1, 0xc2, 0x85, 0xec, 0x84, 0x50, 0x84, 0x2e, 0x3d, 0x12, 0x8c, 0x91, 0x5d, 0xac, 0x25, 0x25, 0x57, 0x9d, 0x6d, 0xbd, 0xa3, 0x4b, 0xbd, 0x02, 0x32, 0x3b, 0x9d, 0xae, 0xed, 0xa8, 0x48, 0x17, 0x49, 0xc9, 0xde, 0x6e, 0xdc, 0x74, 0x5a, 0x22, 0x25, 0xa0, 0xe4, 0xbb, 0x6d, 0x78, 0x50, 0xc1, 0xbf, 0x32, 0xa5, 0x56, 0x5b, 0x5c, 0x03, 0x4e, 0x13, 0x7c, 0xb8, 0xde, 0x71, 0xba, 0x4a, 0x5b, 0xcd, 0x4e, 0xdb, 0x7e, 0xcb, 0x71, 0xdb, 0x3f, 0x83, 0x91, 0x89, 0x31, 0xef, 0x3a, 0x8e, 0xca, 0x15, 0x45, 0xfb, 0x92, 0xd3, 0xad, 0xed, 0x64, 0x78, 0x98, 0x00, 0xa5, 0x1c, 0xbf, 0x81, 0x69, 0x59, 0x9e, 0xe9, 0x61, 0xa4, 0x84, 0x1a, 0x6a, 0xbb, 0x19, 0xb8, 0x1d, 0x03, 0xa6, 0xc6, 0x11, 0x36, 0xce, 0x63, 0x09, 0x02, 0x01, 0xb4, 0x71, 0x3e, 0x9b, 0x9d, 0x84, 0x71, 0x9e, 0xe0, 0xa5, 0xcc, 0x9e, 0x1f, 0x4c, 0xe7, 0x0b, 0x90, 0xc8, 0xa5, 0x55, 0x0a, 0x0b, 0x19, 0x91, 0x51, 0x73, 0x40, 0x2a, 0xbf, 0x7f, 0x90, 0xe3, 0xb9, 0x25, 0x9b, 0x07, 0xf9, 0x7d, 0xc9, 0x21, 0xca, 0xbb, 0xd5, 0x56, 0xcd, 0xc1, 0xcc, 0xe1, 0x49, 0x2f, 0x93, 0x09, 0x38, 0x41, 0x4b, 0x2a, 0x86, 0x8b, 0xe9, 0xa5, 0x3b, 0x44, 0xf2, 0x24, 0xc8, 0xbe, 0x8d, 0x4c, 0x4b, 0x6e, 0x2f, 0x4a, 0x8e, 0x26, 0x32, 0xc8, 0xff, 0x84, 0x27, 0x49, 0x36, 0x3b, 0xa1, 0x44, 0xc8, 0x0a, 0x13, 0x8e, 0x8c, 0xc8, 0x1c, 0xb2, 0x60, 0x5f, 0xae, 0xee, 0x75, 0x3a, 0x8d, 0x6a, 0xcb, 0xf7, 0x15, 0x1c, 0x91, 0x8e, 0x82, 0x3a, 0x52, 0x39, 0xb9, 0xda, 0x74, 0x3c, 0x3b, 0x3b, 0xfb, 0xbb, 0x85, 0x0c, 0x1f, 0x1a, 0xc3, 0xb5, 0x71, 0x0d, 0x4f, 0xa8, 0xe2, 0x44, 0xb7, 0xba, 0xeb, 0x91, 0xb5, 0xeb, 0x8d, 0x66, 0xd7, 0x71, 0xed, 0x6a, 0xb3, 0x0d, 0x36, 0xdc, 0x69, 0xbb, 0x6f, 0xd9, 0x2a, 0x3f, 0x72, 0x83, 0x2c, 0xc2, 0x48, 0xd1, 0x37, 0x88, 0x58, 0xcc, 0xb3, 0x08, 0x9f, 0xb2, 0x59, 0x12, 0x56, 0x53, 0x06, 0xcb, 0x4c, 0x80, 0x87, 0xe6, 0x70, 0x8e, 0x78, 0xd0, 0x0a, 0x1f, 0x0c, 0x4f, 0xc2, 0x7c, 0x19, 0x9e, 0xb4, 0x15, 0x99, 0x14, 0xa4, 0x24, 0x56, 0xdf, 0xea, 0x74, 0x4b, 0x5c, 0xc9, 0x28, 0x56, 0x9e, 0x3f, 0xfb, 0x50, 0xae, 0xf9, 0x76, 0x0b, 0x9e, 0xbb, 0x00, 0x56, 0x46, 0x03, 0x0b, 0xf5, 0x1c, 0xcc, 0x86, 0x79, 0x1f, 0x97, 0xeb, 0xa4, 0x24, 0x33, 0xba, 0x46, 0xb3, 0xb7, 0x59, 0xe2, 0x6a, 0x05, 0xda, 0x9c, 0x7b, 0xa1, 0x4e, 0x7d, 0x42, 0xcd, 0x9b, 0x80, 0x49, 0xc7, 0x30, 0x61, 0xcb, 0x9f, 0x10, 0xa2, 0x00, 0xcc, 0xad, 0x09, 0xbb, 0x08, 0x65, 0x7b, 0x21, 0x94, 0xd7, 0xdc, 0x34, 0xb3, 0x39, 0xd6, 0xdb, 0x1c, 0xaf, 0x8d, 0xf5, 0x6a, 0xe3, 0x5b, 0x63, 0xbd, 0xad, 0xec, 0x64, 0x06, 0xba, 0xd0, 0x81, 0x5b, 0xcf, 0x74, 0xe7, 0x9f, 0xda, 0x74, 0xe7, 0x93, 0x4d, 0x57, 0x8d, 0x98, 0xae, 0x10, 0xb5, 0xca, 0x8f, 0xce, 0xbe, 0x7c, 0x92, 0x13, 0x99, 0x54, 0xf8, 0x51, 0x39, 0x41, 0xd5, 0x77, 0x82, 0x82, 0xd1, 0xc6, 0x3f, 0x4c, 0x2f, 0x91, 0x13, 0x1c, 0x7f, 0x42, 0xe1, 0xa3, 0xb8, 0x51, 0x75, 0xac, 0x57, 0x1d, 0x0f, 0xfa, 0xd2, 0xb8, 0x33, 0xd6, 0x73, 0xd0, 0xa1, 0xaa, 0xe3, 0xca, 0xa7, 0xc6, 0x61, 0xc0, 0x73, 0x2b, 0x49, 0x55, 0xed, 0x8d, 0x34, 0x85, 0x09, 0x9e, 0x70, 0x6f, 0x15, 0xeb, 0x47, 0x26, 0x73, 0x1c, 0xe8, 0xf9, 0xd7, 0x13, 0x07, 0x50, 0x72, 0x6a, 0xab, 0xe6, 0x2f, 0x3e, 0xd7, 0x6c, 0xc2, 0xee, 0xc6, 0x4b, 0xa5, 0x3b, 0xf0, 0x38, 0xe0, 0x6e, 0xcc, 0x33, 0xac, 0x53, 0xaf, 0xc3, 0x3e, 0x5c, 0xa4, 0x5c, 0xcf, 0xaf, 0x2b, 0x6e, 0x43, 0xcb, 0xaf, 0x9a, 0x2f, 0x8b, 0x5c, 0x85, 0x3c, 0x4e, 0xa8, 0xdd, 0xb9, 0xf2, 0x60, 0x11, 0x0b, 0x08, 0x42, 0xbf, 0x0c, 0xf8, 0xad, 0x8f, 0xe5, 0xed, 0xe9, 0x7d, 0x7f, 0xe0, 0xa2, 0x07, 0x29, 0x7a, 0xae, 0xe0, 0xc1, 0x7c, 0x92, 0x9e, 0x17, 0xf8, 0x30, 0x0f, 0x4f, 0xaa, 0x23, 0x68, 0x9f, 0xc0, 0xa3, 0xa6, 0xed, 0xf2, 0x27, 0xa7, 0xb6, 0x13, 0x06, 0x7c, 0x7c, 0x8e, 0xc2, 0xdb, 0x9d, 0x18, 0xc5, 0x67, 0x25, 0xc4, 0xfb, 0xee, 0x4e, 0xd5, 0x7b, 0xdc, 0x5c, 0x87, 0xdd, 0x64, 0x48, 0x1d, 0xea, 0x91, 0x03, 0xfe, 0x83, 0x6c, 0x5f, 0xc4, 0xc3, 0x00, 0x39, 0x3e, 0xe6, 0x6d, 0x3c, 0xc7, 0x91, 0xbd, 0xfc, 0xc1, 0x18, 0xff, 0x37, 0x3b, 0xc6, 0x37, 0xb2, 0xfb, 0x39, 0x0f, 0xb0, 0xcf, 0x01, 0xfb, 0x12, 0x70, 0x10, 0x10, 0x01, 0xe9, 0xc0, 0xb3, 0x6a, 0x1c, 0xf7, 0x9e, 0x8a, 0xff, 0xf5, 0xe0, 0x2e, 0x95, 0xeb, 0x76, 0x19, 0x3a, 0x51, 0xd6, 0xf2, 0xfb, 0xe3, 0x25, 0xb1, 0x34, 0xdf, 0x4f, 0x2b, 0x43, 0x20, 0x66, 0x89, 0xef, 0x4f, 0xd4, 0xde, 0x36, 0x17, 0xb9, 0x11, 0x5c, 0x70, 0x1a, 0xa5, 0xba, 0x5b, 0xad, 0x75, 0x05, 0xab, 0x93, 0x17, 0x94, 0x8e, 0x1b, 0x75, 0x31, 0x02, 0xbb, 0xa6, 0x62, 0xb1, 0x98, 0xe5, 0xdc, 0xb8, 0x25, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0xdb, 0xa6, 0x89, 0x1c, 0xb2, 0x19, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xc5, 0x5b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xcd, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x25, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0xbb, 0x25, 0x78, 0x2f, 0xbd, 0xe4, 0x56, 0xb7, 0xf9, 0xab, 0x20, 0x6c, 0x4c, 0xc4, 0xd6, 0x80, 0xbf, 0xe5, 0xe5, 0xc4, 0x5b, 0x9d, 0x10, 0x95, 0x4f, 0xce, 0x1f, 0x94, 0xf8, 0xcb, 0xd8, 0x84, 0xec, 0xf1, 0x3d, 0xff, 0x88, 0x52, 0x79, 0x89, 0xfb, 0x06, 0x07, 0x4d, 0x7a, 0x54, 0x7a, 0x82, 0xca, 0x4e, 0x56, 0xbc, 0x82, 0x8d, 0x78, 0xcb, 0xc1, 0x9b, 0x33, 0xee, 0x7e, 0x4a, 0x18, 0x5e, 0x68, 0xaf, 0x31, 0x6e, 0xbe, 0x10, 0x37, 0xde, 0xab, 0xb3, 0x87, 0x23, 0x5e, 0xb0, 0x67, 0xe4, 0xae, 0x32, 0x13, 0x26, 0x97, 0x0d, 0xbd, 0x29, 0xa7, 0x6e, 0xa5, 0xfe, 0x17, 0x03, 0xd7, 0x01, 0xdf, \ No newline at end of file diff --git a/config.lua b/config.lua index e0a2e8544..f0a212f5e 100644 --- a/config.lua +++ b/config.lua @@ -367,7 +367,7 @@ CRT_SHADER= -- -- --- 000:ff000000fcf00000fccf0000fcccf000fccccf00fcccf000fcffcf000f00f000 +-- 000:ff000000fcf00000fccf0000fcccf000fccccf00fcccf000fcfccf000f0fcf00 -- 001:000f000000fcf00000fcff000ffcccf0fcfccccf0fcccccf00fcccf0000fff00 -- 002:0fff0000fcccf0000fcf00000fcf00000fcf00000fcf0000fcccf0000fff0000 -- 033:00cc000000cc000000cc00000000000000cc0000000000000000000000000000 diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 492ce11e6..ecdc430d2 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -965,12 +965,12 @@ static void onLoadCommandConfirmed(Console* console) commandDone(console); } -typedef void(*ConfirmCallback)(Console* console); +typedef void(*ConsoleConfirmCallback)(Console* console); typedef struct { Console* console; - ConfirmCallback callback; + ConsoleConfirmCallback callback; } CommandConfirmData; static void onConfirm(bool yes, void* data) @@ -986,7 +986,7 @@ static void onConfirm(bool yes, void* data) free(confirmData); } -static void confirmCommand(Console* console, const char** text, s32 rows, ConfirmCallback callback) +static void confirmCommand(Console* console, const char** text, s32 rows, ConsoleConfirmCallback callback) { if(console->args.cli) { @@ -1001,7 +1001,7 @@ static void confirmCommand(Console* console, const char** text, s32 rows, Confir else { CommandConfirmData data = {console, callback}; - showDialog(text, rows, onConfirm, MOVE(data)); + confirmDialog(text, rows, onConfirm, MOVE(data)); } } @@ -1033,15 +1033,13 @@ static void onLoadDemoCommand(Console* console, tic_script_config* script) { static const char* Rows[] = { - "YOU HAVE", - "UNSAVED CHANGES", - "", - "DO YOU REALLY WANT", - "TO LOAD CART?", + "WARNING!", + "You have unsaved changes", + "Do you really want to load cart?", }; LoadDemoConfirmData data = {console, onLoadDemoCommandConfirmed, script}; - showDialog(Rows, COUNT_OF(Rows), onLoadDemoConfirm, MOVE(data)); + confirmDialog(Rows, COUNT_OF(Rows), onLoadDemoConfirm, MOVE(data)); } else { diff --git a/src/studio/screens/dialog.c b/src/studio/screens/dialog.c deleted file mode 100644 index 962ca6b62..000000000 --- a/src/studio/screens/dialog.c +++ /dev/null @@ -1,242 +0,0 @@ -// MIT License - -// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#include "dialog.h" - -static void drawButton(Dialog* dlg, const char* label, s32 x, s32 y, u8 color, void(*callback)(Dialog* dlg), s32 id) -{ - tic_mem* tic = dlg->tic; - - enum {BtnWidth = 20, BtnHeight = 9}; - - tic_rect rect = {x, y, BtnWidth, BtnHeight}; - bool down = false; - bool over = false; - - if(checkMousePos(&rect)) - { - setCursor(tic_cursor_hand); - over = true; - - if(checkMouseDown(&rect, tic_mouse_left)) - { - down = true; - dlg->focus = id; - } - - if(checkMouseClick(&rect, tic_mouse_left)) - callback(dlg); - } - - if(down) - { - tic_api_rect(tic, rect.x, rect.y+1, rect.w, rect.h, tic_color_white); - } - else - { - tic_api_rect(tic, rect.x, rect.y+1, rect.w, rect.h, tic_color_black); - tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, tic_color_white); - } - - s32 size = tic_api_print(tic, label, 0, -TIC_FONT_HEIGHT, 0, false, 1, false); - tic_api_print(tic, label, rect.x + (BtnWidth - size+1)/2, rect.y + (down?3:2), color, false, 1, false); - - if(dlg->focus == id) - { - drawBitIcon(tic_icon_right, rect.x-7, rect.y+2, tic_color_black); - drawBitIcon(tic_icon_right, rect.x-7, rect.y+1, tic_color_white); - } -} - -static void onYes(Dialog* dlg) -{ - dlg->callback(true, dlg->data); - hideDialog(); -} - -static void onNo(Dialog* dlg) -{ - dlg->callback(false, dlg->data); - hideDialog(); -} - -static void processKeyboard(Dialog* dlg) -{ - tic_mem* tic = dlg->tic; - - if(tic->ram.input.keyboard.data == 0) return; - - if(keyWasPressed(tic_key_left)) - { - dlg->focus = (dlg->focus-1) % 2; - playSystemSfx(2); - } - else if(keyWasPressed(tic_key_right) || keyWasPressed(tic_key_tab)) - { - dlg->focus = (dlg->focus+1) % 2; - playSystemSfx(2); - } - else if(keyWasPressed(tic_key_return) || keyWasPressed(tic_key_space)) - { - dlg->focus == 0 ? onYes(dlg) : onNo(dlg); - } -} - -static void drawDialog(Dialog* dlg) -{ - enum {Width = TIC80_WIDTH/2, Height = TIC80_HEIGHT/2-TOOLBAR_SIZE}; - - tic_mem* tic = dlg->tic; - - tic_rect rect = {(TIC80_WIDTH - Width)/2, (TIC80_HEIGHT - Height)/2, Width, Height}; - - rect.x -= dlg->pos.x; - rect.y -= dlg->pos.y; - - tic_rect header = {rect.x, rect.y-(TOOLBAR_SIZE-1), rect.w, TOOLBAR_SIZE}; - - if(checkMousePos(&header)) - { - setCursor(tic_cursor_hand); - - if(checkMouseDown(&header, tic_mouse_left)) - { - if(!dlg->drag.active) - { - dlg->drag.start.x = tic_api_mouse(tic).x + dlg->pos.x; - dlg->drag.start.y = tic_api_mouse(tic).y + dlg->pos.y; - - dlg->drag.active = true; - } - } - } - - if(dlg->drag.active) - { - setCursor(tic_cursor_hand); - - dlg->pos.x = dlg->drag.start.x - tic_api_mouse(tic).x; - dlg->pos.y = dlg->drag.start.y - tic_api_mouse(tic).y; - - tic_rect rect = {0, 0, TIC80_WIDTH, TIC80_HEIGHT}; - if(!checkMouseDown(&rect, tic_mouse_left)) - dlg->drag.active = false; - } - - tic_api_rectb(tic, rect.x, rect.y, rect.w, rect.h, tic_color_white); - tic_api_line(tic, rect.x, rect.y+Height, rect.x+Width-1, rect.y+Height, tic_color_black); - tic_api_rect(tic, rect.x, rect.y-(TOOLBAR_SIZE-2), rect.w, TOOLBAR_SIZE-2, tic_color_white); - tic_api_line(tic, rect.x+1, rect.y-(TOOLBAR_SIZE-1), rect.x+Width-2, rect.y-(TOOLBAR_SIZE-1), tic_color_white); - - { - static const char Label[] = "WARNING!"; - s32 size = tic_api_print(tic, Label, 0, -TIC_FONT_HEIGHT, 0, false, 1, false); - tic_api_print(tic, Label, rect.x + (Width - size)/2, rect.y-(TOOLBAR_SIZE-2), tic_color_dark_grey, false, 1, false); - } - - { - u8 chromakey = 14; - tiles2ram(&tic->ram, &getConfig()->cart->bank0.tiles); - tic_api_spr(tic, 2, rect.x+6, rect.y-4, 2, 2, &chromakey, 1, 1, tic_no_flip, tic_no_rotate); - } - - { - for(s32 i = 0; i < dlg->rows; i++) - { - s32 size = tic_api_print(tic, dlg->text[i], 0, -TIC_FONT_HEIGHT, 0, false, 1, false); - - s32 x = rect.x + (Width - size)/2; - s32 y = rect.y + (TIC_FONT_HEIGHT+1)*(i+1); - tic_api_print(tic, dlg->text[i], x, y+1, tic_color_black, false, 1, false); - tic_api_print(tic, dlg->text[i], x, y, tic_color_white, false, 1, false); - } - } - - drawButton(dlg, "YES", rect.x + (Width/2 - 26), rect.y + 45, tic_color_red, onYes, 0); - drawButton(dlg, "NO", rect.x + (Width/2 + 6), rect.y + 45, tic_color_green, onNo, 1); -} - -static void tick(Dialog* dlg) -{ - dlg->ticks++; - - processKeyboard(dlg); - - if(!dlg->init) - { - playSystemSfx(0); - - dlg->init = true; - } - - tic_mem* tic = dlg->tic; - drawBGAnimation(tic, dlg->ticks); - - VBANK(tic, 1) - { - tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_yellow); - memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); - drawDialog(dlg); - } -} - -static void scanline(tic_mem* tic, s32 row, void* data) -{ - Dialog* dlg = (Dialog*)data; - - drawBGAnimationScanline(tic, row); -} - -static void escape(Dialog* dlg) -{ - dlg->callback(false, dlg->data); - hideDialog(); -} - -void initDialog(Dialog* dlg, tic_mem* tic, const char** text, s32 rows, DialogCallback callback, void* data) -{ - *dlg = (Dialog) - { - .init = false, - .tic = tic, - .tick = tick, - .scanline = scanline, - .escape = escape, - .ticks = 0, - .callback = callback, - .data = data, - .text = text, - .rows = rows, - .focus = 0, - .pos = {0, 0}, - .drag = - { - .start = {0, 0}, - .active = 0, - }, - }; -} - -void freeDialog(Dialog* dialog) -{ - free(dialog); -} \ No newline at end of file diff --git a/src/studio/screens/dialog.h b/src/studio/screens/dialog.h deleted file mode 100644 index be3b4b3a1..000000000 --- a/src/studio/screens/dialog.h +++ /dev/null @@ -1,56 +0,0 @@ -// MIT License - -// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#pragma once - -#include "studio/studio.h" - -typedef struct Dialog Dialog; - -struct Dialog -{ - tic_mem* tic; - - bool init; - DialogCallback callback; - void* data; - const char** text; - s32 rows; - s32 ticks; - - u32 focus; - - tic_point pos; - - struct - { - tic_point start; - bool active; - } drag; - - void(*tick)(Dialog* Dialog); - void (*scanline)(tic_mem* tic, s32 row, void* data); - void(*escape)(Dialog* Dialog); -}; - -void initDialog(Dialog* dialog, tic_mem* tic, const char** text, s32 rows, DialogCallback callback, void* data); -void freeDialog(Dialog* dialog); diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index 6b6c191e4..8f49d0cf0 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -21,533 +21,397 @@ // SOFTWARE. #include "menu.h" +#include "studio/studio.h" #include "studio/fs.h" -static void resumeGame(Menu* menu) -{ - hideGameMenu(); -} +#include -static void resetGame(Menu* menu) +typedef struct { - tic_mem* tic = menu->tic; + s32 start; + s32 end; + s32 time; - tic_api_reset(tic); + s32 *value; - setStudioMode(TIC_RUN_MODE); -} + s32(*factor)(s32 d); +} Anim; -static void gamepadConfig(Menu* menu) +typedef struct { - playSystemSfx(2); - menu->mode = GAMEPAD_MENU_MODE; - menu->gamepad.tab = 0; -} + void(*done)(Menu *menu); -static void closeGame(Menu* menu) -{ - exitGameMenu(); -} + s32 time; + s32 tick; -static void exitStudioLocal(Menu* menu) -{ - exitStudio(); -} + s32 count; + Anim* items; +} Movie; -#if defined(CRT_SHADER_SUPPORT) -static void crtMonitor(Menu* menu) -{ - switchCrtMonitor(); -} -#endif +#define ANIM_STATES(macro) \ + macro(idle) \ + macro(start) \ + macro(up) \ + macro(down) \ + macro(close) -static const struct {const char* label; void(*const handler)(Menu*);} MenuItems[] = -{ - {"RESUME GAME", resumeGame}, - {"RESET GAME", resetGame}, - {"GAMEPAD CONFIG", gamepadConfig}, -#if defined(CRT_SHADER_SUPPORT) - {"CRT MONITOR", crtMonitor}, -#endif - {"", NULL}, -#if defined(BUILD_EDITORS) - {"CLOSE GAME", closeGame}, -#endif - {"QUIT TIC-80", exitStudioLocal}, -}; - -#define MENU_ITEMS_COUNT (COUNT_OF(MenuItems)) - -#define DIALOG_WIDTH (TIC80_WIDTH / 2) -#define DIALOG_HEIGHT (TIC80_HEIGHT / 2 + (MAX(MENU_ITEMS_COUNT, 6) - 6) * TIC_FONT_HEIGHT) +#define ANIM_MOVIE(name) Movie name; +#define ANIM_FREE(name) FREE(menu->anim.name.items); -static tic_rect getRect(Menu* menu) +struct Menu { - tic_rect rect = {(TIC80_WIDTH - DIALOG_WIDTH) / 2, (TIC80_HEIGHT - DIALOG_HEIGHT) / 2, DIALOG_WIDTH, DIALOG_HEIGHT}; + tic_mem* tic; - rect.x -= menu->pos.x; - rect.y -= menu->pos.y; + s32 ticks; - return rect; -} -static void drawDialog(Menu* menu) -{ - tic_rect rect = getRect(menu); + MenuItem* items; + s32 count; + s32 pos; - tic_mem* tic = menu->tic; + void* data; - tic_rect header = {rect.x, rect.y - (TOOLBAR_SIZE - 1), rect.w, TOOLBAR_SIZE}; - - if(checkMousePos(&header)) + struct { - setCursor(tic_cursor_hand); + s32 pos; + s32 top; + s32 bottom; + s32 cursor; + s32 offset; - if(checkMouseDown(&header, tic_mouse_left)) - { - if(!menu->drag.active) - { - menu->drag.start.x = tic_api_mouse(tic).x + menu->pos.x; - menu->drag.start.y = tic_api_mouse(tic).y + menu->pos.y; + Movie* movie; - menu->drag.active = true; - } - } - } + ANIM_STATES(ANIM_MOVIE) - if(menu->drag.active) - { - setCursor(tic_cursor_hand); + } anim; +}; - menu->pos.x = menu->drag.start.x - tic_api_mouse(tic).x; - menu->pos.y = menu->drag.start.y - tic_api_mouse(tic).y; +#define BG_ANIM_COLOR tic_color_dark_grey - tic_rect rect = {0, 0, TIC80_WIDTH, TIC80_HEIGHT}; - if(!checkMouseDown(&rect, tic_mouse_left)) - menu->drag.active = false; - } +enum +{ + Up, Down, Left, Right, A, B, X, Y +}; - rect = getRect(menu); +enum{TextMargin = 2, ItemHeight = TIC_FONT_HEIGHT + TextMargin * 2}; +enum{Hold = KEYBOARD_HOLD, Period = ItemHeight}; - tic_api_rectb(tic, rect.x, rect.y, rect.w, rect.h, tic_color_white); - tic_api_line(tic, rect.x, rect.y+DIALOG_HEIGHT, rect.x+DIALOG_WIDTH-1, rect.y+DIALOG_HEIGHT, tic_color_black); - tic_api_rect(tic, rect.x, rect.y-(TOOLBAR_SIZE-2), rect.w, TOOLBAR_SIZE-2, tic_color_white); - tic_api_line(tic, rect.x+1, rect.y-(TOOLBAR_SIZE-1), rect.x+DIALOG_WIDTH-2, rect.y-(TOOLBAR_SIZE-1), tic_color_white); +static inline s32 linear(s32 d) +{ + return d; +} - { - static const char Label[] = "GAME MENU"; - s32 size = tic_api_print(tic, Label, 0, -TIC_FONT_HEIGHT, 0, false, 1, false); - tic_api_print(tic, Label, rect.x + (DIALOG_WIDTH - size)/2, rect.y-(TOOLBAR_SIZE-2), tic_color_dark_grey, false, 1, false); - } +static inline s32 easein(s32 d) +{ + return d * d; +} - { - u8 chromakey = 14; - tiles2ram(&tic->ram, &getConfig()->cart->bank0.tiles); - tic_api_spr(tic, 0, rect.x+6, rect.y-4, 2, 2, &chromakey, 1, 1, tic_no_flip, tic_no_rotate); - } +static inline s32 lerp(s32 a, s32 b, s32 d0, s32 d1) +{ + return (b - a) * d0 / d1 + a; } -static void drawTabDisabled(Menu* menu, s32 x, s32 y, s32 id) +static void animTick(Menu *menu) { - enum{Width = 15, Height = 7}; - tic_mem* tic = menu->tic; + Movie* movie = menu->anim.movie; - tic_rect rect = {x, y, Width, Height}; - bool over = false; + for(Anim* it = movie->items, *end = it + movie->count; it != end; ++it) + *it->value = lerp(it->start, it->end, it->factor(movie->tick), it->factor(it->time)); +} - if(menu->gamepad.tab != id && checkMousePos(&rect)) - { - setCursor(tic_cursor_hand); - over = true; +static void processAnim(Menu *menu) +{ + animTick(menu); - if(checkMouseDown(&rect, tic_mouse_left)) - { - menu->gamepad.tab = id; - menu->gamepad.selected = -1; - return; - } - } + Movie* movie = menu->anim.movie; - tic_api_rect(tic, x, y-1, Width, Height+1, tic_color_grey); - tic_api_pix(tic, x, y+Height-1, tic_color_dark_grey, false); - tic_api_pix(tic, x+Width-1, y+Height-1, tic_color_dark_grey, false); + if(movie->tick == movie->time) + movie->done(menu); - { - char buf[] = "#1"; - sprintf(buf, "#%i", id+1); - tic_api_print(tic, buf, x+2, y, (over ? tic_color_white : tic_color_light_grey), false, 1, false); - } + movie->tick++; } -static void drawTab(Menu* menu, s32 x, s32 y, s32 id) +static void resetMovie(Menu *menu, Movie* movie) { - enum{Width = 15, Height = 7}; - tic_mem* tic = menu->tic; + (menu->anim.movie = movie)->tick = 0; + animTick(menu); +} - tic_api_rect(tic, x, y-2, Width, Height+2, tic_color_white); - tic_api_pix(tic, x, y+Height-1, tic_color_black, false); - tic_api_pix(tic, x+Width-1, y+Height-1, tic_color_black, false); - tic_api_rect(tic, x+1, y+Height, Width-2 , 1, tic_color_black); +static void emptyDone() {} - { - char buf[] = "#1"; - sprintf(buf, "#%i", id+1); - tic_api_print(tic, buf, x+2, y, tic_color_dark_grey, false, 1, false); - } +static void menuUpDone(Menu *menu) +{ + menu->pos = (menu->pos + (menu->count - 1)) % menu->count; + menu->anim.pos = 0; + resetMovie(menu, &menu->anim.idle); } -static void drawPlayerButtons(Menu* menu, s32 x, s32 y) +static void menuDownDone(Menu *menu) { - tic_mem* tic = menu->tic; - - u8 chromakey = 0; - - tic_key* codes = getKeymap(); - - enum {Width = 41, Height = TIC_SPRITESIZE, Rows = 4, Cols = 2, MaxChars = 5, Buttons = 8}; - - for(s32 i = 0; i < Buttons; i++) - { - tic_rect rect = {x + i / Rows * (Width+2), y + (i%Rows)*(Height+1), Width, TIC_SPRITESIZE}; - bool over = false; - - s32 index = i+menu->gamepad.tab * Buttons; - - if(checkMousePos(&rect)) - { - setCursor(tic_cursor_hand); + menu->pos = (menu->pos + (menu->count + 1)) % menu->count; + menu->anim.pos = 0; + resetMovie(menu, &menu->anim.idle); +} - over = true; +static void startDone(Menu *menu) +{ + resetMovie(menu, &menu->anim.idle); +} - if(checkMouseClick(&rect, tic_mouse_left)) - { - menu->gamepad.selected = menu->gamepad.selected != index ? index : -1; - } - } +static void closeDone(Menu *menu) +{ + resetMovie(menu, &menu->anim.idle); + menu->items[menu->pos].handler(menu->data); +} - if(menu->gamepad.selected == index && menu->ticks % TIC80_FRAMERATE < TIC80_FRAMERATE / 2) - continue; +static void printShadow(tic_mem* tic, const char* text, s32 x, s32 y, tic_color color) +{ + tic_api_print(tic, text, x, y + 1, tic_color_black, true, 1, false); + tic_api_print(tic, text, x, y, color, true, 1, false); +} - tic_api_spr(tic, 8+i, rect.x, rect.y, 1, 1, &chromakey, 1, 1, tic_no_flip, tic_no_rotate);//&getConfig()->cart->bank0.tiles +static inline bool animIdle(Menu* menu) +{ + return menu->anim.movie == &menu->anim.idle; +} - static const char* const Names[tic_keys_count] = {"...", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "minus", "equals", "leftbracket", "rightbracket", "backslash", "semicolon", "apostrophe", "grave", "comma", "period", "slash", "space", "tab", "return", "backspace", "delete", "insert", "pageup", "pagedown", "home", "end", "up", "down", "left", "right", "capslock", "ctrl", "shift", "alt", "escape", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12"}; +static void drawTopBar(Menu* menu, s32 x, s32 y) +{ + tic_mem* tic = menu->tic; - s32 code = codes[index]; - char label[32]; - strcpy(label, Names[code]); + y += menu->anim.top; - if(strlen(label) > MaxChars) - label[MaxChars] = '\0'; + tic_api_rect(tic, x, y, TIC80_WIDTH, ItemHeight, tic_color_grey); + tic_api_rect(tic, x, y + ItemHeight, TIC80_WIDTH, 1, tic_color_black); - tic_api_print(tic, label, rect.x+10, rect.y+2, (over ? tic_color_grey : tic_color_dark_grey), false, 1, false); - } + static const char Text[] = TIC_NAME_FULL; + printShadow(tic, Text, (TIC80_WIDTH - STRLEN(Text) * TIC_FONT_WIDTH) / 2, y + TextMargin, tic_color_white); } -static void drawGamepadSetupTabs(Menu* menu, s32 x, s32 y) +static void drawBottomBar(Menu* menu, s32 x, s32 y) { - enum{Width = 90, Height = 41, Tabs = TIC_GAMEPADS, TabWidth = 16}; tic_mem* tic = menu->tic; - tic_api_rect(tic, x, y, Width, Height, tic_color_white); - tic_api_pix(tic, x, y, tic_color_dark_blue, false); - tic_api_pix(tic, x+Width-1, y, tic_color_dark_blue, false); - tic_api_pix(tic, x, y+Height-1, tic_color_black, false); - tic_api_pix(tic, x+Width-1, y+Height-1, tic_color_black, false); - tic_api_rect(tic, x+1, y+Height, Width-2 , 1, tic_color_black); + y += menu->anim.bottom; - for(s32 i = 0; i < Tabs; i++) - (menu->gamepad.tab == i ? drawTab : drawTabDisabled)(menu, x + 73 - i*TabWidth, y + 43, i); + tic_api_rect(tic, x, y, TIC80_WIDTH, ItemHeight, tic_color_grey); + tic_api_rect(tic, x, y - 1, TIC80_WIDTH, 1, tic_color_black); - drawPlayerButtons(menu, x + 3, y + 3); + static const char Text[] = TIC_COPYRIGHT; + printShadow(tic, Text, (TIC80_WIDTH - STRLEN(Text) * TIC_FONT_WIDTH) / 2, y + TextMargin, tic_color_white); } -static void drawGamepadMenu(Menu* menu) +static void updateOption(MenuOption* option, s32 val) +{ + option->pos = (option->pos + option->count + val) % option->count; + option->set(option->pos); + option->pos = option->get(); +} + +static void drawMenu(Menu* menu, s32 x, s32 y) { if (getStudioMode() != TIC_MENU_MODE) return; - drawDialog(menu); - tic_mem* tic = menu->tic; - tic_rect dlgRect = getRect(menu); - - static const char Label[] = "BACK"; - - tic_rect rect = {dlgRect.x + 25, dlgRect.y + 56, (sizeof(Label)-1)*TIC_FONT_WIDTH, TIC_FONT_HEIGHT}; - - bool over = false; - bool down = false; - - if(checkMousePos(&rect)) + if(animIdle(menu)) { - setCursor(tic_cursor_hand); - - over = true; - - if(checkMouseDown(&rect, tic_mouse_left)) + if(tic_api_btnp(menu->tic, Up, Hold, Period)) { - down = true; + playSystemSfx(2); + resetMovie(menu, &menu->anim.up); } - if(checkMouseClick(&rect, tic_mouse_left)) + if(tic_api_btnp(menu->tic, Down, Hold, Period)) { - menu->gamepad.selected = -1; - menu->mode = MAIN_MENU_MODE; playSystemSfx(2); - return; + resetMovie(menu, &menu->anim.down); } - } - if(down) - { - tic_api_print(tic, Label, rect.x, rect.y+1, tic_color_light_grey, false, 1, false); - } - else - { - tic_api_print(tic, Label, rect.x, rect.y+1, tic_color_black, false, 1, false); - tic_api_print(tic, Label, rect.x, rect.y, (over ? tic_color_light_grey : tic_color_white), false, 1, false); - } - - { - drawBitIcon(tic_icon_right, rect.x-7, rect.y, tic_color_black); - drawBitIcon(tic_icon_right, rect.x-7, rect.y-1, tic_color_white); - } - - drawGamepadSetupTabs(menu, dlgRect.x+25, dlgRect.y+4); -} - -static void drawMainMenu(Menu* menu) -{ - if (getStudioMode() != TIC_MENU_MODE) - return; - - tic_mem* tic = menu->tic; - - drawDialog(menu); - - tic_rect rect = getRect(menu); - - { - for(s32 i = 0; i < MENU_ITEMS_COUNT; i++) + MenuOption* option = menu->items[menu->pos].option; + if(option) { - if(!*MenuItems[i].label)continue; - - tic_rect label = {rect.x + 22, rect.y + (TIC_FONT_HEIGHT+1)*i + 16, 86, TIC_FONT_HEIGHT+1}; - bool over = false; - bool down = false; - - if(checkMousePos(&label)) + if(tic_api_btnp(menu->tic, Left, Hold, Period)) { - setCursor(tic_cursor_hand); - - over = true; - - if(checkMouseDown(&label, tic_mouse_left)) - { - down = true; - menu->main.focus = i; - } - - if(checkMouseClick(&label, tic_mouse_left)) - { - MenuItems[i].handler(menu); - return; - } + playSystemSfx(2); + updateOption(option, -1); } - const char* text = MenuItems[i].label; - if(down) + if(tic_api_btnp(menu->tic, Right, Hold, Period)) { - tic_api_print(tic, text, label.x, label.y+1, tic_color_light_grey, false, 1, false); - } - else + playSystemSfx(2); + updateOption(option, +1); + } + } + + if(tic_api_btnp(menu->tic, A, -1, -1)) + { + if(option) { - tic_api_print(tic, text, label.x, label.y+1, tic_color_black, false, 1, false); - tic_api_print(tic, text, label.x, label.y, (over ? tic_color_light_grey : tic_color_white), false, 1, false); + playSystemSfx(2); + updateOption(option, +1); } - - if(i == menu->main.focus) + else if(menu->items[menu->pos].handler) { - drawBitIcon(tic_icon_right, label.x-7, label.y, tic_color_black); - drawBitIcon(tic_icon_right, label.x-7, label.y-1, tic_color_white); + playSystemSfx(2); + resetMovie(menu, &menu->anim.close); } - } + } } -} -static void processGamedMenuGamepad(Menu* menu) -{ - if(menu->gamepad.selected < 0) + s32 i = 0; + char buf[TICNAME_MAX]; + for(const MenuItem *it = menu->items, *end = it + menu->count; it != end; ++it, ++i) { - enum - { - Up, Down, Left, Right, A, B, X, Y - }; + s32 len = it->option + ? sprintf(buf, "%s%s", it->label, it->option->values[it->option->pos]) + : sprintf(buf, "%s", it->label); - if(tic_api_btnp(menu->tic, A, -1, -1)) - { - menu->mode = MAIN_MENU_MODE; - playSystemSfx(2); - } + printShadow(tic, buf, x + (TIC80_WIDTH - len * TIC_FONT_WIDTH) / 2 + menu->anim.offset, + y + TextMargin + ItemHeight * (i - menu->pos) - menu->anim.pos, tic_color_white); } } -static void processMainMenuGamepad(Menu* menu) +// BG animation based on DevEd code +void studio_menu_anim(tic_mem* tic, s32 ticks) { - enum{Count = MENU_ITEMS_COUNT, Hold = 30, Period = 5}; + tic_api_cls(tic, TIC_COLOR_BG); - enum - { - Up, Down, Left, Right, A, B, X, Y - }; + enum{Gap = 72}; - if(tic_api_btnp(menu->tic, Up, Hold, Period)) + for(s32 x = 16; x <= 16 * 16; x += 16) { - do - { - if(--menu->main.focus < 0) - menu->main.focus = Count - 1; - - menu->main.focus = menu->main.focus % Count; - } while(!*MenuItems[menu->main.focus].label); + s32 ly = Gap - 8 * 32 * 16 / (x - ticks % 16); - playSystemSfx(2); + tic_api_line(tic, 0, ly, TIC80_WIDTH, ly, BG_ANIM_COLOR); + tic_api_line(tic, 0, TIC80_HEIGHT - ly, + TIC80_WIDTH, TIC80_HEIGHT - ly, BG_ANIM_COLOR); } - if(tic_api_btnp(menu->tic, Down, Hold, Period)) + for(s32 x = -32; x <= 32; x++) { - do - { - menu->main.focus = (menu->main.focus+1) % Count; - } while(!*MenuItems[menu->main.focus].label); + tic_api_line(tic, TIC80_WIDTH / 2 - x * 4, Gap - 16, + TIC80_WIDTH / 2 - x * 24, -16, BG_ANIM_COLOR); - playSystemSfx(2); - } - - if(tic_api_btnp(menu->tic, A, -1, -1)) - { - MenuItems[menu->main.focus].handler(menu); + tic_api_line(tic, TIC80_WIDTH / 2 - x * 4, TIC80_HEIGHT - Gap + 16, + TIC80_WIDTH / 2 - x * 24, TIC80_HEIGHT + 16, BG_ANIM_COLOR); } } -static void saveMapping(Menu* menu) +void studio_menu_anim_scanline(tic_mem* tic, s32 row, void* data) { - tic_fs_saveroot(menu->fs, KEYMAP_DAT_PATH, getKeymap(), KEYMAP_SIZE, true); + s32 dir = row < TIC80_HEIGHT / 2 ? 1 : -1; + s32 val = dir * (TIC80_WIDTH - row * 7 / 2); + tic_rgb* dst = tic->ram.vram.palette.colors + BG_ANIM_COLOR; + + memcpy(dst, &(tic_rgb){val * 3 / 4, val * 4 / 5, val}, sizeof(tic_rgb)); } -static void processKeyboard(Menu* menu) +static void drawCursor(Menu* menu, s32 x, s32 y) { tic_mem* tic = menu->tic; - if(tic->ram.input.keyboard.data == 0) return; + tic_api_rect(tic, x, y - (menu->anim.cursor - ItemHeight) / 2, TIC80_WIDTH, menu->anim.cursor, tic_color_red); +} - if(menu->gamepad.selected < 0) - return; +#define MOVIE_DEF(TIME, DONE, ...) \ +{ \ + .time = TIME, \ + .done = DONE, \ + .count = COUNT_OF(((Anim[])__VA_ARGS__)), \ + .items = MOVE((Anim[])__VA_ARGS__), \ +} - if(keyWasPressed(tic_key_escape)); - else if(anyKeyWasPressed()) +Menu* studio_menu_create(struct tic_mem* tic) +{ + Menu* menu = malloc(sizeof(Menu)); + *menu = (Menu) { - for(s32 i = 0; i < TIC80_KEY_BUFFER; i++) + .tic = tic, + .anim = { - tic_key key = tic->ram.input.keyboard.keys[i]; + .idle = {.done = emptyDone,}, - if(tic_api_keyp(tic, key, -1, -1)) + .start = MOVIE_DEF(10, startDone, { - tic_key* codes = getKeymap(); - codes[menu->gamepad.selected] = key; - saveMapping(menu); - break; - } - } - } + {-10, 0, 10, &menu->anim.top, linear}, + {10, 0, 10, &menu->anim.bottom, linear}, + {0, 10, 10, &menu->anim.cursor, linear}, + {-TIC80_WIDTH, 0, 10, &menu->anim.offset, linear}, + }), - menu->gamepad.selected = -1; -} + .up = MOVIE_DEF(9, menuUpDone, {{0, -9, 9, &menu->anim.pos, easein}}), + .down = MOVIE_DEF(9, menuDownDone, {{0, 9, 9, &menu->anim.pos, easein}}), -static void tick(Menu* menu) -{ - if(getStudioMode() != TIC_MENU_MODE) - return; + .close = MOVIE_DEF(10, closeDone, + { + {0, -10, 10, &menu->anim.top, linear}, + {0, 10, 10, &menu->anim.bottom, linear}, + {10, 0, 10, &menu->anim.cursor, linear}, + {0, TIC80_WIDTH, 10, &menu->anim.offset, linear}, + }), + }, + }; - tic_mem* tic = menu->tic; + return menu; +} - menu->ticks++; +#undef MOVIE_DEF - processKeyboard(menu); +void studio_menu_tick(Menu* menu) +{ + tic_mem* tic = menu->tic; - if(!menu->init) - { + if(menu->ticks == 0) playSystemSfx(0); - menu->init = true; - } - - switch(menu->mode) - { - case MAIN_MENU_MODE: - processMainMenuGamepad(menu); - break; - case GAMEPAD_MENU_MODE: - processGamedMenuGamepad(menu); - break; - } + processAnim(menu); - if (getStudioMode() != TIC_MENU_MODE) return; + if(getStudioMode() != TIC_MENU_MODE) + return; - drawBGAnimation(tic, menu->ticks); + studio_menu_anim(tic, menu->ticks); VBANK(tic, 1) { tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_yellow); memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); - switch(menu->mode) - { - case MAIN_MENU_MODE: - drawMainMenu(menu); - break; - case GAMEPAD_MENU_MODE: - drawGamepadMenu(menu); - break; - } + drawCursor(menu, 0, (TIC80_HEIGHT - ItemHeight) / 2); + drawMenu(menu, 0, (TIC80_HEIGHT - ItemHeight) / 2); + drawTopBar(menu, 0, 0); + drawBottomBar(menu, 0, TIC80_HEIGHT - ItemHeight); } -} -static void scanline(tic_mem* tic, s32 row, void* data) -{ - drawBGAnimationScanline(tic, row); + menu->ticks++; } -void initMenu(Menu* menu, tic_mem* tic, tic_fs* fs) +void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, void* data) { + const s32 size = sizeof menu->items[0] * rows; + *menu = (Menu) { - .init = false, - .fs = fs, - .tic = tic, - .tick = tick, - .scanline = scanline, - .ticks = 0, - .pos = {0, 0}, - .main = - { - .focus = 0, - }, - .gamepad = - { - .tab = 0, - .selected = -1, - }, - .drag = - { - .start = {0, 0}, - .active = 0, - }, - .mode = MAIN_MENU_MODE, + .tic = menu->tic, + .anim = menu->anim, + .items = realloc(menu->items, size), + .data = data, + .count = rows, + .pos = pos, }; + + memcpy(menu->items, items, size); + for(MenuItem *it = menu->items, *end = it + menu->count; it != end; ++it) + if(it->option) + it->option->pos = it->option->get(); + + resetMovie(menu, &menu->anim.start); } -void freeMenu(Menu* menu) +void studio_menu_free(Menu* menu) { + ANIM_STATES(ANIM_FREE); + + FREE(menu->items); free(menu); -} \ No newline at end of file +} diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index 55f7c2325..cfad6875f 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -22,46 +22,33 @@ #pragma once -#include "studio/studio.h" +#include "tic80_types.h" typedef struct Menu Menu; +struct tic_mem; -struct Menu -{ - tic_mem* tic; - struct tic_fs* fs; - - bool init; - s32 ticks; - - struct - { - s32 focus; - } main; +Menu* studio_menu_create(struct tic_mem* tic); +void studio_menu_tick(Menu* menu); - struct - { - u32 tab; - s32 selected; - } gamepad; - - tic_point pos; +typedef struct +{ + const char** values; + s32 count; + s32(*get)(); + void(*set)(s32); + s32 pos; +} MenuOption; + +typedef struct +{ + const char* label; + void(*handler)(void*); - struct - { - tic_point start; - bool active; - } drag; + MenuOption* option; +} MenuItem; - enum - { - MAIN_MENU_MODE, - GAMEPAD_MENU_MODE, - } mode; - - void(*tick)(Menu* Menu); - void (*scanline)(tic_mem* tic, s32 row, void* data); -}; +void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, void* data); +void studio_menu_free(Menu* menu); -void initMenu(Menu* menu, tic_mem* tic, struct tic_fs* fs); -void freeMenu(Menu* menu); +void studio_menu_anim(struct tic_mem* tic, s32 ticks); +void studio_menu_anim_scanline(struct tic_mem* tic, s32 row, void* data); diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 2c28009bc..380fcc88f 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -24,6 +24,7 @@ #include "studio/fs.h" #include "studio/net.h" #include "console.h" +#include "menu.h" #include "ext/gif.h" #include "ext/png.h" @@ -156,9 +157,9 @@ DECLARE_MOVIE(MenuRightShow, MenuMode); DECLARE_MOVIE(MenuLeftHide, MenuLeftShow); DECLARE_MOVIE(MenuRightHide, MenuRightShow); -typedef struct MenuItem MenuItem; +typedef struct SurfItem SurfItem; -struct MenuItem +struct SurfItem { char* label; char* name; @@ -175,7 +176,7 @@ struct MenuItem typedef struct { - MenuItem* items; + SurfItem* items; s32 count; Surf* surf; fs_done_callback done; @@ -232,7 +233,7 @@ static void drawTopToolbar(Surf* surf, s32 x, s32 y) } } -static MenuItem* getMenuItem(Surf* surf) +static SurfItem* getMenuItem(Surf* surf) { return &surf->menu.items[surf->menu.pos]; } @@ -317,10 +318,10 @@ static bool addMenuItem(const char* name, const char* title, const char* hash, s #endif ) { - data->items = realloc(data->items, sizeof(MenuItem) * ++data->count); - MenuItem* item = &data->items[data->count-1]; + data->items = realloc(data->items, sizeof(SurfItem) * ++data->count); + SurfItem* item = &data->items[data->count-1]; - *item = (MenuItem) + *item = (SurfItem) { .name = strdup(name), .hash = hash ? strdup(hash) : NULL, @@ -350,8 +351,8 @@ static bool addMenuItem(const char* name, const char* title, const char* hash, s static s32 itemcmp(const void* a, const void* b) { - const MenuItem* item1 = a; - const MenuItem* item2 = b; + const SurfItem* item1 = a; + const SurfItem* item2 = b; if(item1->dir != item2->dir) return item1->dir ? -1 : 1; @@ -386,7 +387,7 @@ static void resetMenu(Surf* surf) { for(s32 i = 0; i < surf->menu.count; i++) { - MenuItem* item = &surf->menu.items[i]; + SurfItem* item = &surf->menu.items[i]; free(item->name); @@ -408,7 +409,7 @@ static void resetMenu(Surf* surf) static void updateMenuItemCover(Surf* surf, s32 pos, const u8* cover, s32 size) { - MenuItem* item = &surf->menu.items[pos]; + SurfItem* item = &surf->menu.items[pos]; gif_image* image = gif_read_data(cover, size); @@ -470,7 +471,7 @@ static void coverLoaded(const net_get_data* netData) } } -static void requestCover(Surf* surf, MenuItem* item) +static void requestCover(Surf* surf, SurfItem* item) { CoverLoadingData coverLoadingData = {surf, surf->menu.pos}; tic_fs_dir(surf->fs, coverLoadingData.dir); @@ -499,7 +500,7 @@ static void loadCover(Surf* surf) { tic_mem* tic = surf->tic; - MenuItem* item = getMenuItem(surf); + SurfItem* item = getMenuItem(surf); if(item->coverLoading) return; @@ -555,7 +556,7 @@ static void loadCover(Surf* surf) } } -static void initMenuAsync(Surf* surf, fs_done_callback callback, void* calldata) +static void initItemsAsync(Surf* surf, fs_done_callback callback, void* calldata) { resetMenu(surf); @@ -578,9 +579,9 @@ typedef struct char* last; } GoBackDirDoneData; -static void initMenu(Surf* surf) +static void initItems(Surf* surf) { - initMenuAsync(surf, NULL, NULL); + initItemsAsync(surf, NULL, NULL); } static void onGoBackDirDone(void* data) @@ -593,7 +594,7 @@ static void onGoBackDirDone(void* data) for(s32 i = 0; i < surf->menu.count; i++) { - const MenuItem* item = &surf->menu.items[i]; + const SurfItem* item = &surf->menu.items[i]; if(item->dir) { @@ -623,15 +624,15 @@ static void onGoBackDir(Surf* surf) tic_fs_dirback(surf->fs); GoBackDirDoneData goBackDirDoneData = {surf, strdup(last)}; - initMenuAsync(surf, onGoBackDirDone, MOVE(goBackDirDoneData)); + initItemsAsync(surf, onGoBackDirDone, MOVE(goBackDirDoneData)); } static void onGoToDir(Surf* surf) { - MenuItem* item = getMenuItem(surf); + SurfItem* item = getMenuItem(surf); tic_fs_changedir(surf->fs, item->name); - initMenu(surf); + initItems(surf); } static void goBackDir(Surf* surf) @@ -666,7 +667,7 @@ static void onCartLoaded(void* data) static void onPlayCart(Surf* surf) { - MenuItem* item = getMenuItem(surf); + SurfItem* item = getMenuItem(surf); if (item->hash) { @@ -681,7 +682,7 @@ static void onPlayCart(Surf* surf) static void loadCart(Surf* surf) { - MenuItem* item = getMenuItem(surf); + SurfItem* item = getMenuItem(surf); if(tic_tool_has_ext(item->name, PngExt)) { @@ -809,7 +810,7 @@ static void processGamepad(Surf* surf) if(tic_api_btnp(tic, A, -1, -1)) { - MenuItem* item = getMenuItem(surf); + SurfItem* item = getMenuItem(surf); item->dir ? changeDirectory(surf, item->name) : loadCart(surf); @@ -824,7 +825,7 @@ static void processGamepad(Surf* surf) if(tic_api_btnp(tic, Y, -1, -1)) { - MenuItem* item = getMenuItem(surf); + SurfItem* item = getMenuItem(surf); if(!item->dir) { @@ -843,7 +844,7 @@ static void tick(Surf* surf) { if(!surf->init) { - initMenu(surf); + initItems(surf); resetMovie(surf, &MenuModeShowState, NULL); @@ -855,7 +856,7 @@ static void tick(Surf* surf) tic_mem* tic = surf->tic; tic_api_cls(tic, TIC_COLOR_BG); - drawBGAnimation(surf->tic, surf->ticks); + studio_menu_anim(surf->tic, surf->ticks); if (surf->menu.count > 0) { @@ -911,7 +912,7 @@ static void scanline(tic_mem* tic, s32 row, void* data) if(surf->menu.count > 0) { - const MenuItem* item = getMenuItem(surf); + const SurfItem* item = getMenuItem(surf); if(item->palette) { @@ -925,7 +926,7 @@ static void scanline(tic_mem* tic, s32 row, void* data) } } - drawBGAnimationScanline(tic, row); + studio_menu_anim_scanline(tic, row, NULL); } void initSurf(Surf* surf, tic_mem* tic, struct Console* console) diff --git a/src/studio/screens/surf.h b/src/studio/screens/surf.h index 3bb6609f4..d2e40dd7a 100644 --- a/src/studio/screens/surf.h +++ b/src/studio/screens/surf.h @@ -43,7 +43,7 @@ struct Surf s32 pos; s32 anim; s32 anim_target; - struct MenuItem* items; + struct SurfItem* items; s32 count; } menu; diff --git a/src/studio/studio.c b/src/studio/studio.c index b0f5df91b..1d57099ba 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -32,7 +32,6 @@ #include "editors/music.h" #include "screens/console.h" #include "screens/surf.h" -#include "screens/dialog.h" #include "ext/history.h" #include "net.h" #include "wave_writer.h" @@ -61,7 +60,10 @@ #endif #define MD5_HASHSIZE 16 -#define BG_ANIMATION_COLOR tic_color_dark_grey + +#define OPTION_VALUES(...) \ + .values = (const char*[])__VA_ARGS__, \ + .count = COUNT_OF(((const char*[])__VA_ARGS__)) #if defined(BUILD_EDITORS) @@ -122,7 +124,7 @@ static struct tic_key keycodes[KEYMAP_COUNT]; #if defined(BUILD_EDITORS) - EditorMode dialogMode; + EditorMode menuMode; struct { @@ -183,7 +185,6 @@ static struct Console* console; World* world; - Dialog* dialog; Surf* surf; tic_net* net; @@ -225,7 +226,7 @@ static struct .mdate = 0, }, - .dialogMode = TIC_CONSOLE_MODE, + .menuMode = TIC_CONSOLE_MODE, .bank = { @@ -399,55 +400,6 @@ void sfx_stop(tic_mem* tic, s32 channel) tic_api_sfx(tic, -1, 0, 0, -1, channel, MAX_VOLUME, MAX_VOLUME, SFX_DEF_SPEED); } -// BG animation based on DevEd code -void drawBGAnimation(tic_mem* tic, s32 ticks) -{ - tic_api_cls(tic, TIC_COLOR_BG); - - double rx = sin(ticks / 64.0) * 4.5; - double tmp; - double mod = modf(ticks / 16.0, &tmp); - - enum{Gap = 72}; - - for(s32 x = 0; x <= 16; x++) - { - s32 ly = (s32)(Gap - (8 / (x - mod)) * 32); - - tic_api_line(tic, 0, (s32)(ly + rx), TIC80_WIDTH, (s32)(ly - rx), BG_ANIMATION_COLOR); - tic_api_line(tic, 0, (s32)((TIC80_HEIGHT - ly) - rx), TIC80_WIDTH, - (s32)((TIC80_HEIGHT - ly) + rx), BG_ANIMATION_COLOR); - } - - double yp = (Gap - (8 / (16 - mod)) * 32) - rx; - - for(s32 x = -32; x <= 32; x++) - { - s32 yf = (s32)(yp + rx * x / 32 + rx); - - tic_api_line(tic, (s32)((TIC80_WIDTH / 2) - ((x - (rx / 8)) * 4)), yf, - (s32)((TIC80_WIDTH / 2) - ((x + (rx / 16)) * 24)), -16, BG_ANIMATION_COLOR); - - tic_api_line(tic, (s32)((TIC80_WIDTH / 2) - ((x - (rx / 8)) * 4)), TIC80_HEIGHT - yf, - (s32)((TIC80_WIDTH / 2) - ((x + (rx / 16)) * 24)), TIC80_HEIGHT + 16, BG_ANIMATION_COLOR); - } -} - -static void modifyColor(tic_mem* tic, s32 x, u8 r, u8 g, u8 b) -{ - s32 addr = offsetof(tic_ram, vram.palette) + ((x % 16) * 3); - tic_api_poke(tic, addr, r, BITS_IN_BYTE); - tic_api_poke(tic, addr + 1, g, BITS_IN_BYTE); - tic_api_poke(tic, addr + 2, b, BITS_IN_BYTE); -} - -void drawBGAnimationScanline(tic_mem* tic, s32 row) -{ - s32 dir = row < TIC80_HEIGHT / 2 ? 1 : -1; - s32 val = (s32)(dir * (TIC80_WIDTH - row * 3.5f)); - modifyColor(tic, BG_ANIMATION_COLOR, (s32)(val * 0.75), (s32)(val * 0.8), val); -} - char getKeyboardText() { char text; @@ -1012,14 +964,12 @@ void exitStudio() { static const char* Rows[] = { - "YOU HAVE", - "UNSAVED CHANGES", - "", - "DO YOU REALLY WANT", - "TO EXIT?", + "WARNING!", + "You have unsaved changes", + "Do you really want to exit?", }; - showDialog(Rows, COUNT_OF(Rows), exitConfirm, NULL); + confirmDialog(Rows, COUNT_OF(Rows), exitConfirm, NULL); } else #endif @@ -1091,12 +1041,7 @@ void resumeRunMode() } #endif -static void initMenuMode() -{ - initMenu(impl.menu, impl.studio.tic, impl.fs); -} - -void exitGameMenu() +static void exitGameMenu() { if(impl.prevMode == TIC_SURF_MODE) { @@ -1128,7 +1073,6 @@ void setStudioMode(EditorMode mode) { case TIC_START_MODE: case TIC_CONSOLE_MODE: - case TIC_DIALOG_MODE: case TIC_MENU_MODE: break; case TIC_RUN_MODE: @@ -1185,21 +1129,209 @@ static void changeStudioMode(s32 dir) } #endif -void showGameMenu() +static void resetGame() { - tic_core_pause(impl.studio.tic); tic_api_reset(impl.studio.tic); - - initMenuMode(); - impl.mode = TIC_MENU_MODE; + setStudioMode(TIC_RUN_MODE); } -void hideGameMenu() +static void hideGameMenu() { tic_core_resume(impl.studio.tic); impl.mode = TIC_RUN_MODE; } +static void showOptionMenu(); + +static const MenuItem GamepadMenu[] = +{ + {"UP <...>", NULL}, + {"DOWN <...>", NULL}, + {"LEFT <...>", NULL}, + {"RIGHT <...>", NULL}, + {"A <...>", NULL}, + {"B <...>", NULL}, + {"X <...>", NULL}, + {"Y <...>", NULL}, + + {"", NULL}, + {"BACK", showOptionMenu}, +}; + +static void setupGamepadMenu() +{ + studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), 0, NULL); +} + +static s32 optionFullscreenGet() +{ + return tic_sys_fullscreen_get() ? 1 : 0; +} + +static void optionFullscreenSet(s32 pos) +{ + tic_sys_fullscreen_set(pos == 1); +} + +static const char OffValue[] = " "; +static const char OnValue[] = " "; + +static MenuOption FullscreenOption = +{ + OPTION_VALUES({OffValue, OnValue}), + optionFullscreenGet, + optionFullscreenSet, +}; + +#if defined(CRT_SHADER_SUPPORT) +static s32 optionCrtMonitorGet() +{ + return impl.config->data.crt ? 1 : 0; +} + +static void optionCrtMonitorSet(s32 pos) +{ + impl.config->data.crt = pos == 1; +} + +static MenuOption CrtMonitorOption = +{ + OPTION_VALUES({OffValue, OnValue}), + optionCrtMonitorGet, + optionCrtMonitorSet, +}; + +#endif + +static s32 optionVSyncGet() +{ + // !TODO: not impelemnted + return 0; +} + +static void optionVSyncSet(s32 pos) +{ + // !TODO: not impelemnted +} + +static MenuOption VSyncOption = +{ + OPTION_VALUES({OffValue, OnValue}), + optionVSyncGet, + optionVSyncSet, +}; + +// !TODO: temp var +static s32 VolumePos = 15; + +static s32 optionVolumeGet() +{ + // !TODO: not impelemnted + return VolumePos; +} + +static void optionVolumeSet(s32 pos) +{ + // !TODO: not impelemnted + VolumePos = pos; +} + +static MenuOption VolumeOption = +{ + OPTION_VALUES( + { + "<00> ", + "<01> ", + "<02> ", + "<03> ", + "<04> ", + "<05> ", + "<06> ", + "<07> ", + "<08> ", + "<09> ", + "<10> ", + "<11> ", + "<12> ", + "<13> ", + "<14> ", + "<15> ", + }), + optionVolumeGet, + optionVolumeSet, +}; + +// !TODO: temp var +static s32 KeyboardPos = 0; + +static s32 optionKeyboardGet() +{ + // !TODO: not impelemnted + return KeyboardPos; +} + +static void optionKeyboardSet(s32 pos) +{ + // !TODO: not impelemnted + KeyboardPos = pos; +} + +static MenuOption KeyboardOption = +{ + OPTION_VALUES( + { + "", + "", + "", + "", + }), + optionKeyboardGet, + optionKeyboardSet, +}; + +static const MenuItem OptionMenu[] = +{ +#if defined(CRT_SHADER_SUPPORT) + {"CRT MONITOR ", NULL, &CrtMonitorOption}, +#endif + {"VSYNC ", NULL, &VSyncOption}, + {"FULLSCREEN ", NULL, &FullscreenOption}, + {"VOLUME ", NULL, &VolumeOption}, + {"KEYBOARD ", NULL, &KeyboardOption}, + {"SETUP GAMEPAD", setupGamepadMenu}, + {"", NULL}, + {"BACK", showGameMenu}, +}; + +static void showOptionMenu() +{ + enum{Count = COUNT_OF(OptionMenu)}; + studio_menu_init(impl.menu, OptionMenu, Count, Count - 5, NULL); +} + +static const MenuItem GameMenu[] = +{ +#if defined(BUILD_EDITORS) + {"CLOSE GAME", exitGameMenu}, +#endif + {"RESET GAME", resetGame}, + {"RESUME GAME", hideGameMenu}, + {"OPTIONS", showOptionMenu}, + {"", NULL}, + {"QUIT TIC-80", exitStudio}, +}; + +void showGameMenu() +{ + tic_core_pause(impl.studio.tic); + tic_api_reset(impl.studio.tic); + + enum{Count = COUNT_OF(GameMenu)}; + studio_menu_init(impl.menu, GameMenu, Count, Count - 4, NULL); + + impl.mode = TIC_MENU_MODE; +} + static inline bool pointInRect(const tic_point* pt, const tic_rect* rect) { return (pt->x >= rect->x) @@ -1245,23 +1377,65 @@ void setCursor(tic_cursor id) } #if defined(BUILD_EDITORS) -void hideDialog() + +typedef struct +{ + ConfirmCallback callback; + void* data; +} ConfirmData; + +static void confirmHandler(bool yes, void* data) { - if(impl.dialogMode == TIC_RUN_MODE) + if(impl.menuMode == TIC_RUN_MODE) { tic_core_resume(impl.studio.tic); impl.mode = TIC_RUN_MODE; } - else setStudioMode(impl.dialogMode); + else setStudioMode(impl.menuMode); + + ConfirmData* confirmData = data; + SCOPE(free(confirmData)) + { + confirmData->callback(yes, confirmData->data); + } +} + +static void confirmNo(void* data) +{ + confirmHandler(false, data); } -void showDialog(const char** text, s32 rows, DialogCallback callback, void* data) +static void confirmYes(void* data) { - if(impl.mode != TIC_DIALOG_MODE) + confirmHandler(true, data); +} + +void confirmDialog(const char** text, s32 rows, ConfirmCallback callback, void* data) +{ + if(impl.mode != TIC_MENU_MODE) { - initDialog(impl.dialog, impl.studio.tic, text, rows, callback, data); - impl.dialogMode = impl.mode; - setStudioMode(TIC_DIALOG_MODE); + impl.menuMode = impl.mode; + impl.mode = TIC_MENU_MODE; + } + + static const MenuItem Answers[] = + { + {"", NULL}, + {"NO", confirmNo}, + {"YES", confirmYes}, + }; + + s32 count = rows + COUNT_OF(Answers); + MenuItem* items = malloc(sizeof items[0] * count); + SCOPE(free(items)) + { + for(s32 i = 0; i != rows; ++i) + items[i] = (MenuItem){text[i], NULL}; + + memcpy(items + rows, Answers, sizeof Answers); + + studio_menu_init(impl.menu, items, count, count - 2, + MOVE((ConfirmData){callback, data})); } } @@ -1538,7 +1712,7 @@ static inline bool keyWasPressedOnce(s32 key) } #if defined(CRT_SHADER_SUPPORT) -void switchCrtMonitor() +static void switchCrtMonitor() { impl.config->data.crt = !impl.config->data.crt; } @@ -1583,10 +1757,10 @@ static void processShortcuts() { impl.mode == TIC_MENU_MODE ? hideGameMenu() : showGameMenu(); } - else if(keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen(); + else if(keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); else if(keyWasPressedOnce(tic_key_return)) { - if(alt) tic_sys_fullscreen(); + if(alt) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); } #if defined(BUILD_EDITORS) else if(keyWasPressedOnce(tic_key_f7)) setCoverImage(); @@ -1603,7 +1777,7 @@ static void processShortcuts() if(alt) { - if (keyWasPressedOnce(tic_key_return)) tic_sys_fullscreen(); + if (keyWasPressedOnce(tic_key_return)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); #if defined(BUILD_EDITORS) else if(keyWasPressedOnce(tic_key_grave)) setStudioMode(TIC_CONSOLE_MODE); else if(keyWasPressedOnce(tic_key_1)) setStudioMode(TIC_CODE_MODE); @@ -1636,7 +1810,7 @@ static void processShortcuts() } else { - if (keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen(); + if (keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); #if defined(BUILD_EDITORS) else if(keyWasPressedOnce(tic_key_f1)) setStudioMode(TIC_CODE_MODE); else if(keyWasPressedOnce(tic_key_f2)) setStudioMode(TIC_SPRITE_MODE); @@ -1657,12 +1831,6 @@ static void processShortcuts() code->escape(code); return; } - - if(impl.mode == TIC_DIALOG_MODE) - { - impl.dialog->escape(impl.dialog); - return; - } #endif setStudioMode(impl.mode == TIC_CONSOLE_MODE ? impl.prevMode : TIC_CONSOLE_MODE); @@ -1684,7 +1852,6 @@ static void checkChanges() switch(impl.mode) { case TIC_START_MODE: - case TIC_DIALOG_MODE: break; default: { @@ -1698,14 +1865,12 @@ static void checkChanges() { static const char* Rows[] = { - "", - "CART HAS CHANGED!", - "", - "DO YOU WANT", - "TO RELOAD IT?" + "WARNING!", + "The cart has changed!", + "Do you want to reload it?" }; - showDialog(Rows, COUNT_OF(Rows), reloadConfirm, NULL); + confirmDialog(Rows, COUNT_OF(Rows), reloadConfirm, NULL); } else console->updateProject(console); } @@ -1780,7 +1945,6 @@ static void renderStudio() music = &impl.studio.tic->ram.music; break; case TIC_START_MODE: - case TIC_DIALOG_MODE: case TIC_MENU_MODE: case TIC_SURF_MODE: sfx = &impl.config->cart->bank0.sfx; @@ -1815,7 +1979,7 @@ static void renderStudio() { case TIC_START_MODE: impl.start->tick(impl.start); break; case TIC_RUN_MODE: impl.run->tick(impl.run); break; - case TIC_MENU_MODE: impl.menu->tick(impl.menu); break; + case TIC_MENU_MODE: studio_menu_tick(impl.menu); break; #if defined(BUILD_EDITORS) case TIC_CONSOLE_MODE: impl.console->tick(impl.console); break; @@ -1851,7 +2015,6 @@ static void renderStudio() break; case TIC_WORLD_MODE: impl.world->tick(impl.world); break; - case TIC_DIALOG_MODE: impl.dialog->tick(impl.dialog); break; case TIC_SURF_MODE: impl.surf->tick(impl.surf); break; #endif default: break; @@ -2028,13 +2191,12 @@ static void studioTick() tic_blit_callback callback[TIC_MODES_COUNT] = { - [TIC_MENU_MODE] = {impl.menu->scanline, NULL, impl.menu}, + [TIC_MENU_MODE] = {studio_menu_anim_scanline, NULL, impl.menu}, #if defined(BUILD_EDITORS) [TIC_SPRITE_MODE] = {sprite->scanline, NULL, sprite}, [TIC_MAP_MODE] = {map->scanline, NULL, map}, [TIC_WORLD_MODE] = {impl.world->scanline, NULL, impl.world}, - [TIC_DIALOG_MODE] = {impl.dialog->scanline, NULL, impl.dialog}, [TIC_SURF_MODE] = {impl.surf->scanline, NULL, impl.surf}, #endif }; @@ -2094,14 +2256,14 @@ static void studioClose() freeCode (impl.code); freeConsole (impl.console); freeWorld (impl.world); - freeDialog (impl.dialog); freeSurf (impl.surf); #endif freeStart (impl.start); freeRun (impl.run); freeConfig (impl.config); - freeMenu (impl.menu); + + studio_menu_free(impl.menu); } if(impl.tic80local) @@ -2199,13 +2361,12 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.code = calloc(1, sizeof(Code)); impl.console = calloc(1, sizeof(Console)); impl.world = calloc(1, sizeof(World)); - impl.dialog = calloc(1, sizeof(Dialog)); impl.surf = calloc(1, sizeof(Surf)); #endif impl.start = calloc(1, sizeof(Start)); impl.run = calloc(1, sizeof(Run)); - impl.menu = calloc(1, sizeof(Menu)); + impl.menu = studio_menu_create(impl.studio.tic); impl.config = calloc(1, sizeof(Config)); } diff --git a/src/studio/studio.h b/src/studio/studio.h index 8f4bd23cc..13e4f63d5 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -110,7 +110,6 @@ typedef enum TIC_WORLD_MODE, TIC_SFX_MODE, TIC_MUSIC_MODE, - TIC_DIALOG_MODE, TIC_MENU_MODE, TIC_SURF_MODE, @@ -227,10 +226,8 @@ tic_key* getKeymap(); void setSpritePixel(tic_tile* tiles, s32 x, s32 y, u8 color); u8 getSpritePixel(tic_tile* tiles, s32 x, s32 y); -typedef void(*DialogCallback)(bool yes, void* data); -void showDialog(const char** text, s32 rows, DialogCallback callback, void* data); -void hideDialog(); - +typedef void(*ConfirmCallback)(bool yes, void* data); +void confirmDialog(const char** text, s32 rows, ConfirmCallback callback, void* data); bool studioCartChanged(); void playSystemSfx(s32 id); @@ -240,12 +237,7 @@ void gotoCode(); void gotoSurf(); void showGameMenu(); -void hideGameMenu(); -void exitGameMenu(); - void runProject(); -void drawBGAnimation(tic_mem* tic, s32 ticks); -void drawBGAnimationScanline(tic_mem* tic, s32 row); tic_tiles* getBankTiles(); tic_palette* getBankPalette(bool bank); @@ -267,9 +259,4 @@ const char* studioExportSfx(s32 sfx, const char* filename); s32 calcWaveAnimation(tic_mem* tic, u32 index, s32 channel); void map2ram(tic_ram* ram, const tic_map* src); void tiles2ram(tic_ram* ram, const tic_tiles* src); - -#if defined(CRT_SHADER_SUPPORT) -void switchCrtMonitor(); -#endif - -void fadePalette(tic_palette* pal, s32 value); \ No newline at end of file +void fadePalette(tic_palette* pal, s32 value); diff --git a/src/studio/system.h b/src/studio/system.h index 656e63337..fb7613664 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -52,12 +52,12 @@ char* tic_sys_clipboard_get(); void tic_sys_clipboard_free(const char* text); u64 tic_sys_counter_get(); u64 tic_sys_freq_get(); -void tic_sys_fullscreen(); +bool tic_sys_fullscreen_get(); +void tic_sys_fullscreen_set(bool value); void tic_sys_message(const char* title, const char* message); void tic_sys_title(const char* title); void tic_sys_open_path(const char* path); void tic_sys_preseed(); -void tic_sys_poll(); bool tic_sys_keyboard_text(char* text); void tic_sys_update_config(); diff --git a/src/system/baremetalpi/kernel.cpp b/src/system/baremetalpi/kernel.cpp index 2147af1bb..e21cf9d81 100644 --- a/src/system/baremetalpi/kernel.cpp +++ b/src/system/baremetalpi/kernel.cpp @@ -114,7 +114,11 @@ u64 tic_sys_freq_get() return HZ; } -void tic_sys_fullscreen() +void tic_sys_fullscreen_set(bool value) +{ +} + +bool tic_sys_fullscreen_get() { } @@ -142,11 +146,6 @@ void tic_sys_preseed() #endif } -void tic_sys_poll() -{ - -} - void tic_sys_update_config() { diff --git a/src/system/n3ds/main.c b/src/system/n3ds/main.c index fd6d4c71c..9aa06ab70 100644 --- a/src/system/n3ds/main.c +++ b/src/system/n3ds/main.c @@ -190,7 +190,11 @@ u64 tic_sys_freq_get() return SYSCLOCK_ARM11; } -void tic_sys_fullscreen() +void tic_sys_fullscreen_set(bool value) +{ +} + +bool tic_sys_fullscreen_get() { } @@ -212,11 +216,6 @@ void tic_sys_preseed() rand(); } -void tic_sys_poll() -{ - -} - void tic_sys_update_config() { diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index ab816f25a..7f3a5605f 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1016,7 +1016,7 @@ static void handleKeydown(SDL_Keycode keycode, bool down, bool* state) #endif } -void tic_sys_poll() +static void pollEvents() { tic_mem* tic = platform.studio->tic; tic80_input* input = &tic->ram.input; @@ -1337,18 +1337,33 @@ u64 tic_sys_freq_get() return SDL_GetPerformanceFrequency(); } -void tic_sys_fullscreen() +bool tic_sys_fullscreen_get() { #if defined(CRT_SHADER_SUPPORT) if(!platform.studio->config()->soft) { - GPU_SetFullscreen(GPU_GetFullscreen() ? false : true, true); + return GPU_GetFullscreen() ? true : false; + } + else +#endif + { + return SDL_GetWindowFlags(platform.window) & SDL_WINDOW_FULLSCREEN_DESKTOP + ? true : false; + } +} + +void tic_sys_fullscreen_set(bool value) +{ +#if defined(CRT_SHADER_SUPPORT) + if(!platform.studio->config()->soft) + { + GPU_SetFullscreen(value, true); } else #endif { SDL_SetWindowFullscreen(platform.window, - SDL_GetWindowFlags(platform.window) & SDL_WINDOW_FULLSCREEN_DESKTOP ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP); + value ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); } } @@ -1466,7 +1481,7 @@ static void gpuTick() { tic_mem* tic = platform.studio->tic; - tic_sys_poll(); + pollEvents(); if(platform.studio->quit) { @@ -1597,7 +1612,7 @@ static s32 start(s32 argc, char **argv, const char* folder) initGPU(); if(platform.studio->config()->goFullscreen) - tic_sys_fullscreen(); + tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); } SDL_PauseAudioDevice(platform.audio.device, 0); @@ -1606,24 +1621,17 @@ static s32 start(s32 argc, char **argv, const char* folder) emscripten_set_main_loop(emsGpuTick, platform.studio->config()->vsync ? 0 : TIC80_FRAMERATE, 1); #else { - u64 nextTick = 0; const u64 Delta = SDL_GetPerformanceFrequency() / TIC80_FRAMERATE; + u64 nextTick = SDL_GetPerformanceCounter(); while (!platform.studio->quit) { gpuTick(); - if(nextTick == 0) - nextTick = SDL_GetPerformanceCounter(); - else - { - s64 delay = nextTick - SDL_GetPerformanceCounter(); - - if(delay > 0) - SDL_Delay((u32)(delay * 1000 / SDL_GetPerformanceFrequency())); - } + s64 delay = (nextTick += Delta) - SDL_GetPerformanceCounter(); - nextTick += Delta; + if(delay > 0) + SDL_Delay((u32)(delay * 1000 / SDL_GetPerformanceFrequency())); } } #endif diff --git a/src/system/sokol/sokol.c b/src/system/sokol/sokol.c index 14decded7..2d555fe98 100644 --- a/src/system/sokol/sokol.c +++ b/src/system/sokol/sokol.c @@ -89,7 +89,11 @@ u64 tic_sys_freq_get() return 1000000000; } -void tic_sys_fullscreen() +void tic_sys_fullscreen_set(bool value) +{ +} + +bool tic_sys_fullscreen_get() { } @@ -117,11 +121,6 @@ void tic_sys_preseed() #endif } -void tic_sys_poll() -{ - -} - void tic_sys_update_config() { From 1cf11b52ffc2ba23c3c6b05b828d3eb3de736473 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 26 Dec 2021 17:34:21 +0300 Subject: [PATCH 202/379] Added global volume slider #1613 #1748 --- build/assets/config.tic.dat | 2 +- config.lua | 1 + src/defines.h | 17 +++++++++++++++++ src/studio/config.c | 4 +++- src/studio/studio.c | 28 +++++++++++++++++++--------- src/studio/system.h | 1 + 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 6ae99776c..9550b0939 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x12, 0x59, 0x16, 0x49, 0x15, 0x09, 0xad, 0xec, 0x72, 0xb9, 0x18, 0x10, 0x1c, 0x90, 0x88, 0x21, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x13, 0x3b, 0x1d, 0xac, 0x37, 0xb6, 0xf3, 0xb4, 0x44, 0x3b, 0xef, 0x07, 0x84, 0x70, 0xe3, 0xbc, 0x9c, 0x6c, 0x95, 0xf2, 0x7d, 0xfd, 0x98, 0xe9, 0x99, 0xe9, 0x19, 0x4a, 0x6b, 0xd9, 0xde, 0x30, 0xec, 0x61, 0xab, 0xa7, 0xfb, 0xeb, 0xef, 0xeb, 0xef, 0x3d, 0x3d, 0x3d, 0x28, 0x8d, 0x5a, 0x96, 0xf5, 0xdc, 0xbb, 0x9f, 0xb2, 0xfa, 0x0c, 0xca, 0xed, 0xdb, 0xb7, 0xef, 0x1c, 0x1e, 0x1e, 0xde, 0xc1, 0x16, 0xba, 0x77, 0x18, 0xf5, 0x2a, 0x63, 0x83, 0xe1, 0xed, 0xdb, 0x6c, 0x78, 0x78, 0x48, 0x87, 0xb7, 0x7f, 0x83, 0x0e, 0xd9, 0x1d, 0xca, 0xe8, 0x1d, 0x4a, 0x55, 0xe5, 0xf8, 0xa3, 0xa3, 0xa3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x53, 0x15, 0xf1, 0x47, 0x47, 0xd9, 0x30, 0x9d, 0xa6, 0xc3, 0xd1, 0x57, 0x01, 0x3f, 0x47, 0x87, 0x54, 0xd4, 0x01, 0xcd, 0x59, 0x8c, 0xe3, 0x03, 0xee, 0x6c, 0xb1, 0x58, 0x9c, 0xc5, 0x16, 0xba, 0xb3, 0x04, 0x2a, 0xe0, 0xce, 0x4a, 0xfc, 0x74, 0x9a, 0x0d, 0x8b, 0x45, 0x3a, 0x4c, 0x17, 0x00, 0x7f, 0x96, 0x0e, 0x09, 0x54, 0x3a, 0x0b, 0xf8, 0xb3, 0x12, 0xbf, 0xd7, 0xeb, 0x35, 0xeb, 0xf5, 0x7a, 0x13, 0x5b, 0xe8, 0xf2, 0x4a, 0x2c, 0x82, 0x2d, 0xe2, 0xf7, 0x7a, 0x6c, 0x58, 0xaf, 0xd3, 0x61, 0x6f, 0x1b, 0xf0, 0x9b, 0x40, 0xb3, 0x49, 0xa9, 0x05, 0x15, 0xdb, 0xaf, 0x3f, 0x78, 0xf0, 0xe2, 0x03, 0x2c, 0x8f, 0x1e, 0x3e, 0x78, 0x30, 0x1c, 0x3e, 0x78, 0x34, 0x1c, 0x3e, 0xc4, 0x2e, 0xfc, 0xf3, 0xe8, 0x3b, 0xc3, 0xe1, 0x4b, 0x0a, 0xce, 0xc7, 0x01, 0xce, 0xe7, 0x45, 0xe0, 0x0f, 0x25, 0xbe, 0x6c, 0xa1, 0x1f, 0x80, 0x3f, 0x92, 0xf4, 0x1f, 0x49, 0xfc, 0x47, 0x3e, 0xfe, 0xcf, 0xd7, 0xeb, 0x3f, 0x51, 0xbf, 0xb9, 0x5d, 0xaf, 0x6f, 0xdf, 0x14, 0xb5, 0xd7, 0xe3, 0x2d, 0x8c, 0xdc, 0xdc, 0xed, 0xf5, 0x5e, 0xb0, 0xd3, 0xe9, 0x4f, 0xa4, 0x47, 0x5f, 0x4d, 0xa7, 0x5f, 0x7d, 0x25, 0xad, 0xb7, 0x70, 0xf7, 0xca, 0x4f, 0x8d, 0x8e, 0x3e, 0xf7, 0xee, 0xe1, 0x61, 0xea, 0xf0, 0xcb, 0xef, 0x1c, 0xf2, 0xfa, 0xce, 0x97, 0x0f, 0xd5, 0x3d, 0xdc, 0xbd, 0xf3, 0x2b, 0x5f, 0xfa, 0xd2, 0xc8, 0x54, 0xb1, 0x78, 0xae, 0x58, 0x78, 0xad, 0xc8, 0xeb, 0x6b, 0x69, 0xd0, 0x32, 0xb6, 0x85, 0x62, 0x01, 0xfe, 0x45, 0xda, 0xdc, 0xde, 0x68, 0x7b, 0x7e, 0x7d, 0x8d, 0xdf, 0xff, 0x32, 0xf8, 0x01, 0xb3, 0x28, 0xea, 0xb6, 0xcf, 0xee, 0x58, 0x0c, 0x6c, 0x3f, 0xb8, 0x03, 0xf6, 0x3f, 0x94, 0x15, 0xfd, 0xc1, 0xa2, 0x83, 0x21, 0x63, 0xc3, 0x21, 0xb7, 0x37, 0xda, 0x3e, 0x7d, 0x0f, 0x5a, 0xbc, 0xd2, 0xe9, 0x9f, 0x06, 0x3f, 0xf0, 0xf0, 0x73, 0x94, 0x82, 0xed, 0x79, 0xcd, 0xa5, 0x29, 0xe3, 0x7e, 0x30, 0xea, 0xe3, 0x73, 0x7b, 0xa3, 0xed, 0xef, 0xdf, 0xbf, 0x3f, 0x5b, 0x9c, 0x9d, 0xc5, 0x7b, 0xa4, 0xe1, 0xe1, 0xcf, 0x52, 0x0a, 0xb6, 0xa7, 0xf7, 0xa1, 0xce, 0x16, 0x29, 0xe3, 0x7e, 0x90, 0xf6, 0xf1, 0xb9, 0xad, 0xd1, 0xf6, 0x75, 0x6c, 0xbf, 0xc2, 0xef, 0x7f, 0x11, 0xfc, 0xc0, 0xc3, 0x6f, 0x5a, 0x0c, 0x6c, 0x3f, 0x68, 0x82, 0xfd, 0xeb, 0xb2, 0xa2, 0x3f, 0x28, 0x7c, 0x08, 0x03, 0x2b, 0xce, 0x07, 0x70, 0x5c, 0x87, 0x87, 0x7d, 0x20, 0x08, 0x8f, 0xfa, 0x40, 0x00, 0x6e, 0xf0, 0x01, 0x05, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0x38, 0xc2, 0xe3, 0x7c, 0x00, 0xc7, 0x11, 0x1e, 0xe7, 0x03, 0x38, 0x6e, 0x8c, 0x5f, 0x5e, 0xd2, 0xb9, 0x1c, 0xbb, 0x67, 0x8a, 0x5f, 0x80, 0x83, 0x3d, 0xa1, 0xde, 0x83, 0x6a, 0x3d, 0x83, 0xb2, 0x7d, 0xcd, 0x79, 0xc1, 0xfa, 0x21, 0x15, 0x74, 0xae, 0x48, 0x65, 0x84, 0x57, 0x50, 0x7f, 0x11, 0x4b, 0x04, 0xfe, 0xed, 0x17, 0xbd, 0x39, 0xc5, 0x73, 0x96, 0xc5, 0xeb, 0xf7, 0x1e, 0x3f, 0xe6, 0xed, 0x37, 0x5e, 0x7c, 0x50, 0xd4, 0x8b, 0x82, 0xeb, 0xf3, 0xb4, 0x62, 0x7d, 0xcc, 0x8b, 0x1f, 0xbf, 0xd8, 0xde, 0x63, 0xd1, 0xf8, 0xb5, 0x30, 0x66, 0x07, 0x10, 0xbb, 0xdc, 0x07, 0xc2, 0xf1, 0xfb, 0x2c, 0x78, 0x38, 0x7e, 0xfc, 0xd8, 0x3a, 0x2b, 0x67, 0xe5, 0xac, 0xfc, 0x98, 0x0a, 0x21, 0xa2, 0x42, 0x36, 0xa7, 0x84, 0xf1, 0xaa, 0x17, 0xca, 0x08, 0x80, 0xa0, 0x52, 0xcc, 0x0a, 0x38, 0x89, 0x85, 0x92, 0x2c, 0xc2, 0xe1, 0x62, 0x02, 0x17, 0xdb, 0x20, 0x01, 0xa0, 0xcd, 0x2c, 0x31, 0xce, 0x64, 0x3f, 0x80, 0x2f, 0xc6, 0x38, 0x5c, 0xce, 0x0d, 0xae, 0xcf, 0x04, 0x7d, 0xb5, 0x06, 0x23, 0x91, 0xf5, 0x91, 0x7f, 0x81, 0x6f, 0x89, 0xaa, 0x40, 0x90, 0xc4, 0xe3, 0xaa, 0xcf, 0x9e, 0x46, 0x1f, 0x2f, 0x62, 0x90, 0x8f, 0xaa, 0xb5, 0x19, 0xbf, 0x0f, 0x8a, 0xe7, 0xeb, 0xcc, 0xa4, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x0b, 0xf3, 0x0f, 0xf3, 0x09, 0xe5, 0xd5, 0x88, 0xcf, 0x08, 0xa8, 0x9e, 0x79, 0x15, 0xfb, 0x01, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x06, 0xe1, 0x1e, 0xdf, 0xca, 0x3e, 0x16, 0x35, 0xd8, 0x97, 0x89, 0xca, 0x6d, 0xc4, 0x0c, 0x4e, 0x42, 0xfd, 0x1a, 0xb1, 0xaf, 0x94, 0x91, 0x4a, 0xfb, 0x85, 0x77, 0x05, 0x12, 0x86, 0xfe, 0x63, 0x29, 0x1b, 0x9b, 0xfc, 0x87, 0xd3, 0x36, 0xe1, 0x87, 0xfc, 0x83, 0x46, 0xfd, 0xc3, 0xd4, 0x6a, 0x13, 0x40, 0x49, 0xa8, 0x5d, 0xfc, 0x43, 0x47, 0x66, 0x51, 0xff, 0x52, 0xf6, 0x95, 0x6d, 0x44, 0x7a, 0xae, 0x17, 0x03, 0x6f, 0x3a, 0x8f, 0x8c, 0x18, 0x71, 0x71, 0x71, 0xa9, 0x37, 0xc2, 0x63, 0xc8, 0x0a, 0xca, 0xaf, 0xfc, 0x49, 0xd9, 0x85, 0x46, 0xb6, 0x55, 0xb8, 0x2e, 0x15, 0x3e, 0x6e, 0x70, 0x1f, 0x0f, 0x9f, 0xc6, 0xe0, 0xeb, 0xfe, 0xab, 0x74, 0x1c, 0xa1, 0x4f, 0xa4, 0x7c, 0x44, 0xf2, 0x1b, 0x62, 0x9f, 0xc9, 0x38, 0x63, 0x51, 0xb0, 0xa7, 0x77, 0x69, 0x63, 0x6a, 0xd0, 0xaf, 0xe2, 0x4b, 0xd5, 0x88, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x58, 0x11, 0xff, 0xb4, 0x7c, 0x0f, 0x89, 0xfa, 0x1f, 0xf1, 0x69, 0xf0, 0x36, 0xa2, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xd8, 0xf8, 0x60, 0xc1, 0xfc, 0x45, 0x45, 0x0e, 0x51, 0x03, 0xc4, 0xbb, 0xa7, 0xda, 0x78, 0x8c, 0xda, 0x74, 0xf7, 0x53, 0x35, 0xce, 0x75, 0x68, 0x9c, 0x6b, 0x69, 0x7e, 0xa5, 0xe7, 0x2c, 0x3d, 0xbf, 0x25, 0xfa, 0x26, 0xb5, 0x64, 0xee, 0x95, 0xa1, 0xc7, 0x54, 0xbe, 0x35, 0x98, 0x96, 0x45, 0x4d, 0x0c, 0x99, 0x92, 0x40, 0xd6, 0x21, 0x4c, 0xbf, 0x64, 0x5f, 0xcf, 0xaf, 0xd0, 0xc5, 0xec, 0x65, 0x61, 0x1b, 0xc8, 0xaf, 0x32, 0xb6, 0x31, 0x43, 0x11, 0xe8, 0x10, 0xcf, 0x86, 0xc4, 0xd3, 0x3d, 0x97, 0x41, 0xf3, 0x8d, 0x60, 0x0c, 0x12, 0xc5, 0x3c, 0x97, 0x13, 0x97, 0x25, 0xba, 0x0b, 0x33, 0xe2, 0xc7, 0x9d, 0x7a, 0x8e, 0x11, 0x5f, 0x17, 0x84, 0x10, 0x22, 0xa9, 0x04, 0x5b, 0x39, 0xae, 0x3b, 0x0f, 0x15, 0x8c, 0x83, 0x20, 0x8c, 0xa7, 0x89, 0xb3, 0x72, 0x56, 0x4e, 0x7b, 0xe1, 0x47, 0x64, 0xc3, 0xe1, 0x70, 0x80, 0x6f, 0xfa, 0x58, 0x78, 0xdb, 0xef, 0xcb, 0x76, 0x28, 0xc1, 0x7d, 0x1d, 0xdc, 0xef, 0x8b, 0xe9, 0x43, 0xd1, 0xfa, 0xc5, 0x40, 0x27, 0x04, 0x8e, 0xd0, 0x39, 0xb3, 0xc0, 0x8f, 0xb7, 0x0c, 0xfa, 0x68, 0x48, 0xb0, 0x1b, 0x54, 0x34, 0x10, 0x8b, 0x96, 0xa1, 0x56, 0xfa, 0x61, 0xa0, 0xf2, 0x13, 0xa4, 0x13, 0x83, 0xaf, 0xfc, 0xc4, 0x88, 0x7f, 0x66, 0x81, 0x8f, 0x51, 0xfc, 0x1b, 0x2a, 0xf3, 0xcd, 0xda, 0x8f, 0xa9, 0x26, 0x7c, 0x0c, 0x70, 0x18, 0x1b, 0x0c, 0x4d, 0xf8, 0x78, 0xae, 0x34, 0xc4, 0xda, 0x8f, 0xc3, 0x1f, 0x0c, 0x45, 0x65, 0x46, 0x7c, 0xc4, 0xe3, 0xf5, 0xc4, 0xf5, 0xa3, 0xf8, 0xc3, 0x50, 0x35, 0xe0, 0x0f, 0xf5, 0x9a, 0xc8, 0xbf, 0x19, 0xdf, 0x93, 0x7d, 0x20, 0x55, 0xa8, 0xe3, 0xeb, 0xb2, 0xe3, 0xfd, 0xc9, 0xf1, 0x07, 0xc1, 0x05, 0x71, 0x23, 0x2b, 0x63, 0x31, 0x01, 0xca, 0x9e, 0xb0, 0xe8, 0xc1, 0xcc, 0xc2, 0xf6, 0x36, 0xf3, 0xa2, 0xd9, 0x3a, 0xca, 0x8b, 0x94, 0x33, 0x16, 0x5f, 0xda, 0x38, 0x01, 0x9f, 0x0d, 0x92, 0xf0, 0xfb, 0xec, 0x07, 0xc3, 0xd7, 0xec, 0x14, 0x87, 0xaf, 0x6c, 0xfd, 0x83, 0xac, 0x3f, 0x48, 0xc2, 0xef, 0x27, 0xe0, 0x87, 0x4b, 0x5f, 0xf0, 0xcc, 0xeb, 0xe0, 0x09, 0x6a, 0x42, 0x5c, 0xfa, 0xf1, 0xf9, 0x14, 0xce, 0x61, 0x8a, 0x7f, 0x96, 0x9c, 0x07, 0x92, 0xf0, 0x07, 0x49, 0xf8, 0xfd, 0x13, 0xf1, 0x07, 0xc3, 0x24, 0x7c, 0x2f, 0x7f, 0x7c, 0x84, 0xf5, 0x03, 0xf1, 0x6b, 0xc6, 0xf7, 0xe2, 0xff, 0x23, 0xf2, 0x3f, 0x48, 0xc2, 0x57, 0x79, 0x40, 0xf7, 0xdd, 0x98, 0xe7, 0xa7, 0xee, 0x3b, 0x27, 0xc6, 0xf6, 0xd3, 0xe4, 0x01, 0x16, 0xe7, 0x57, 0x41, 0x5e, 0x0c, 0x3e, 0x35, 0x08, 0xc5, 0x8f, 0x97, 0xaf, 0x23, 0xf8, 0x43, 0x2d, 0x5f, 0x9b, 0xf1, 0x07, 0x2a, 0xfe, 0x06, 0x46, 0x7c, 0x99, 0xe7, 0xfb, 0x89, 0xeb, 0x27, 0xe0, 0x47, 0xf3, 0x7d, 0x1c, 0x7e, 0x20, 0x0f, 0x84, 0xf1, 0xe3, 0xd7, 0x1f, 0x0c, 0xb5, 0x1c, 0x30, 0x30, 0xf1, 0xaf, 0x72, 0x40, 0xff, 0x29, 0x6c, 0xd9, 0x97, 0xb2, 0x7c, 0xe2, 0xab, 0x9f, 0xb2, 0xf0, 0xeb, 0xc8, 0x7b, 0x2f, 0x43, 0xfd, 0x10, 0x2a, 0x7b, 0x19, 0xea, 0x87, 0xa2, 0x85, 0x81, 0xe3, 0x63, 0x18, 0x3c, 0x56, 0x13, 0x1e, 0x5b, 0xc7, 0x00, 0x78, 0x0f, 0x26, 0x1c, 0x33, 0x39, 0xe9, 0xf8, 0x31, 0xfe, 0x89, 0x5b, 0x9c, 0xaa, 0x55, 0x09, 0x3e, 0x2b, 0x67, 0xe5, 0xac, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xa2, 0xdf, 0x4f, 0xa8, 0x65, 0x25, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd0, 0x86, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xe8, 0xf1, 0xab, 0x7f, 0xee, 0x4a, 0x55, 0x3f, 0x74, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7a, 0xbe, 0x4c, 0x93, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1c, 0x1f, 0x7b, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x8b, 0x3f, 0xc3, 0xd5, 0x3f, 0x65, 0xc4, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xe8, 0xf9, 0xbd, 0x15, 0xd1, 0x5f, 0x94, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfa, 0xf9, 0xc2, 0x3b, 0xdf, 0x55, 0x3e, 0x10, 0xfe, 0x3e, 0xc6, 0xbc, 0xef, 0x6b, 0x72, 0x4a, 0x04, 0x4e, 0xbc, 0xef, 0x6e, 0x84, 0xc6, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x22, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x68, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0xe2, 0x75, 0x6e, 0xd2, 0x7f, 0x18, 0x1e, 0xb1, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x00, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x61, 0xfb, 0x0b, 0x98, 0xdf, 0x9a, 0xf1, 0xe3, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x8f, 0xf3, 0xaf, 0x00, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x41, 0xd9, 0xc2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0x44, 0x95, 0x60, 0xb2, 0x4f, 0x1c, 0xff, 0x61, 0x18, 0x89, 0x3e, 0x3f, 0x08, 0xf1, 0x75, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xc1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x86, 0xed, 0xaf, 0xe5, 0x96, 0xc8, 0x67, 0x34, 0x16, 0x7a, 0xbe, 0x24, 0x7c, 0x5e, 0xf4, 0x6f, 0xa2, 0xcf, 0x04, 0xef, 0xf9, 0x43, 0x62, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xb0, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x21, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0x45, 0x13, 0x64, 0x12, 0xfd, 0xe0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x8a, 0x51, 0x66, 0xc8, 0x41, 0x11, 0x01, 0xad, 0x78, 0xff, 0x0c, 0x27, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe2, 0x3f, 0x14, 0xc3, 0xa6, 0x67, 0xc8, 0xc9, 0x39, 0x20, 0x64, 0x1f, 0x1a, 0xf3, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xc3, 0xb6, 0x33, 0xc9, 0x9f, 0x10, 0xff, 0xe1, 0x18, 0x36, 0xf9, 0x72, 0x20, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xf7, 0x0d, 0xdd, 0x04, 0x0f, 0xcb, 0x4e, 0x93, 0x72, 0x40, 0x4c, 0xfc, 0xd3, 0x98, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0xc5, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x95, 0xb3, 0x72, 0x56, 0xce, 0x4a, 0x70, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4d, 0x3d, 0x16, 0x49, 0xd8, 0x3f, 0x10, 0xe2, 0xfd, 0x84, 0xd2, 0x6b, 0x23, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf0, 0xee, 0x4a, 0x62, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x78, 0x06, 0x43, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x88, 0xd3, 0x21, 0x3b, 0xe9, 0x1c, 0x22, 0x74, 0x1c, 0x61, 0x45, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xfe, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x49, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xa0, 0x8f, 0x45, 0xf4, 0x46, 0x82, 0xc7, 0x3c, 0x11, 0xfa, 0x24, 0x19, 0x3f, 0x89, 0x3f, 0x2b, 0x21, 0x36, 0x4c, 0xf0, 0x84, 0xe3, 0x99, 0xd8, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0x89, 0x3f, 0x4f, 0x0c, 0xc8, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6c, 0x4d, 0xf6, 0xf1, 0x8e, 0xd7, 0x62, 0xf0, 0xe3, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x42, 0x70, 0x12, 0xb7, 0x7e, 0x4c, 0x7e, 0x20, 0xe4, 0x04, 0xf9, 0x42, 0xf9, 0x21, 0xce, 0xbf, 0xac, 0xe0, 0x4f, 0x03, 0xa3, 0xf4, 0x63, 0x72, 0x65, 0x78, 0xeb, 0x67, 0xa2, 0xcf, 0x42, 0x31, 0x9a, 0xa4, 0x3f, 0x12, 0x63, 0x3f, 0x12, 0xc3, 0x5f, 0xc0, 0x7e, 0x26, 0xfd, 0x85, 0x74, 0x14, 0x67, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x5c, 0xfc, 0x87, 0xf5, 0x1b, 0xa7, 0xbf, 0x93, 0xec, 0x47, 0x4e, 0xd0, 0xbf, 0xc7, 0x63, 0x0c, 0x3e, 0x8d, 0xb3, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xce, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x42, 0x0c, 0x9b, 0x8e, 0xdf, 0x03, 0xfe, 0x17, 0x63, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x50, 0x9e, 0x08, 0xf3, 0xce, 0xac, 0xf8, 0xf8, 0x0d, 0xe7, 0x00, 0x1a, 0xf3, 0xf3, 0xf0, 0x38, 0xfb, 0x06, 0x72, 0x54, 0x1c, 0x7e, 0xc8, 0x8f, 0xac, 0x84, 0x1c, 0x17, 0x3e, 0x23, 0x25, 0x86, 0x18, 0x8a, 0xcb, 0xdd, 0x46, 0xfa, 0x24, 0x18, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xca, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xc9, 0x39, 0xc0, 0x4a, 0x88, 0x61, 0x6a, 0x25, 0xe3, 0xb3, 0xb8, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xfe, 0xf1, 0xe8, 0x1f, 0x3f, 0xc7, 0xed, 0x2f, 0x48, 0xfc, 0xfe, 0x2b, 0x1c, 0xc3, 0xf4, 0x24, 0xb8, 0x15, 0x0f, 0x37, 0xc5, 0x7f, 0x78, 0xff, 0x46, 0x12, 0xe8, 0xc7, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x2d, 0x7a, 0xd7, 0x74, 0x7d, 0xe7, 0xbb, 0xa6, 0xeb, 0x34, 0xbc, 0x9c, 0xb0, 0x3f, 0x32, 0x5d, 0x83, 0x47, 0xa6, 0xeb, 0x54, 0xbc, 0x8c, 0xfd, 0x3f, 0xb3, 0xef, 0xd7, 0xdf, 0x0f, 0x5f, 0x68, 0xdf, 0xe3, 0x0f, 0xc2, 0xd7, 0x99, 0x7d, 0x4f, 0x8b, 0x7d, 0xf1, 0x8a, 0xda, 0x17, 0xaf, 0x33, 0xfb, 0x9e, 0xd9, 0xf7, 0xe3, 0x5e, 0x8e, 0x0c, 0xe6, 0xed, 0xdf, 0x3d, 0x32, 0x98, 0x77, 0x78, 0x2a, 0xec, 0x7b, 0x64, 0x30, 0xef, 0xb7, 0x1f, 0x1e, 0x19, 0xcc, 0xfb, 0xe1, 0xc3, 0xd3, 0x20, 0xef, 0xd7, 0xfe, 0x30, 0x6a, 0xe0, 0x07, 0x0f, 0xff, 0xe9, 0x9f, 0xa3, 0x06, 0x7e, 0x70, 0x2a, 0xe4, 0xfd, 0x8b, 0xbf, 0x34, 0xc5, 0xef, 0x7f, 0xff, 0xcf, 0xa9, 0xcd, 0xcf, 0xfd, 0xbb, 0xfc, 0x4f, 0x96, 0xbb, 0x47, 0xbc, 0x40, 0xb0, 0xf2, 0x3f, 0x59, 0xbe, 0x2b, 0x46, 0x4f, 0x45, 0x7e, 0x7e, 0xef, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x47, 0x47, 0xf7, 0xee, 0x1f, 0x1d, 0x1d, 0xff, 0xcb, 0x07, 0xfc, 0x4f, 0x96, 0x0f, 0x8e, 0x8e, 0xfe, 0xea, 0xaf, 0x4f, 0x87, 0xbc, 0x47, 0x91, 0xf2, 0xc7, 0xdf, 0x38, 0x32, 0x94, 0x7f, 0xfd, 0xde, 0x29, 0x91, 0xf7, 0xdd, 0x5f, 0x0d, 0xc8, 0xf5, 0x95, 0xdf, 0xff, 0xdd, 0xdf, 0xfb, 0x83, 0xaf, 0x1e, 0xfd, 0xda, 0xaf, 0x07, 0x46, 0xff, 0xee, 0xef, 0xff, 0xe6, 0x6f, 0xff, 0xe1, 0x1f, 0x4f, 0x85, 0xbc, 0xbf, 0xf9, 0x5b, 0x01, 0xc9, 0xfe, 0xe4, 0x4f, 0xbf, 0xf9, 0xad, 0x3f, 0xfb, 0xf3, 0xa3, 0xdf, 0xfe, 0x9d, 0xc0, 0xe8, 0x7f, 0xfc, 0xe7, 0xbf, 0xfd, 0xfb, 0x7f, 0x7d, 0x7f, 0xe4, 0xae, 0x65, 0x7d, 0x92, 0x5f, 0x2f, 0x8f, 0xe0, 0xf5, 0x93, 0xfc, 0xe2, 0xf7, 0xd6, 0x93, 0x5c, 0xfc, 0x7f, 0xc7, 0xb2, 0xce, 0xe1, 0xf5, 0x3c, 0x5c, 0x2f, 0xc0, 0x45, 0xce, 0x91, 0x11, 0x2b, 0x78, 0x91, 0xd0, 0xa5, 0x53, 0x38, 0x07, 0x24, 0x7e, 0xc9, 0x7a, 0xc9, 0x7a, 0xe9, 0xb9, 0x97, 0x9e, 0x7b, 0xb2, 0x35, 0xc3, 0xd7, 0xf3, 0x9f, 0xfc, 0xfe, 0x2b, 0x56, 0x65, 0xb1, 0xbc, 0x5c, 0x2e, 0xa5, 0xde, 0x4e, 0x8d, 0xcc, 0xaf, 0x2e, 0x94, 0xed, 0x52, 0x6a, 0x04, 0x6e, 0x47, 0xde, 0xb8, 0x6c, 0x63, 0x29, 0x4d, 0x9f, 0xcf, 0x41, 0xef, 0x92, 0xea, 0x15, 0xb0, 0xb7, 0x5e, 0x59, 0x5b, 0x5a, 0xb9, 0x6c, 0x97, 0x66, 0xb0, 0xb3, 0x72, 0x6d, 0xf9, 0x8d, 0xf2, 0x1a, 0x80, 0xa6, 0xb1, 0xf7, 0x99, 0xf2, 0xe7, 0xae, 0xaf, 0xae, 0x2d, 0x94, 0x8a, 0xd8, 0x99, 0xbb, 0xba, 0xc4, 0xb1, 0x38, 0x89, 0xf9, 0xd5, 0xe5, 0xe5, 0xf2, 0x4a, 0xa5, 0x34, 0xcd, 0xb1, 0xd6, 0x97, 0x2e, 0xaf, 0x70, 0x82, 0x7c, 0xe2, 0x7a, 0xf9, 0x4a, 0x79, 0xbe, 0x62, 0x4b, 0xd8, 0xfc, 0xb5, 0xb5, 0xf5, 0x55, 0xa0, 0x28, 0xd6, 0x5a, 0x9c, 0x5b, 0x58, 0xbd, 0x6e, 0x97, 0xba, 0xee, 0x9e, 0xc3, 0x69, 0x5e, 0xa9, 0x6c, 0x5c, 0x5a, 0x05, 0x3a, 0xf5, 0x6a, 0xb3, 0xc3, 0x47, 0x96, 0xe7, 0x2a, 0xf3, 0x8b, 0x1b, 0x0b, 0xe5, 0x2b, 0x4b, 0xcb, 0x4b, 0x95, 0xf2, 0xda, 0xba, 0x9a, 0x7a, 0x2b, 0x97, 0x4a, 0x8d, 0x5c, 0x9e, 0x5b, 0x2e, 0x5f, 0x9d, 0x5b, 0x90, 0x42, 0x55, 0x56, 0xaf, 0xcd, 0x2f, 0xc2, 0x3d, 0xef, 0x00, 0xa9, 0xab, 0x8b, 0x73, 0xa5, 0xe9, 0xd7, 0xa7, 0x90, 0xca, 0x2d, 0x81, 0x71, 0x2b, 0x95, 0x9a, 0x5f, 0x2c, 0xcf, 0x7f, 0x66, 0x63, 0xa5, 0x7c, 0x7d, 0xe3, 0x4d, 0xa0, 0xb6, 0xb4, 0xba, 0xc2, 0x09, 0xa6, 0x56, 0x56, 0x37, 0xd6, 0x57, 0xaf, 0xad, 0x2c, 0x88, 0x85, 0x53, 0x97, 0x97, 0x2e, 0x6d, 0x5c, 0x29, 0xaf, 0x5c, 0xae, 0x2c, 0x96, 0x0a, 0x53, 0xf6, 0xc4, 0x84, 0xdd, 0x68, 0xd9, 0x1d, 0xa7, 0xd6, 0x6e, 0x6d, 0x75, 0x52, 0xeb, 0xab, 0x97, 0x2a, 0xd7, 0xe7, 0xd6, 0xca, 0x1b, 0x6b, 0xe5, 0x95, 0x85, 0x32, 0xea, 0x4a, 0x22, 0xbd, 0xb9, 0xfe, 0xb9, 0x95, 0x79, 0x41, 0x6e, 0x7e, 0xad, 0xb2, 0xb1, 0xbc, 0xba, 0xb2, 0x54, 0x59, 0x5d, 0xd3, 0x28, 0xae, 0xcf, 0xcf, 0x5d, 0x29, 0x97, 0x8a, 0xa9, 0x6b, 0x4b, 0xf2, 0x76, 0x26, 0x95, 0x9a, 0x88, 0x2f, 0xa9, 0xfa, 0x5e, 0xab, 0xd6, 0x6d, 0xb4, 0x5b, 0x76, 0x65, 0x69, 0x3e, 0x93, 0x4d, 0x8d, 0xd4, 0x9a, 0x1d, 0x6c, 0x9a, 0xed, 0x5a, 0xb5, 0x69, 0x37, 0xab, 0x9b, 0x4e, 0xb3, 0x94, 0xae, 0xec, 0x34, 0x3a, 0x36, 0xfc, 0x75, 0x0e, 0x3a, 0x5d, 0xe7, 0x86, 0x0d, 0x2c, 0xd6, 0x1b, 0xdb, 0x7b, 0x6e, 0x95, 0xe3, 0xd5, 0xaa, 0x6e, 0xd7, 0x6d, 0x6c, 0x6d, 0x3b, 0x69, 0x85, 0xd5, 0x69, 0xbc, 0xe5, 0x94, 0x76, 0xdd, 0x46, 0xab, 0x9b, 0xe1, 0x04, 0x72, 0x53, 0xb9, 0x89, 0x0b, 0x40, 0x53, 0x1f, 0xca, 0x14, 0x66, 0xa6, 0x26, 0x70, 0x62, 0x76, 0x72, 0xb2, 0x90, 0xcb, 0x4c, 0x17, 0x2f, 0xc0, 0x14, 0xb8, 0xcd, 0xa6, 0x9c, 0xd6, 0x56, 0x8a, 0xcb, 0x86, 0x76, 0x2b, 0xaf, 0x71, 0xb7, 0x02, 0x35, 0x56, 0xca, 0x9f, 0x2d, 0x7d, 0xfe, 0xf3, 0xa0, 0xe6, 0xd7, 0x6e, 0x3a, 0x6e, 0x07, 0x17, 0x9e, 0x9e, 0x9e, 0x82, 0x6e, 0xb5, 0x0b, 0xab, 0x6f, 0xee, 0x75, 0x1d, 0xfb, 0xa6, 0x53, 0x2b, 0xda, 0xdb, 0xbb, 0x7b, 0x1b, 0x6f, 0x3a, 0x6e, 0xd7, 0xd9, 0xbf, 0x18, 0x06, 0x16, 0x38, 0xb0, 0xe2, 0xec, 0xcf, 0xb7, 0xdb, 0xee, 0x56, 0x04, 0x3c, 0xc3, 0xc1, 0xf3, 0xed, 0x66, 0xdb, 0x45, 0xd8, 0x5e, 0xab, 0x51, 0x6f, 0xbb, 0x37, 0xec, 0x1b, 0xd5, 0xae, 0x80, 0x2c, 0xb7, 0xb7, 0x9c, 0xe6, 0x9b, 0x0d, 0xa7, 0x77, 0xd5, 0x6d, 0xff, 0x82, 0xc3, 0x75, 0xb6, 0x5c, 0x05, 0x7c, 0xbe, 0xd0, 0xcd, 0xaa, 0x7b, 0xd0, 0x68, 0x6d, 0x0b, 0x3a, 0x35, 0x45, 0x43, 0x1b, 0x2d, 0xd8, 0x5d, 0x6d, 0xe1, 0x9b, 0xed, 0xc6, 0x16, 0x50, 0x6e, 0xb4, 0x32, 0x78, 0x97, 0x55, 0xee, 0xc4, 0x11, 0xed, 0x52, 0x90, 0x91, 0x11, 0x85, 0x08, 0x00, 0x24, 0x94, 0xd1, 0xa5, 0xc8, 0xf2, 0x19, 0xdb, 0xcd, 0x8d, 0xab, 0xed, 0x4e, 0x83, 0x9b, 0xa3, 0x94, 0xcc, 0xac, 0x3d, 0xc6, 0x79, 0xcc, 0xf8, 0x7a, 0xca, 0xd9, 0xd3, 0xf9, 0x29, 0x4e, 0xe7, 0x56, 0x6a, 0xe4, 0x0b, 0x5f, 0x00, 0x27, 0xbe, 0xba, 0xf4, 0xd9, 0xf2, 0x15, 0xa3, 0xb2, 0x27, 0x27, 0x77, 0x5d, 0xa7, 0xd6, 0xe0, 0x23, 0x3b, 0x8d, 0xed, 0x9d, 0x5d, 0xbb, 0xde, 0x6c, 0x57, 0xbb, 0x89, 0xb2, 0x2a, 0x45, 0x76, 0xaa, 0x37, 0x76, 0x9b, 0x8e, 0x5b, 0x58, 0xb0, 0x3b, 0xed, 0x3d, 0xb7, 0xe6, 0xe8, 0x30, 0x4e, 0xc5, 0xee, 0xba, 0xdb, 0x1b, 0xfb, 0xe6, 0xe1, 0x03, 0xf3, 0x70, 0xcf, 0x3c, 0xbc, 0x13, 0x1d, 0xee, 0xd4, 0x5c, 0xd3, 0x6c, 0x1c, 0x86, 0xd9, 0x5c, 0x34, 0xbb, 0x7c, 0x63, 0xaf, 0x59, 0xed, 0x3a, 0x5b, 0x10, 0x88, 0xbb, 0x7b, 0x5d, 0xdb, 0x75, 0x3a, 0xed, 0xe6, 0x1e, 0xaa, 0x2e, 0x8f, 0xf2, 0xa1, 0x5c, 0x30, 0x54, 0xe2, 0x36, 0x28, 0x9c, 0xbf, 0x90, 0x9f, 0xca, 0x4d, 0xcf, 0xcc, 0x70, 0xd5, 0x09, 0xf4, 0xc5, 0xaa, 0xbb, 0xd5, 0x72, 0x3a, 0x1d, 0xbb, 0x5d, 0x07, 0xba, 0xd5, 0x56, 0xb3, 0xd1, 0x72, 0xf2, 0x02, 0x64, 0x4f, 0xbc, 0x9e, 0x9f, 0x02, 0xd3, 0x74, 0xda, 0xf5, 0xae, 0x18, 0x99, 0x98, 0xbe, 0xc0, 0x47, 0x6e, 0x38, 0x5b, 0x8d, 0xbd, 0x1b, 0x30, 0x26, 0xf8, 0xd9, 0x01, 0x1a, 0xeb, 0x80, 0x5b, 0x42, 0x04, 0x13, 0xe1, 0xdd, 0xc6, 0xbe, 0xd3, 0xec, 0xf0, 0x54, 0x11, 0x5c, 0x62, 0xa2, 0x10, 0x5e, 0x61, 0x86, 0x0f, 0x20, 0xc5, 0x00, 0xf9, 0xab, 0x8d, 0xfd, 0xd2, 0x44, 0xd1, 0xa7, 0xbe, 0xd0, 0xe8, 0xec, 0x36, 0xab, 0x07, 0x76, 0xaf, 0xea, 0xee, 0x4a, 0x5a, 0x53, 0x1c, 0xb3, 0xd5, 0x6e, 0x39, 0xa2, 0x0f, 0x0e, 0x32, 0x29, 0x04, 0x70, 0xf6, 0xbb, 0xae, 0x73, 0xc3, 0x51, 0xfa, 0x40, 0x1c, 0xa1, 0x10, 0x9c, 0x72, 0x61, 0x06, 0x75, 0x02, 0x37, 0x33, 0xaf, 0xa3, 0x5a, 0x6c, 0xb9, 0xc0, 0xdc, 0x8d, 0xf6, 0x5e, 0xab, 0xcb, 0xb5, 0xb2, 0x53, 0xdd, 0x6a, 0xf7, 0xc0, 0xf1, 0x3b, 0x5f, 0xcc, 0x7b, 0x3c, 0x61, 0x6f, 0xa1, 0xea, 0x7e, 0xb1, 0x34, 0x95, 0x3f, 0x7f, 0x31, 0x30, 0x7a, 0x05, 0x3c, 0xac, 0x5b, 0x9a, 0xc6, 0x61, 0x4e, 0x69, 0xe2, 0x19, 0x15, 0xc9, 0x57, 0x67, 0xed, 0xf2, 0x1b, 0x76, 0xb7, 0x6d, 0x5f, 0x01, 0x25, 0x56, 0x5d, 0x29, 0xfa, 0x5c, 0xa7, 0xb3, 0x87, 0x6e, 0xbc, 0xd7, 0xc1, 0x7f, 0xc5, 0x94, 0x83, 0x5d, 0xf0, 0x09, 0x70, 0xe9, 0xee, 0x1e, 0xd8, 0xdf, 0xee, 0x62, 0x32, 0xec, 0xec, 0xb4, 0xf7, 0x9a, 0x5b, 0xa0, 0xa2, 0xae, 0xbd, 0xe9, 0xd8, 0x2d, 0xc7, 0xd9, 0x72, 0xb6, 0x7c, 0x91, 0x2a, 0x6d, 0x41, 0x73, 0x3a, 0x23, 0xfa, 0xb5, 0xec, 0xdb, 0xae, 0x03, 0xd8, 0xad, 0x4c, 0x6d, 0x16, 0xc4, 0x9c, 0x9a, 0x99, 0x9a, 0x39, 0x9f, 0xfd, 0x74, 0x6d, 0x72, 0xba, 0x90, 0xff, 0xd9, 0xc2, 0xcf, 0xed, 0xb6, 0x7b, 0x99, 0x4c, 0x6d, 0x1c, 0xc6, 0xcf, 0x9f, 0xcf, 0x4e, 0x4e, 0x63, 0x93, 0x2b, 0xe4, 0x67, 0xb2, 0x17, 0x6f, 0x09, 0x35, 0x17, 0x3d, 0x7a, 0x19, 0xde, 0xf3, 0xa8, 0xf1, 0x8c, 0x97, 0xf1, 0x17, 0xab, 0xe5, 0xdd, 0x6c, 0x4e, 0xef, 0x6e, 0x07, 0xbb, 0x9b, 0x59, 0xa4, 0x29, 0xe4, 0x14, 0xa3, 0x28, 0x3e, 0xca, 0xf8, 0x6c, 0x85, 0x5f, 0x77, 0xb7, 0x37, 0x4d, 0xa2, 0x83, 0x84, 0x53, 0xc5, 0xe9, 0xe2, 0xd4, 0xeb, 0x9f, 0xae, 0x8d, 0x09, 0xd1, 0xb9, 0xb0, 0x63, 0xa8, 0x80, 0x5a, 0x6e, 0x2a, 0x3f, 0x33, 0x7d, 0xe1, 0xc2, 0x85, 0xec, 0x84, 0x50, 0x84, 0x2e, 0x3d, 0x12, 0x8c, 0x91, 0x5d, 0xac, 0x25, 0x25, 0x57, 0x9d, 0x6d, 0xbd, 0xa3, 0x4b, 0xbd, 0x02, 0x32, 0x3b, 0x9d, 0xae, 0xed, 0xa8, 0x48, 0x17, 0x49, 0xc9, 0xde, 0x6e, 0xdc, 0x74, 0x5a, 0x22, 0x25, 0xa0, 0xe4, 0xbb, 0x6d, 0x78, 0x50, 0xc1, 0xbf, 0x32, 0xa5, 0x56, 0x5b, 0x5c, 0x03, 0x4e, 0x13, 0x7c, 0xb8, 0xde, 0x71, 0xba, 0x4a, 0x5b, 0xcd, 0x4e, 0xdb, 0x7e, 0xcb, 0x71, 0xdb, 0x3f, 0x83, 0x91, 0x89, 0x31, 0xef, 0x3a, 0x8e, 0xca, 0x15, 0x45, 0xfb, 0x92, 0xd3, 0xad, 0xed, 0x64, 0x78, 0x98, 0x00, 0xa5, 0x1c, 0xbf, 0x81, 0x69, 0x59, 0x9e, 0xe9, 0x61, 0xa4, 0x84, 0x1a, 0x6a, 0xbb, 0x19, 0xb8, 0x1d, 0x03, 0xa6, 0xc6, 0x11, 0x36, 0xce, 0x63, 0x09, 0x02, 0x01, 0xb4, 0x71, 0x3e, 0x9b, 0x9d, 0x84, 0x71, 0x9e, 0xe0, 0xa5, 0xcc, 0x9e, 0x1f, 0x4c, 0xe7, 0x0b, 0x90, 0xc8, 0xa5, 0x55, 0x0a, 0x0b, 0x19, 0x91, 0x51, 0x73, 0x40, 0x2a, 0xbf, 0x7f, 0x90, 0xe3, 0xb9, 0x25, 0x9b, 0x07, 0xf9, 0x7d, 0xc9, 0x21, 0xca, 0xbb, 0xd5, 0x56, 0xcd, 0xc1, 0xcc, 0xe1, 0x49, 0x2f, 0x93, 0x09, 0x38, 0x41, 0x4b, 0x2a, 0x86, 0x8b, 0xe9, 0xa5, 0x3b, 0x44, 0xf2, 0x24, 0xc8, 0xbe, 0x8d, 0x4c, 0x4b, 0x6e, 0x2f, 0x4a, 0x8e, 0x26, 0x32, 0xc8, 0xff, 0x84, 0x27, 0x49, 0x36, 0x3b, 0xa1, 0x44, 0xc8, 0x0a, 0x13, 0x8e, 0x8c, 0xc8, 0x1c, 0xb2, 0x60, 0x5f, 0xae, 0xee, 0x75, 0x3a, 0x8d, 0x6a, 0xcb, 0xf7, 0x15, 0x1c, 0x91, 0x8e, 0x82, 0x3a, 0x52, 0x39, 0xb9, 0xda, 0x74, 0x3c, 0x3b, 0x3b, 0xfb, 0xbb, 0x85, 0x0c, 0x1f, 0x1a, 0xc3, 0xb5, 0x71, 0x0d, 0x4f, 0xa8, 0xe2, 0x44, 0xb7, 0xba, 0xeb, 0x91, 0xb5, 0xeb, 0x8d, 0x66, 0xd7, 0x71, 0xed, 0x6a, 0xb3, 0x0d, 0x36, 0xdc, 0x69, 0xbb, 0x6f, 0xd9, 0x2a, 0x3f, 0x72, 0x83, 0x2c, 0xc2, 0x48, 0xd1, 0x37, 0x88, 0x58, 0xcc, 0xb3, 0x08, 0x9f, 0xb2, 0x59, 0x12, 0x56, 0x53, 0x06, 0xcb, 0x4c, 0x80, 0x87, 0xe6, 0x70, 0x8e, 0x78, 0xd0, 0x0a, 0x1f, 0x0c, 0x4f, 0xc2, 0x7c, 0x19, 0x9e, 0xb4, 0x15, 0x99, 0x14, 0xa4, 0x24, 0x56, 0xdf, 0xea, 0x74, 0x4b, 0x5c, 0xc9, 0x28, 0x56, 0x9e, 0x3f, 0xfb, 0x50, 0xae, 0xf9, 0x76, 0x0b, 0x9e, 0xbb, 0x00, 0x56, 0x46, 0x03, 0x0b, 0xf5, 0x1c, 0xcc, 0x86, 0x79, 0x1f, 0x97, 0xeb, 0xa4, 0x24, 0x33, 0xba, 0x46, 0xb3, 0xb7, 0x59, 0xe2, 0x6a, 0x05, 0xda, 0x9c, 0x7b, 0xa1, 0x4e, 0x7d, 0x42, 0xcd, 0x9b, 0x80, 0x49, 0xc7, 0x30, 0x61, 0xcb, 0x9f, 0x10, 0xa2, 0x00, 0xcc, 0xad, 0x09, 0xbb, 0x08, 0x65, 0x7b, 0x21, 0x94, 0xd7, 0xdc, 0x34, 0xb3, 0x39, 0xd6, 0xdb, 0x1c, 0xaf, 0x8d, 0xf5, 0x6a, 0xe3, 0x5b, 0x63, 0xbd, 0xad, 0xec, 0x64, 0x06, 0xba, 0xd0, 0x81, 0x5b, 0xcf, 0x74, 0xe7, 0x9f, 0xda, 0x74, 0xe7, 0x93, 0x4d, 0x57, 0x8d, 0x98, 0xae, 0x10, 0xb5, 0xca, 0x8f, 0xce, 0xbe, 0x7c, 0x92, 0x13, 0x99, 0x54, 0xf8, 0x51, 0x39, 0x41, 0xd5, 0x77, 0x82, 0x82, 0xd1, 0xc6, 0x3f, 0x4c, 0x2f, 0x91, 0x13, 0x1c, 0x7f, 0x42, 0xe1, 0xa3, 0xb8, 0x51, 0x75, 0xac, 0x57, 0x1d, 0x0f, 0xfa, 0xd2, 0xb8, 0x33, 0xd6, 0x73, 0xd0, 0xa1, 0xaa, 0xe3, 0xca, 0xa7, 0xc6, 0x61, 0xc0, 0x73, 0x2b, 0x49, 0x55, 0xed, 0x8d, 0x34, 0x85, 0x09, 0x9e, 0x70, 0x6f, 0x15, 0xeb, 0x47, 0x26, 0x73, 0x1c, 0xe8, 0xf9, 0xd7, 0x13, 0x07, 0x50, 0x72, 0x6a, 0xab, 0xe6, 0x2f, 0x3e, 0xd7, 0x6c, 0xc2, 0xee, 0xc6, 0x4b, 0xa5, 0x3b, 0xf0, 0x38, 0xe0, 0x6e, 0xcc, 0x33, 0xac, 0x53, 0xaf, 0xc3, 0x3e, 0x5c, 0xa4, 0x5c, 0xcf, 0xaf, 0x2b, 0x6e, 0x43, 0xcb, 0xaf, 0x9a, 0x2f, 0x8b, 0x5c, 0x85, 0x3c, 0x4e, 0xa8, 0xdd, 0xb9, 0xf2, 0x60, 0x11, 0x0b, 0x08, 0x42, 0xbf, 0x0c, 0xf8, 0xad, 0x8f, 0xe5, 0xed, 0xe9, 0x7d, 0x7f, 0xe0, 0xa2, 0x07, 0x29, 0x7a, 0xae, 0xe0, 0xc1, 0x7c, 0x92, 0x9e, 0x17, 0xf8, 0x30, 0x0f, 0x4f, 0xaa, 0x23, 0x68, 0x9f, 0xc0, 0xa3, 0xa6, 0xed, 0xf2, 0x27, 0xa7, 0xb6, 0x13, 0x06, 0x7c, 0x7c, 0x8e, 0xc2, 0xdb, 0x9d, 0x18, 0xc5, 0x67, 0x25, 0xc4, 0xfb, 0xee, 0x4e, 0xd5, 0x7b, 0xdc, 0x5c, 0x87, 0xdd, 0x64, 0x48, 0x1d, 0xea, 0x91, 0x03, 0xfe, 0x83, 0x6c, 0x5f, 0xc4, 0xc3, 0x00, 0x39, 0x3e, 0xe6, 0x6d, 0x3c, 0xc7, 0x91, 0xbd, 0xfc, 0xc1, 0x18, 0xff, 0x37, 0x3b, 0xc6, 0x37, 0xb2, 0xfb, 0x39, 0x0f, 0xb0, 0xcf, 0x01, 0xfb, 0x12, 0x70, 0x10, 0x10, 0x01, 0xe9, 0xc0, 0xb3, 0x6a, 0x1c, 0xf7, 0x9e, 0x8a, 0xff, 0xf5, 0xe0, 0x2e, 0x95, 0xeb, 0x76, 0x19, 0x3a, 0x51, 0xd6, 0xf2, 0xfb, 0xe3, 0x25, 0xb1, 0x34, 0xdf, 0x4f, 0x2b, 0x43, 0x20, 0x66, 0x89, 0xef, 0x4f, 0xd4, 0xde, 0x36, 0x17, 0xb9, 0x11, 0x5c, 0x70, 0x1a, 0xa5, 0xba, 0x5b, 0xad, 0x75, 0x05, 0xab, 0x93, 0x17, 0x94, 0x8e, 0x1b, 0x75, 0x31, 0x02, 0xbb, 0xa6, 0x62, 0xb1, 0x98, 0xe5, 0xdc, 0xb8, 0x25, 0x6f, 0x5b, 0xcc, 0xe7, 0xc0, 0xc3, 0x1b, 0x1e, 0xe8, 0xfe, 0x44, 0xdc, 0x3e, 0xf1, 0x89, 0xdb, 0xa6, 0x89, 0x1c, 0xb2, 0x19, 0x82, 0x48, 0x3d, 0xe0, 0xe0, 0xc5, 0x5b, 0x5c, 0xbb, 0x81, 0xd7, 0xd3, 0xac, 0xcd, 0x65, 0xf5, 0x5f, 0x4b, 0x60, 0xdf, 0x36, 0x25, 0x43, 0xd8, 0xdb, 0xb8, 0x07, 0x29, 0x72, 0x2d, 0x41, 0xca, 0x72, 0xbb, 0x25, 0x78, 0x2f, 0xbd, 0xe4, 0x56, 0xb7, 0xf9, 0xab, 0x20, 0x6c, 0x4c, 0xc4, 0xd6, 0x80, 0xbf, 0xe5, 0xe5, 0xc4, 0x5b, 0x9d, 0x10, 0x95, 0x4f, 0xce, 0x1f, 0x94, 0xf8, 0xcb, 0xd8, 0x84, 0xec, 0xf1, 0x3d, 0xff, 0x88, 0x52, 0x79, 0x89, 0xfb, 0x06, 0x07, 0x4d, 0x7a, 0x54, 0x7a, 0x82, 0xca, 0x4e, 0x56, 0xbc, 0x82, 0x8d, 0x78, 0xcb, 0xc1, 0x9b, 0x33, 0xee, 0x7e, 0x4a, 0x18, 0x5e, 0x68, 0xaf, 0x31, 0x6e, 0xbe, 0x10, 0x37, 0xde, 0xab, 0xb3, 0x87, 0x23, 0x5e, 0xb0, 0x67, 0xe4, 0xae, 0x32, 0x13, 0x26, 0x97, 0x0d, 0xbd, 0x29, 0xa7, 0x6e, 0xa5, 0xfe, 0x17, 0x03, 0xd7, 0x01, 0xdf, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0x43, 0xe7, 0x9a, 0x2a, 0xcf, 0x62, 0x0f, 0x01, 0x48, 0x10, 0x24, 0x01, 0x52, 0xb5, 0x89, 0x88, 0x72, 0x71, 0x49, 0x48, 0x62, 0x59, 0x24, 0x55, 0x24, 0x24, 0xd9, 0xe5, 0x72, 0x31, 0x20, 0x38, 0x20, 0x11, 0x43, 0x00, 0x6b, 0x00, 0x0a, 0xe4, 0x6e, 0x54, 0x95, 0xa3, 0x0e, 0x39, 0xe4, 0xea, 0x3d, 0x6d, 0x92, 0x4b, 0xcc, 0xd2, 0x21, 0x8f, 0x3f, 0xd0, 0x92, 0x12, 0x27, 0x76, 0x3a, 0x58, 0x6f, 0x9c, 0x77, 0x4c, 0xd1, 0xce, 0xfb, 0x01, 0x21, 0xda, 0x38, 0xef, 0x6c, 0x95, 0xf2, 0x7d, 0xfd, 0x98, 0xe9, 0x99, 0xe9, 0x19, 0x4a, 0x6b, 0xd9, 0xde, 0x30, 0xec, 0x61, 0xab, 0xa7, 0xfb, 0xeb, 0xef, 0xeb, 0xef, 0x3d, 0x3d, 0x3d, 0x28, 0x8d, 0x5a, 0x96, 0xf5, 0xc2, 0xbb, 0x9f, 0xb6, 0xfa, 0x0c, 0xca, 0x9d, 0x3b, 0x77, 0xee, 0x1e, 0x1e, 0x1e, 0xde, 0xc5, 0x16, 0xba, 0x77, 0x19, 0xf5, 0x2a, 0x63, 0x83, 0xe1, 0x9d, 0x3b, 0x6c, 0x78, 0x78, 0x48, 0x87, 0x77, 0x7e, 0x95, 0x0e, 0xd9, 0x5d, 0xca, 0xe8, 0x5d, 0x4a, 0x55, 0xe5, 0xf8, 0xa3, 0xa3, 0xa3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x53, 0x15, 0xf1, 0x47, 0x47, 0xd9, 0x30, 0x9d, 0xa6, 0xc3, 0xd1, 0xd7, 0x00, 0x3f, 0x47, 0x87, 0x54, 0xd4, 0x01, 0xcd, 0x59, 0x8c, 0xe3, 0x03, 0xee, 0x5c, 0xb1, 0x58, 0x9c, 0xc3, 0x16, 0xba, 0x73, 0x04, 0x2a, 0xe0, 0xce, 0x49, 0xfc, 0x74, 0x9a, 0x0d, 0x8b, 0x45, 0x3a, 0x4c, 0x17, 0x00, 0x7f, 0x8e, 0x0e, 0x09, 0x54, 0x3a, 0x07, 0xf8, 0x73, 0x12, 0xbf, 0xd7, 0xeb, 0x35, 0xeb, 0xf5, 0x7a, 0x13, 0x5b, 0xe8, 0xf2, 0x4a, 0x2c, 0x82, 0x2d, 0xe2, 0xf7, 0x7a, 0x6c, 0x58, 0xaf, 0xd3, 0x61, 0x6f, 0x1b, 0xf0, 0x9b, 0x40, 0xb3, 0x49, 0xa9, 0x05, 0x15, 0xdb, 0x6f, 0x1c, 0x1d, 0xbd, 0x7c, 0x84, 0xe5, 0xd1, 0xc3, 0xa3, 0xa3, 0xe1, 0xf0, 0xe8, 0xd1, 0x70, 0xf8, 0x10, 0xbb, 0xf0, 0xcf, 0xa3, 0x6f, 0x0f, 0x87, 0xaf, 0x28, 0x38, 0x1f, 0x07, 0x38, 0x9f, 0x17, 0x81, 0x3f, 0x94, 0xf8, 0xb2, 0x85, 0x7e, 0x00, 0xfe, 0x48, 0xd2, 0x7f, 0x24, 0xf1, 0x1f, 0xf9, 0xf8, 0x3f, 0x53, 0xaf, 0xff, 0x48, 0xfd, 0xd6, 0x76, 0xbd, 0xbe, 0x7d, 0x4b, 0xd4, 0x5e, 0x8f, 0xb7, 0x30, 0x72, 0x6b, 0xb7, 0xd7, 0x7b, 0xc9, 0x4e, 0xa7, 0x3f, 0x91, 0x1e, 0x7d, 0x2d, 0x9d, 0x7e, 0xed, 0x53, 0x69, 0xbd, 0x85, 0xbb, 0x4f, 0xfd, 0xd8, 0xe8, 0xe8, 0x0b, 0xef, 0x1e, 0x1e, 0xa6, 0x0e, 0xbf, 0xf2, 0xce, 0x21, 0xaf, 0xef, 0x7c, 0xe5, 0x50, 0xdd, 0xc3, 0xdd, 0x3b, 0xbf, 0xf8, 0xe5, 0x2f, 0x8f, 0x4c, 0x15, 0x8b, 0xe7, 0x8a, 0x85, 0xd7, 0x8b, 0xbc, 0xbe, 0x9e, 0x06, 0x2d, 0x63, 0x5b, 0x28, 0x16, 0xe0, 0x5f, 0xa4, 0xcd, 0xed, 0x8d, 0xb6, 0xe7, 0xd7, 0xd7, 0xf9, 0xfd, 0x2f, 0x80, 0x1f, 0x30, 0x8b, 0xa2, 0x6e, 0xfb, 0xec, 0xae, 0xc5, 0xc0, 0xf6, 0x83, 0xbb, 0x60, 0xff, 0x43, 0x59, 0xd1, 0x1f, 0x2c, 0x3a, 0x18, 0x32, 0x36, 0x1c, 0x72, 0x7b, 0xa3, 0xed, 0xd3, 0xf7, 0xa1, 0xc5, 0x2b, 0x9d, 0xfe, 0x09, 0xf0, 0x03, 0x0f, 0x3f, 0x47, 0x29, 0xd8, 0x9e, 0xd7, 0x5c, 0x9a, 0x32, 0xee, 0x07, 0xa3, 0x3e, 0x3e, 0xb7, 0x37, 0xda, 0xfe, 0xc1, 0x83, 0x07, 0x73, 0xc5, 0xb9, 0x39, 0xbc, 0x47, 0x1a, 0x1e, 0xfe, 0x1c, 0xa5, 0x60, 0x7b, 0xfa, 0x00, 0xea, 0x5c, 0x91, 0x32, 0xee, 0x07, 0x69, 0x1f, 0x9f, 0xdb, 0x1a, 0x6d, 0x5f, 0xc7, 0xf6, 0xab, 0xfc, 0xfe, 0xe7, 0xc0, 0x0f, 0x3c, 0xfc, 0xa6, 0xc5, 0xc0, 0xf6, 0x83, 0x26, 0xd8, 0xbf, 0x2e, 0x2b, 0xfa, 0x83, 0xc2, 0x87, 0x30, 0xb0, 0xe2, 0x7c, 0x00, 0xc7, 0x75, 0x78, 0xd8, 0x07, 0x82, 0xf0, 0xa8, 0x0f, 0x04, 0xe0, 0x06, 0x1f, 0x50, 0xf0, 0x38, 0x1f, 0xc0, 0x71, 0x84, 0xc7, 0xf9, 0x00, 0x8e, 0x23, 0x3c, 0xce, 0x07, 0x70, 0x1c, 0xe1, 0x71, 0x3e, 0x80, 0xe3, 0xc6, 0xf8, 0xe5, 0x25, 0x9d, 0xcb, 0xb1, 0xfb, 0xa6, 0xf8, 0x05, 0x38, 0xd8, 0x13, 0xea, 0x7d, 0xa8, 0xd6, 0x73, 0x28, 0xdb, 0xd7, 0x9c, 0x97, 0xac, 0xef, 0x53, 0x41, 0xe7, 0x8a, 0x54, 0x46, 0x78, 0x05, 0xf5, 0x17, 0xb1, 0x44, 0xe0, 0xdf, 0x7a, 0xd9, 0x9b, 0x53, 0x3c, 0x67, 0x59, 0xbc, 0x7e, 0xf7, 0xc9, 0x13, 0xde, 0x7e, 0xf3, 0xe5, 0xa3, 0xa2, 0x5e, 0x14, 0x5c, 0x9f, 0xa7, 0x15, 0xeb, 0x63, 0x5e, 0xfc, 0xf8, 0xc5, 0xf6, 0x3e, 0x8b, 0xc6, 0xaf, 0x85, 0x31, 0x3b, 0x80, 0xd8, 0xe5, 0x3e, 0x10, 0x8e, 0xdf, 0xe7, 0xc1, 0xc3, 0xe3, 0x27, 0x4f, 0xac, 0xb3, 0x72, 0x56, 0xce, 0xca, 0x0f, 0xa9, 0x10, 0x22, 0x2a, 0x64, 0x73, 0x4a, 0x18, 0xaf, 0x7a, 0xa1, 0x8c, 0x00, 0x08, 0x2a, 0xc5, 0xac, 0x80, 0x93, 0x58, 0x28, 0xc9, 0x22, 0x1c, 0x2e, 0x26, 0x70, 0xb1, 0x0d, 0x12, 0x00, 0xda, 0xcc, 0x12, 0xe3, 0x4c, 0xf6, 0x03, 0xf8, 0x62, 0x8c, 0xc3, 0xe5, 0xdc, 0xe0, 0xfa, 0x4c, 0xd0, 0x57, 0x6b, 0x30, 0x12, 0x59, 0x1f, 0xf9, 0x17, 0xf8, 0x96, 0xa8, 0x0a, 0x04, 0x49, 0x3c, 0xae, 0xfa, 0xec, 0x69, 0xf4, 0xf1, 0x22, 0x06, 0xf9, 0xa8, 0x5a, 0x9b, 0xf1, 0xfb, 0xa0, 0x78, 0xbe, 0xce, 0x4c, 0xfa, 0x13, 0x32, 0x51, 0xa1, 0x3b, 0xae, 0xbf, 0x30, 0xff, 0x30, 0x9f, 0x50, 0x5e, 0x8d, 0xf8, 0x8c, 0x80, 0xea, 0x99, 0x57, 0xb1, 0x1f, 0x30, 0x1f, 0x25, 0xc8, 0x12, 0x81, 0x96, 0x60, 0x4b, 0x69, 0x10, 0xee, 0xf1, 0xad, 0xec, 0x63, 0x51, 0x83, 0x7d, 0x99, 0xa8, 0xdc, 0x46, 0xcc, 0xe0, 0x24, 0xd4, 0xaf, 0x11, 0xfb, 0x4a, 0x19, 0xa9, 0xb4, 0x5f, 0x78, 0x57, 0x20, 0x61, 0xe8, 0x3f, 0x96, 0xb2, 0xb1, 0xc9, 0x7f, 0x38, 0x6d, 0x13, 0x7e, 0xc8, 0x3f, 0x68, 0xd4, 0x3f, 0x4c, 0xad, 0x36, 0x01, 0x94, 0x84, 0xda, 0xc5, 0x3f, 0x74, 0x64, 0x16, 0xf5, 0x2f, 0x65, 0x5f, 0xd9, 0x46, 0xa4, 0xe7, 0x7a, 0x31, 0xf0, 0xa6, 0xf3, 0xc8, 0x88, 0x11, 0x17, 0x17, 0x97, 0x7a, 0x23, 0x3c, 0x86, 0xac, 0xa0, 0xfc, 0xca, 0x9f, 0x94, 0x5d, 0x68, 0x64, 0x5b, 0x85, 0xeb, 0x52, 0xe1, 0xe3, 0x06, 0xf7, 0xf1, 0xf0, 0x69, 0x0c, 0xbe, 0xee, 0xbf, 0x4a, 0xc7, 0x11, 0xfa, 0x44, 0xca, 0x47, 0x24, 0xbf, 0x21, 0xf6, 0x99, 0x8c, 0x33, 0x16, 0x05, 0x7b, 0x7a, 0x97, 0x36, 0xa6, 0x06, 0xfd, 0x2a, 0xbe, 0x54, 0x8d, 0xe8, 0x4e, 0xe6, 0x17, 0xc1, 0x8b, 0x15, 0xf1, 0x4f, 0xcb, 0xf7, 0x90, 0xa8, 0xff, 0x11, 0x9f, 0x06, 0x6f, 0x23, 0xfa, 0xc1, 0x2a, 0xf3, 0x17, 0x15, 0x3a, 0x8c, 0x8d, 0x0f, 0x16, 0xcc, 0x5f, 0x54, 0xe4, 0x10, 0x35, 0x40, 0xbc, 0x7b, 0xaa, 0x8d, 0xc7, 0xa8, 0x4d, 0x77, 0x3f, 0x55, 0xe3, 0x5c, 0x87, 0xc6, 0xb9, 0x96, 0xe6, 0x57, 0x7a, 0xce, 0xd2, 0xf3, 0x5b, 0xa2, 0x6f, 0x52, 0x4b, 0xe6, 0x5e, 0x19, 0x7a, 0x4c, 0xe5, 0x5b, 0x83, 0x69, 0x59, 0xd4, 0xc4, 0x90, 0x29, 0x09, 0x64, 0x1d, 0xc2, 0xf4, 0x4b, 0xf6, 0xf5, 0xfc, 0x0a, 0x5d, 0xcc, 0x5e, 0x16, 0xb6, 0x81, 0xfc, 0x2a, 0x63, 0x1b, 0x33, 0x14, 0x81, 0x0e, 0xf1, 0x6c, 0x48, 0x3c, 0xdd, 0x73, 0x19, 0x34, 0xdf, 0x08, 0xc6, 0x20, 0x51, 0xcc, 0x73, 0x39, 0x71, 0x59, 0xa2, 0xbb, 0x30, 0x23, 0x7e, 0xdc, 0xa9, 0xe7, 0x18, 0xf1, 0x75, 0x41, 0x08, 0x21, 0x92, 0x4a, 0xb0, 0x95, 0xe3, 0xba, 0xf3, 0x50, 0xc1, 0x38, 0x08, 0xc2, 0x78, 0x9a, 0x38, 0x2b, 0x67, 0xe5, 0xb4, 0x17, 0x7e, 0x44, 0x36, 0x1c, 0x0e, 0x07, 0xf8, 0xa6, 0x8f, 0x85, 0xb7, 0xfd, 0xbe, 0x6c, 0x87, 0x12, 0xdc, 0xd7, 0xc1, 0xfd, 0xbe, 0x98, 0x3e, 0x14, 0xad, 0x5f, 0x0c, 0x74, 0x42, 0xe0, 0x08, 0x9d, 0x33, 0x0b, 0xfc, 0x70, 0xcb, 0xa0, 0x8f, 0x86, 0x04, 0xbb, 0x41, 0x45, 0x03, 0xb1, 0x68, 0x19, 0x6a, 0xa5, 0x1f, 0x06, 0x2a, 0x3f, 0x41, 0x3a, 0x31, 0xf8, 0xca, 0x4f, 0x8c, 0xf8, 0x67, 0x16, 0xf8, 0x18, 0xc5, 0xbf, 0xa1, 0x32, 0xdf, 0xac, 0xfd, 0x98, 0x6a, 0xc2, 0xc7, 0x00, 0x87, 0xb1, 0xc1, 0xd0, 0x84, 0x8f, 0xe7, 0x4a, 0x43, 0xac, 0xfd, 0x38, 0xfc, 0xc1, 0x50, 0x54, 0x66, 0xc4, 0x47, 0x3c, 0x5e, 0x4f, 0x5c, 0x3f, 0x8a, 0x3f, 0x0c, 0x55, 0x03, 0xfe, 0x50, 0xaf, 0x89, 0xfc, 0x9b, 0xf1, 0x3d, 0xd9, 0x07, 0x52, 0x85, 0x3a, 0xbe, 0x2e, 0x3b, 0xde, 0x9f, 0x1c, 0x7f, 0x10, 0x5c, 0x10, 0x37, 0xb2, 0x32, 0x16, 0x13, 0xa0, 0xec, 0x29, 0x8b, 0x1e, 0xcc, 0x2c, 0x6c, 0x6f, 0x33, 0x2f, 0x9a, 0xad, 0xa3, 0xbc, 0x48, 0x39, 0x63, 0xf1, 0xa5, 0x8d, 0x13, 0xf0, 0xd9, 0x20, 0x09, 0xbf, 0xcf, 0xbe, 0x37, 0x7c, 0xcd, 0x4e, 0x71, 0xf8, 0xca, 0xd6, 0xdf, 0xcb, 0xfa, 0x83, 0x24, 0xfc, 0x7e, 0x02, 0x7e, 0xb8, 0xf4, 0x05, 0xcf, 0xbc, 0x0e, 0x9e, 0xa2, 0x26, 0xc4, 0xa5, 0x1f, 0x9f, 0xcf, 0xe0, 0x1c, 0xa6, 0xf8, 0x67, 0xc9, 0x79, 0x20, 0x09, 0x7f, 0x90, 0x84, 0xdf, 0x3f, 0x11, 0x7f, 0x30, 0x4c, 0xc2, 0xf7, 0xf2, 0xc7, 0x47, 0x58, 0x3f, 0x10, 0xbf, 0x66, 0x7c, 0x2f, 0xfe, 0x3f, 0x22, 0xff, 0x83, 0x24, 0x7c, 0x95, 0x07, 0x74, 0xdf, 0x8d, 0x79, 0x7e, 0xea, 0xbe, 0x73, 0x62, 0x6c, 0x3f, 0x4b, 0x1e, 0x60, 0x71, 0x7e, 0x15, 0xe4, 0xc5, 0xe0, 0x53, 0x83, 0x50, 0xfc, 0x78, 0xf9, 0x3a, 0x82, 0x3f, 0xd4, 0xf2, 0xb5, 0x19, 0x7f, 0xa0, 0xe2, 0x6f, 0x60, 0xc4, 0x97, 0x79, 0xbe, 0x9f, 0xb8, 0x7e, 0x02, 0x7e, 0x34, 0xdf, 0xc7, 0xe1, 0x07, 0xf2, 0x40, 0x18, 0x3f, 0x7e, 0xfd, 0xc1, 0x50, 0xcb, 0x01, 0x03, 0x13, 0xff, 0x2a, 0x07, 0xf4, 0x9f, 0xc1, 0x96, 0x7d, 0x29, 0xcb, 0x27, 0xbe, 0xf6, 0x69, 0x0b, 0xbf, 0x8e, 0xbc, 0xf7, 0x2a, 0xd4, 0x0f, 0xa1, 0xb2, 0x57, 0xa1, 0x7e, 0x28, 0x5a, 0x18, 0x78, 0xfc, 0x18, 0x06, 0x1f, 0xab, 0x09, 0x4f, 0xac, 0xc7, 0x00, 0x78, 0x0f, 0x26, 0x3c, 0x66, 0x72, 0xd2, 0xe3, 0x27, 0xf8, 0x27, 0x6e, 0x71, 0xaa, 0x56, 0x25, 0xf8, 0xac, 0x9c, 0x95, 0xb3, 0xf2, 0x7f, 0x7a, 0x13, 0xaf, 0x55, 0xcb, 0x8a, 0x7e, 0x3f, 0xa1, 0x96, 0x95, 0xf4, 0xa5, 0x9e, 0x8a, 0xa3, 0xe9, 0x40, 0x1b, 0x3e, 0x7f, 0x25, 0xf2, 0x18, 0x0e, 0x6f, 0xa2, 0xc7, 0xaf, 0xfe, 0xb9, 0x2b, 0x55, 0xfd, 0xd0, 0x11, 0x24, 0xc7, 0x27, 0xe2, 0xec, 0x8e, 0x92, 0xe8, 0xf9, 0x32, 0x4d, 0x92, 0x4f, 0x9d, 0xe9, 0x12, 0xfd, 0xb8, 0x2e, 0x72, 0x7c, 0xec, 0x55, 0x6a, 0x38, 0x7e, 0x27, 0x44, 0x1c, 0xfb, 0xf3, 0x63, 0x3f, 0x62, 0x3e, 0xa2, 0xa7, 0x2c, 0xfe, 0x0c, 0x57, 0xff, 0x94, 0x11, 0xc7, 0x2f, 0x7d, 0x8a, 0xb7, 0x59, 0x4a, 0xa2, 0xe7, 0xf7, 0x56, 0x44, 0x7f, 0x51, 0xba, 0x4c, 0x9e, 0x9e, 0xb2, 0xe8, 0xe7, 0x0b, 0xef, 0x7c, 0x57, 0xf9, 0x40, 0xf8, 0xfb, 0x18, 0xf3, 0xbe, 0xaf, 0xc9, 0x29, 0x11, 0x38, 0xf1, 0xbe, 0xbb, 0x11, 0x1a, 0x4f, 0x9f, 0x51, 0x35, 0xd7, 0x8a, 0xe0, 0x33, 0x6d, 0x1d, 0xd3, 0xe7, 0x17, 0x05, 0x37, 0xf1, 0xaf, 0xaf, 0x6f, 0xf8, 0xfc, 0x27, 0xf1, 0x49, 0xa0, 0x35, 0xc3, 0x85, 0x71, 0x28, 0x8b, 0xd7, 0xb9, 0x49, 0xff, 0x61, 0x78, 0xc4, 0xbe, 0x9a, 0x6d, 0x4c, 0xfe, 0xa7, 0xdb, 0xde, 0xe4, 0x03, 0x01, 0x3c, 0xd3, 0xe7, 0x2d, 0x4d, 0x7e, 0x63, 0xfc, 0x4a, 0xbf, 0xe5, 0x67, 0xdf, 0x86, 0x35, 0x94, 0xfc, 0xbc, 0x32, 0xd1, 0x86, 0xed, 0x2f, 0x60, 0x7e, 0x6b, 0xc6, 0x8f, 0xb3, 0x8f, 0x46, 0xdf, 0x80, 0xaf, 0xdb, 0x3f, 0xce, 0xbf, 0x02, 0x70, 0x83, 0xfc, 0x7c, 0x9c, 0x12, 0xcd, 0x8e, 0xba, 0xfb, 0x05, 0x65, 0x0b, 0xcb, 0x47, 0xd5, 0x47, 0x8b, 0x58, 0xff, 0x27, 0x9e, 0x91, 0x99, 0xc1, 0xbf, 0x39, 0x4d, 0xf9, 0x4d, 0x81, 0xb7, 0x61, 0xfd, 0x85, 0x6b, 0x98, 0x3e, 0x95, 0xbc, 0xf1, 0x3c, 0x49, 0x22, 0xf9, 0x8f, 0xd3, 0x27, 0x72, 0x0e, 0x35, 0xf1, 0x1f, 0xd4, 0x6f, 0xa2, 0xfe, 0x59, 0x7c, 0x7c, 0x04, 0xf1, 0x49, 0x02, 0x7e, 0x54, 0x7f, 0x4c, 0xe5, 0x3f, 0x66, 0xf2, 0x0f, 0x12, 0x55, 0x82, 0xc9, 0x3e, 0x71, 0xfc, 0x87, 0x61, 0x24, 0xfa, 0xfc, 0x20, 0xc4, 0xd7, 0x21, 0xa3, 0x66, 0xfb, 0xeb, 0x72, 0x06, 0xe3, 0x97, 0x88, 0xaa, 0xf3, 0x19, 0xb6, 0xbf, 0x96, 0x5b, 0x22, 0x9f, 0xd1, 0x58, 0xe8, 0xf9, 0x92, 0xf0, 0x79, 0xd1, 0xbf, 0x89, 0x3e, 0x13, 0xbc, 0xe7, 0x0f, 0x89, 0xf9, 0x7c, 0xfb, 0x94, 0xdf, 0x94, 0xc2, 0xfe, 0x6b, 0x58, 0xd2, 0x88, 0x83, 0xb9, 0x5b, 0xe4, 0x6f, 0x83, 0xff, 0x86, 0x7c, 0xc0, 0x84, 0xcf, 0xd4, 0x27, 0x60, 0x16, 0x4d, 0x90, 0x49, 0xf4, 0x83, 0xcf, 0x28, 0x43, 0x0e, 0xc4, 0x3d, 0x05, 0x91, 0x7b, 0x0b, 0xe3, 0xf3, 0x4f, 0xe6, 0x38, 0x19, 0x47, 0x56, 0x28, 0x46, 0x99, 0x21, 0x07, 0x45, 0x04, 0xb4, 0xe2, 0xfd, 0x33, 0x9c, 0xfc, 0x89, 0x89, 0xbe, 0x9e, 0x1f, 0x0d, 0xf6, 0xd5, 0xab, 0x65, 0x90, 0x5f, 0x3d, 0x1b, 0x79, 0xfc, 0x13, 0x03, 0x3c, 0x89, 0xff, 0x50, 0x0c, 0x9b, 0x9e, 0x21, 0x27, 0xe7, 0x80, 0x90, 0x7d, 0x68, 0xcc, 0x33, 0xc0, 0xa0, 0x1e, 0xdd, 0xfe, 0xc6, 0xf8, 0x0f, 0xdb, 0xce, 0x24, 0x7f, 0x42, 0xfc, 0x87, 0x63, 0xd8, 0xe4, 0xcb, 0x81, 0x1c, 0x40, 0x4d, 0xfa, 0x25, 0xde, 0x37, 0x74, 0x13, 0x3c, 0x2c, 0x3b, 0x4d, 0xca, 0x01, 0x31, 0xf1, 0x4f, 0x63, 0xe2, 0xdf, 0x22, 0x86, 0x6a, 0x8a, 0x7f, 0x16, 0x13, 0xff, 0xe2, 0x83, 0xb3, 0xf5, 0x7c, 0x7e, 0x2d, 0x7b, 0x56, 0xce, 0xca, 0x59, 0x39, 0x2b, 0xc1, 0xfd, 0x01, 0xd5, 0x5e, 0x4b, 0x68, 0x34, 0xf5, 0x58, 0x24, 0x61, 0xff, 0x40, 0x88, 0xf7, 0x13, 0x4a, 0xaf, 0x8d, 0xe4, 0x7f, 0xbd, 0x35, 0xa4, 0xc7, 0xc0, 0xbb, 0x2b, 0x89, 0x39, 0x9e, 0x50, 0x3f, 0xcd, 0x21, 0x66, 0xfe, 0xe3, 0x19, 0x0c, 0xc9, 0x48, 0xcc, 0xfb, 0x33, 0x6a, 0x99, 0xdf, 0x9f, 0x95, 0x8c, 0xea, 0x1c, 0x22, 0x4e, 0x87, 0xec, 0xa4, 0x73, 0x88, 0xd0, 0x71, 0x84, 0x15, 0xdd, 0xe6, 0x3c, 0xb5, 0xbd, 0xac, 0xf8, 0x23, 0x00, 0xe3, 0x99, 0x81, 0xfe, 0xd3, 0x26, 0x66, 0xe2, 0x5d, 0x93, 0xdf, 0xf4, 0x78, 0xd3, 0xe9, 0x27, 0xc1, 0x2d, 0x03, 0x7d, 0xa2, 0xf9, 0x86, 0xe9, 0xf9, 0xc7, 0x88, 0xf6, 0xd8, 0x24, 0xe6, 0xed, 0x17, 0xb1, 0x82, 0x3e, 0x16, 0xd1, 0x1b, 0x09, 0x1e, 0xf3, 0x44, 0xe8, 0x93, 0x64, 0xfc, 0x24, 0xfe, 0xac, 0x84, 0xd8, 0x30, 0xc1, 0x13, 0x8e, 0x67, 0x62, 0xf7, 0xe2, 0x8a, 0x27, 0x66, 0xdc, 0xdb, 0x24, 0xfe, 0x3c, 0x31, 0x20, 0xbf, 0x89, 0x47, 0xaa, 0xcb, 0x6f, 0x99, 0xe3, 0x47, 0xd7, 0x0f, 0x31, 0x6d, 0x6f, 0x48, 0xb0, 0x35, 0xd9, 0xc7, 0x3b, 0x5e, 0x8b, 0xc1, 0x8f, 0xf3, 0x3f, 0xdd, 0xfe, 0x46, 0xff, 0x0a, 0xc1, 0x49, 0xdc, 0xfa, 0x31, 0xf9, 0x81, 0x90, 0x13, 0xe4, 0x0b, 0xe5, 0x87, 0x38, 0xff, 0xb2, 0x82, 0x3f, 0x0d, 0x8c, 0xd2, 0x8f, 0xc9, 0x95, 0xe1, 0xad, 0x9f, 0x89, 0x3e, 0x0b, 0xc5, 0x68, 0x92, 0xfe, 0x48, 0x8c, 0xfd, 0x48, 0x0c, 0x7f, 0x01, 0xfb, 0x99, 0xf4, 0x17, 0xd2, 0x51, 0x9c, 0xfd, 0x98, 0x26, 0xa3, 0x49, 0xff, 0x71, 0xf1, 0x1f, 0xd6, 0x6f, 0x9c, 0xfe, 0x4e, 0xb2, 0x1f, 0x39, 0x41, 0xff, 0x1e, 0x8f, 0x31, 0xf8, 0x34, 0xce, 0x3e, 0x1a, 0xdc, 0xc4, 0x5f, 0x38, 0xbf, 0x30, 0xd3, 0xf9, 0x9f, 0x2e, 0xdf, 0x09, 0x31, 0x6c, 0x3a, 0x7e, 0x0f, 0xf8, 0x5f, 0x8c, 0x7d, 0x9e, 0xfa, 0x38, 0x9f, 0x58, 0xcf, 0xfc, 0xfe, 0xcf, 0x42, 0x79, 0x22, 0xcc, 0x3b, 0xb3, 0xe2, 0xe3, 0x37, 0x9c, 0x03, 0x68, 0xcc, 0xcf, 0xc3, 0xe3, 0xec, 0x1b, 0xc8, 0x51, 0x71, 0xf8, 0x21, 0x3f, 0xb2, 0x12, 0x72, 0x5c, 0xf8, 0x8c, 0x94, 0x18, 0x62, 0x28, 0x2e, 0x77, 0x1b, 0xe9, 0x93, 0x60, 0x20, 0x13, 0x03, 0x7d, 0xa2, 0x1d, 0x1d, 0x99, 0xe2, 0x37, 0x29, 0xbf, 0x98, 0x72, 0x80, 0x65, 0x25, 0xe7, 0x00, 0x2b, 0x21, 0x86, 0xa9, 0x95, 0x8c, 0xcf, 0xe2, 0x72, 0xa8, 0x6e, 0x1f, 0x43, 0x8c, 0xb0, 0xf8, 0xc7, 0xa3, 0x7f, 0xfc, 0x1c, 0xb7, 0xbf, 0x20, 0xf1, 0xfb, 0xaf, 0x70, 0x0c, 0xd3, 0x93, 0xe0, 0x56, 0x3c, 0xdc, 0x14, 0xff, 0xe1, 0xfd, 0x1b, 0x49, 0xa0, 0x1f, 0xf7, 0x7d, 0x46, 0xe5, 0xc5, 0xa4, 0xf8, 0x67, 0x31, 0xf1, 0x4f, 0x0d, 0x3e, 0x66, 0xf4, 0x0f, 0x62, 0x8e, 0x7f, 0x4f, 0xbf, 0x2f, 0xe6, 0x5e, 0xb5, 0xe8, 0x3d, 0xd3, 0xf5, 0xed, 0xef, 0x98, 0xae, 0xd3, 0xf0, 0x72, 0xc2, 0x7e, 0xdf, 0x74, 0x0d, 0x1e, 0x99, 0xae, 0x53, 0xf1, 0x32, 0xf6, 0xff, 0xcc, 0xbe, 0xdf, 0x78, 0x3f, 0x7c, 0xa1, 0x7d, 0x1f, 0x7f, 0x10, 0xbe, 0xce, 0xec, 0x7b, 0x5a, 0xec, 0x8b, 0x57, 0xd4, 0xbe, 0x78, 0x9d, 0xd9, 0xf7, 0xcc, 0xbe, 0x1f, 0xf7, 0x72, 0x6c, 0x30, 0x6f, 0xff, 0xde, 0xb1, 0xc1, 0xbc, 0xc3, 0x53, 0x61, 0xdf, 0x63, 0x83, 0x79, 0xbf, 0xf5, 0xf0, 0xd8, 0x60, 0xde, 0x0f, 0x1f, 0x9e, 0x06, 0x79, 0xbf, 0xfe, 0x7b, 0x51, 0x03, 0x1f, 0x3d, 0xfc, 0xc7, 0x7f, 0x8a, 0x1a, 0xf8, 0xe8, 0x54, 0xc8, 0xfb, 0xe7, 0x7f, 0x61, 0x8a, 0xdf, 0xff, 0xfe, 0x9f, 0x53, 0x9b, 0x9f, 0xfb, 0xf7, 0xf8, 0x9f, 0x2c, 0xf7, 0x8e, 0x79, 0x81, 0x60, 0xe5, 0x7f, 0xb2, 0x7c, 0x47, 0x8c, 0x9e, 0x8a, 0xfc, 0xfc, 0xde, 0xfb, 0xfc, 0x4f, 0x96, 0xf7, 0x8f, 0x8f, 0xef, 0x3f, 0x38, 0x3e, 0x7e, 0xfc, 0xcf, 0x1f, 0xf0, 0x3f, 0x59, 0x3e, 0x38, 0x3e, 0xfe, 0xcb, 0xbf, 0x3a, 0x1d, 0xf2, 0x1e, 0x47, 0xca, 0x1f, 0x7c, 0xf3, 0xd8, 0x50, 0xfe, 0xe5, 0xbb, 0xa7, 0x44, 0xde, 0x77, 0x7f, 0x29, 0x20, 0xd7, 0x57, 0x7f, 0xe7, 0xb7, 0x7e, 0xfb, 0x77, 0xbf, 0x76, 0xfc, 0xcb, 0xbf, 0x12, 0x18, 0xfd, 0xdb, 0xbf, 0xfb, 0xeb, 0xbf, 0xf9, 0xfb, 0x7f, 0x38, 0x15, 0xf2, 0xfe, 0xda, 0xaf, 0x07, 0x24, 0xfb, 0xe3, 0x3f, 0xf9, 0xc3, 0x3f, 0xfa, 0xd3, 0x3f, 0x3b, 0xfe, 0x8d, 0xdf, 0x0c, 0x8c, 0xfe, 0xfb, 0x7f, 0xfc, 0xeb, 0xbf, 0xfd, 0xe7, 0x7f, 0x8d, 0xdc, 0xb3, 0xac, 0x4f, 0xf2, 0xeb, 0xd5, 0x11, 0xbc, 0x7e, 0x94, 0x5f, 0xfc, 0xde, 0x7a, 0x9a, 0x8b, 0xff, 0xef, 0x58, 0xd6, 0x39, 0xbc, 0x5e, 0x84, 0xeb, 0x25, 0xb8, 0xc8, 0x39, 0x32, 0x62, 0x05, 0x2f, 0x12, 0xba, 0x74, 0x0a, 0xe7, 0x80, 0xc4, 0xcf, 0x5b, 0xaf, 0x58, 0xaf, 0xbc, 0xf0, 0xca, 0x0b, 0x4f, 0xb7, 0x66, 0xf8, 0x7a, 0xf1, 0x93, 0xe7, 0x7e, 0xdc, 0xaa, 0x5c, 0x2e, 0x2f, 0x97, 0x4b, 0xa9, 0xb7, 0x53, 0x23, 0x0b, 0xab, 0x8b, 0x65, 0xbb, 0x94, 0x1a, 0x81, 0xdb, 0x91, 0x37, 0x2f, 0xd9, 0x58, 0x4a, 0xd3, 0xb3, 0x39, 0xe8, 0x5d, 0x54, 0xbd, 0x02, 0xf6, 0xd6, 0x2b, 0x6b, 0x4b, 0x2b, 0x97, 0xec, 0xd2, 0x0c, 0x76, 0x56, 0xae, 0x2d, 0xbf, 0x59, 0x5e, 0x03, 0xd0, 0x34, 0xf6, 0x3e, 0x5b, 0xfe, 0xfc, 0x8d, 0xd5, 0xb5, 0xc5, 0x52, 0x11, 0x3b, 0xf3, 0x57, 0x97, 0x38, 0x16, 0x27, 0xb1, 0xb0, 0xba, 0xbc, 0x5c, 0x5e, 0xa9, 0x94, 0xa6, 0x39, 0xd6, 0xfa, 0xd2, 0xa5, 0x15, 0x4e, 0x90, 0x4f, 0x5c, 0x2f, 0x5f, 0x29, 0x2f, 0x54, 0x6c, 0x09, 0x5b, 0xb8, 0xb6, 0xb6, 0xbe, 0x0a, 0x14, 0xc5, 0x5a, 0x97, 0xe7, 0x17, 0x57, 0x6f, 0xd8, 0xa5, 0xae, 0xbb, 0xe7, 0x70, 0x9a, 0x57, 0x2a, 0x1b, 0x17, 0x57, 0x81, 0x4e, 0xbd, 0xda, 0xec, 0xf0, 0x91, 0xe5, 0xf9, 0xca, 0xc2, 0xe5, 0x8d, 0xc5, 0xf2, 0x95, 0xa5, 0xe5, 0xa5, 0x4a, 0x79, 0x6d, 0x5d, 0x4d, 0xbd, 0x9d, 0x4b, 0xa5, 0x46, 0x2e, 0xcd, 0x2f, 0x97, 0xaf, 0xce, 0x2f, 0x4a, 0xa1, 0x2a, 0xab, 0xd7, 0x16, 0x2e, 0xc3, 0x3d, 0xef, 0x00, 0xa9, 0xab, 0x97, 0xe7, 0x4b, 0xd3, 0x6f, 0x4c, 0x21, 0x95, 0xdb, 0x02, 0xe3, 0x76, 0x2a, 0xb5, 0x70, 0xb9, 0xbc, 0xf0, 0xd9, 0x8d, 0x95, 0xf2, 0x8d, 0x8d, 0xeb, 0x40, 0x6d, 0x69, 0x75, 0x85, 0x13, 0x4c, 0xad, 0xac, 0x6e, 0xac, 0xaf, 0x5e, 0x5b, 0x59, 0x14, 0x0b, 0xa7, 0x2e, 0x2d, 0x5d, 0xdc, 0xb8, 0x52, 0x5e, 0xb9, 0x54, 0xb9, 0x5c, 0x2a, 0x4c, 0xd9, 0x13, 0x13, 0x76, 0xa3, 0x65, 0x77, 0x9c, 0x5a, 0xbb, 0xb5, 0xd5, 0x49, 0xad, 0xaf, 0x5e, 0xac, 0xdc, 0x98, 0x5f, 0x2b, 0x6f, 0xac, 0x95, 0x57, 0x16, 0xcb, 0xa8, 0x2b, 0x89, 0x74, 0x7d, 0xfd, 0xf3, 0x2b, 0x0b, 0x82, 0xdc, 0xc2, 0x5a, 0x65, 0x63, 0x79, 0x75, 0x65, 0xa9, 0xb2, 0xba, 0xa6, 0x51, 0x5c, 0x5f, 0x98, 0xbf, 0x52, 0x2e, 0x15, 0x53, 0xd7, 0x96, 0xe4, 0xed, 0x4c, 0xea, 0xfa, 0xea, 0x95, 0x6b, 0x60, 0x9f, 0xe9, 0x42, 0x2a, 0x35, 0x11, 0x5f, 0x52, 0xf5, 0xbd, 0x56, 0xad, 0xdb, 0x68, 0xb7, 0xec, 0xca, 0xd2, 0x42, 0x26, 0x9b, 0x1a, 0xa9, 0x35, 0x3b, 0xd8, 0x34, 0xdb, 0xb5, 0x6a, 0xd3, 0x6e, 0x56, 0x37, 0x9d, 0x66, 0x29, 0x5d, 0xd9, 0x69, 0x74, 0x6c, 0xf8, 0xeb, 0x1c, 0x74, 0xba, 0xce, 0x4d, 0x1b, 0x98, 0xad, 0x37, 0xb6, 0xf7, 0xdc, 0x2a, 0xc7, 0xab, 0x55, 0xdd, 0xae, 0xdb, 0xd8, 0xda, 0x76, 0xd2, 0x0a, 0xab, 0xd3, 0x78, 0xcb, 0x29, 0xed, 0xba, 0x8d, 0x56, 0x37, 0xc3, 0x09, 0xe4, 0xa6, 0x72, 0x13, 0xe7, 0x81, 0xa6, 0x3e, 0x94, 0x29, 0xcc, 0x4c, 0x4d, 0xe0, 0xc4, 0xec, 0xe4, 0x64, 0x21, 0x97, 0x99, 0x2e, 0x9e, 0x87, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xad, 0xad, 0x14, 0x97, 0x12, 0x2d, 0x58, 0x5e, 0xe3, 0x0e, 0x06, 0x0a, 0xad, 0x94, 0x3f, 0x57, 0xfa, 0xc2, 0x17, 0x40, 0xe1, 0xaf, 0xdf, 0x72, 0xdc, 0x0e, 0x2e, 0x3c, 0x3d, 0x3d, 0x05, 0xdd, 0x6a, 0x17, 0x56, 0xdf, 0xdc, 0xeb, 0x3a, 0xf6, 0x2d, 0xa7, 0x56, 0xb4, 0xb7, 0x77, 0xf7, 0x36, 0xae, 0x3b, 0x6e, 0xd7, 0xd9, 0xbf, 0x10, 0x06, 0x16, 0x38, 0xb0, 0xe2, 0xec, 0x2f, 0xb4, 0xdb, 0xee, 0x56, 0x04, 0x3c, 0xc3, 0xc1, 0x0b, 0xed, 0x66, 0xdb, 0x45, 0xd8, 0x5e, 0xab, 0x51, 0x6f, 0xbb, 0x37, 0xed, 0x9b, 0xd5, 0xae, 0x80, 0x2c, 0xb7, 0xb7, 0x9c, 0xe6, 0xf5, 0x86, 0xd3, 0xbb, 0xea, 0xb6, 0x7f, 0xd6, 0xe1, 0x3a, 0x5b, 0xae, 0x02, 0x3e, 0x5f, 0xe8, 0x56, 0xd5, 0x3d, 0x68, 0xb4, 0xb6, 0x05, 0x9d, 0x9a, 0xa2, 0xa1, 0x8d, 0x16, 0xec, 0xae, 0xb6, 0xf0, 0xad, 0x76, 0x63, 0x0b, 0x28, 0x37, 0x5a, 0x19, 0xbc, 0xcb, 0x2a, 0xc7, 0xe2, 0x88, 0x76, 0x29, 0xc8, 0xc8, 0x88, 0x42, 0x04, 0x00, 0x12, 0xca, 0xe8, 0x52, 0x64, 0xf9, 0x8c, 0xed, 0xe6, 0xc6, 0xd5, 0x76, 0xa7, 0xc1, 0xcd, 0x51, 0x4a, 0x66, 0xd6, 0x1e, 0xe3, 0x3c, 0x66, 0x7c, 0x3d, 0xe5, 0xec, 0xe9, 0xfc, 0x14, 0xa7, 0x73, 0x3b, 0x35, 0xf2, 0xc5, 0x2f, 0x82, 0x3b, 0x5f, 0x5d, 0xfa, 0x5c, 0xf9, 0x8a, 0x51, 0xd9, 0x93, 0x93, 0xbb, 0xae, 0x53, 0x6b, 0xf0, 0x91, 0x9d, 0xc6, 0xf6, 0xce, 0xae, 0x5d, 0x6f, 0xb6, 0xab, 0xdd, 0x44, 0x59, 0x95, 0x22, 0x3b, 0xd5, 0x9b, 0xbb, 0x4d, 0xc7, 0x2d, 0x2c, 0xda, 0x9d, 0xf6, 0x9e, 0x5b, 0x73, 0x74, 0x18, 0xa7, 0x62, 0x77, 0xdd, 0xed, 0x8d, 0x7d, 0xf3, 0xf0, 0x81, 0x79, 0xb8, 0x67, 0x1e, 0xde, 0x89, 0x0e, 0x77, 0x6a, 0xae, 0x69, 0x36, 0x0e, 0xc3, 0x6c, 0x2e, 0x9a, 0x5d, 0xbe, 0xb9, 0xd7, 0xac, 0x76, 0x9d, 0x2d, 0x08, 0xc9, 0xdd, 0xbd, 0xae, 0xed, 0x3a, 0x9d, 0x76, 0x73, 0x0f, 0x55, 0x97, 0x47, 0xf9, 0x50, 0x2e, 0x18, 0x2a, 0x71, 0x1b, 0x14, 0x66, 0xcf, 0xe7, 0xa7, 0x72, 0xd3, 0x33, 0x33, 0x5c, 0x75, 0x02, 0xfd, 0x72, 0xd5, 0xdd, 0x6a, 0x39, 0x9d, 0x8e, 0xdd, 0xae, 0x03, 0xdd, 0x6a, 0xab, 0xd9, 0x68, 0x39, 0x79, 0x01, 0xb2, 0x27, 0xde, 0xc8, 0x4f, 0x81, 0x69, 0x3a, 0xed, 0x7a, 0x57, 0x8c, 0x4c, 0x4c, 0x9f, 0xe7, 0x23, 0x37, 0x9d, 0xad, 0xc6, 0xde, 0x4d, 0x18, 0x13, 0xfc, 0xec, 0x00, 0x8d, 0x75, 0xc0, 0x2d, 0x21, 0x82, 0x89, 0xf0, 0x6e, 0x63, 0xdf, 0x69, 0x76, 0x78, 0xd2, 0x08, 0x2e, 0x31, 0x51, 0x08, 0xaf, 0x30, 0xc3, 0x07, 0x90, 0x62, 0x80, 0xfc, 0xd5, 0xc6, 0x7e, 0x69, 0xa2, 0xe8, 0x53, 0x5f, 0x6c, 0x74, 0x76, 0x9b, 0xd5, 0x03, 0xbb, 0x57, 0x75, 0x77, 0x25, 0xad, 0x29, 0x8e, 0xd9, 0x6a, 0xb7, 0x1c, 0xd1, 0x07, 0x07, 0x99, 0x14, 0x02, 0x38, 0xfb, 0x5d, 0xd7, 0xb9, 0xe9, 0x28, 0x7d, 0x20, 0x8e, 0x50, 0x08, 0x4e, 0x39, 0x3f, 0x83, 0x3a, 0x81, 0x9b, 0x99, 0x37, 0x50, 0x2d, 0xb6, 0x5c, 0x60, 0xfe, 0x66, 0x7b, 0xaf, 0xd5, 0xe5, 0x5a, 0xd9, 0xa9, 0x6e, 0xb5, 0x7b, 0xe0, 0xf8, 0x9d, 0x2f, 0xe5, 0x3d, 0x9e, 0xb0, 0xb7, 0x58, 0x75, 0xbf, 0x54, 0x9a, 0xca, 0xcf, 0x5e, 0x08, 0x8c, 0x5e, 0x01, 0x0f, 0xeb, 0x96, 0xa6, 0x71, 0x98, 0x53, 0x9a, 0x78, 0x4e, 0x45, 0xf2, 0xd5, 0x59, 0xbb, 0xf4, 0xa6, 0xdd, 0x6d, 0xdb, 0x57, 0x40, 0x89, 0x55, 0x57, 0x8a, 0x3e, 0xdf, 0xe9, 0xec, 0xa1, 0x1b, 0xef, 0x75, 0xf0, 0x5f, 0x31, 0xe5, 0x60, 0x17, 0x7c, 0x02, 0x5c, 0xba, 0xbb, 0x07, 0xf6, 0xb7, 0xbb, 0x98, 0x0c, 0x3b, 0x3b, 0xed, 0xbd, 0xe6, 0x16, 0xa8, 0xa8, 0x6b, 0x6f, 0x3a, 0x76, 0xcb, 0x71, 0xb6, 0x9c, 0x2d, 0x5f, 0xa4, 0x4a, 0x5b, 0xd0, 0x9c, 0xce, 0x88, 0x7e, 0x2d, 0xfb, 0xb6, 0xeb, 0x00, 0x76, 0x2b, 0x53, 0x9b, 0x03, 0x31, 0xa7, 0x66, 0xa6, 0x66, 0x66, 0xb3, 0x9f, 0xa9, 0x4d, 0x4e, 0x17, 0xf2, 0x3f, 0x55, 0xf8, 0xe9, 0xdd, 0x76, 0x2f, 0x93, 0xa9, 0x8d, 0xc3, 0xf8, 0xec, 0x6c, 0x76, 0x72, 0x1a, 0x9b, 0x5c, 0x21, 0x3f, 0x93, 0xbd, 0x70, 0x5b, 0xa8, 0xb9, 0xe8, 0xd1, 0xcb, 0xf0, 0x9e, 0x47, 0x8d, 0x67, 0xbc, 0x8c, 0xbf, 0x58, 0x2d, 0xef, 0x66, 0x73, 0x7a, 0x77, 0x3b, 0xd8, 0xdd, 0xcc, 0x22, 0x4d, 0x21, 0xa7, 0x18, 0x45, 0xf1, 0x51, 0xc6, 0xe7, 0x2b, 0xfc, 0xba, 0xbb, 0xbd, 0x69, 0x12, 0x1d, 0x24, 0x9c, 0x2a, 0x4e, 0x17, 0xa7, 0xde, 0xf8, 0x4c, 0x6d, 0x4c, 0x88, 0xce, 0x85, 0x1d, 0x43, 0x05, 0xd4, 0x72, 0x53, 0xf9, 0x99, 0xe9, 0xf3, 0xe7, 0xcf, 0x67, 0x27, 0x84, 0x22, 0x74, 0xe9, 0x91, 0x60, 0x8c, 0xec, 0x62, 0x2d, 0x29, 0xb9, 0xea, 0x6c, 0xeb, 0x1d, 0x5d, 0xea, 0x15, 0x90, 0xd9, 0xe9, 0x74, 0x6d, 0x47, 0x45, 0xba, 0x48, 0x4a, 0xf6, 0x76, 0xe3, 0x96, 0xd3, 0x12, 0x29, 0x01, 0x25, 0xdf, 0x6d, 0xc3, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xda, 0xe2, 0x1a, 0x70, 0x9a, 0xe0, 0xc3, 0xf5, 0x8e, 0xd3, 0x55, 0xda, 0x6a, 0x76, 0xda, 0xf6, 0x5b, 0x8e, 0xdb, 0xfe, 0x49, 0x8c, 0x4c, 0x8c, 0x79, 0xd7, 0x71, 0x54, 0xae, 0x28, 0xda, 0x17, 0x9d, 0x6e, 0x6d, 0x27, 0xc3, 0xc3, 0x04, 0x28, 0xe5, 0xf8, 0x0d, 0x4c, 0xcb, 0xf2, 0x4c, 0x0f, 0x23, 0x25, 0xd4, 0x50, 0xdb, 0xcd, 0xc0, 0xed, 0x18, 0x30, 0x35, 0x8e, 0xb0, 0x71, 0x1e, 0x4b, 0x10, 0x08, 0xa0, 0x8d, 0xd9, 0x6c, 0x76, 0x12, 0xc6, 0x79, 0x82, 0x97, 0x32, 0x7b, 0x7e, 0x30, 0x9d, 0x2f, 0x40, 0x22, 0x97, 0x56, 0x29, 0x2c, 0x66, 0x44, 0x46, 0xcd, 0x01, 0xa9, 0xfc, 0xfe, 0x41, 0x8e, 0xe7, 0x96, 0x6c, 0x1e, 0xe4, 0xf7, 0x25, 0x87, 0x28, 0xef, 0x56, 0x5b, 0x35, 0x07, 0x33, 0x87, 0x27, 0xbd, 0x4c, 0x26, 0xe0, 0x04, 0x2d, 0xa9, 0x18, 0x2e, 0xa6, 0x97, 0xee, 0x10, 0xc9, 0x93, 0x20, 0xfb, 0x36, 0x32, 0x2d, 0xb9, 0xbd, 0x20, 0x39, 0x9a, 0xc8, 0x20, 0xff, 0x13, 0x9e, 0x24, 0xd9, 0xec, 0x84, 0x12, 0x21, 0x2b, 0x4c, 0x38, 0x32, 0x22, 0x73, 0xc8, 0xa2, 0x7d, 0xa9, 0xba, 0xd7, 0xe9, 0x34, 0xaa, 0x2d, 0xdf, 0x57, 0x70, 0x44, 0x3a, 0x0a, 0xea, 0x48, 0xe5, 0xe4, 0x6a, 0xd3, 0xf1, 0xec, 0xec, 0xec, 0xef, 0x16, 0x32, 0x7c, 0x68, 0x0c, 0xd7, 0xc6, 0x35, 0x3c, 0xa1, 0x8a, 0x13, 0xdd, 0xea, 0xae, 0x47, 0xd6, 0xae, 0x37, 0x9a, 0x5d, 0xc7, 0xb5, 0xab, 0xcd, 0x36, 0xd8, 0x70, 0xa7, 0xed, 0xbe, 0x65, 0xab, 0xfc, 0xc8, 0x0d, 0x72, 0x19, 0x46, 0x8a, 0xbe, 0x41, 0xc4, 0x62, 0x9e, 0x45, 0xf8, 0x94, 0xcd, 0x92, 0xb0, 0x9a, 0x32, 0x58, 0x66, 0x02, 0x3c, 0x34, 0x87, 0x73, 0xc4, 0x83, 0x56, 0xf8, 0x60, 0x78, 0x12, 0xe6, 0xcb, 0xf0, 0xa4, 0xad, 0xc8, 0xa4, 0x20, 0x25, 0xb1, 0xfa, 0x56, 0xa7, 0x5b, 0xe2, 0x4a, 0x46, 0xb1, 0xf2, 0xfc, 0xd9, 0x87, 0x72, 0x2d, 0xb4, 0x5b, 0xf0, 0xdc, 0x05, 0xb0, 0x32, 0x1a, 0x58, 0xa8, 0xe7, 0x60, 0x36, 0xcc, 0xfb, 0xb8, 0x5c, 0x27, 0x25, 0x99, 0xd1, 0x35, 0x9a, 0xbd, 0xcd, 0x12, 0x57, 0x2b, 0xd0, 0xe6, 0xdc, 0x0b, 0x75, 0xea, 0x13, 0x6a, 0xde, 0x04, 0x4c, 0x3a, 0x86, 0x09, 0x5b, 0xfe, 0x84, 0x10, 0x05, 0x60, 0x6e, 0x4d, 0xd8, 0x45, 0x28, 0xdb, 0x0b, 0xa1, 0xbc, 0xe6, 0xa6, 0x99, 0xcd, 0xb1, 0xde, 0xe6, 0x78, 0x6d, 0xac, 0x57, 0x1b, 0xdf, 0x1a, 0xeb, 0x6d, 0x65, 0x27, 0x33, 0xd0, 0x85, 0x0e, 0xdc, 0x7a, 0xa6, 0x9b, 0x7d, 0x66, 0xd3, 0xcd, 0x26, 0x9b, 0xae, 0x1a, 0x31, 0x5d, 0x21, 0x6a, 0x95, 0x1f, 0x9c, 0x7d, 0xf9, 0x24, 0x27, 0x32, 0xa9, 0xf0, 0x83, 0x72, 0x82, 0xaa, 0xef, 0x04, 0x05, 0xa3, 0x8d, 0xbf, 0x9f, 0x5e, 0x22, 0x27, 0x38, 0xfe, 0x84, 0xc2, 0x47, 0x71, 0xa3, 0xea, 0x58, 0xaf, 0x3a, 0x1e, 0xf4, 0xa5, 0x71, 0x67, 0xac, 0xe7, 0xa0, 0x43, 0x55, 0xc7, 0x95, 0x4f, 0x8d, 0xc3, 0x80, 0xe7, 0x56, 0x92, 0xaa, 0xda, 0x1b, 0x69, 0x0a, 0x13, 0x3c, 0xe1, 0xde, 0x2a, 0xd6, 0x8f, 0x4c, 0xe6, 0x38, 0xd0, 0xf3, 0xaf, 0x27, 0x0e, 0xa0, 0xe4, 0xd4, 0x56, 0xcd, 0x5f, 0x7c, 0xbe, 0xd9, 0x84, 0xdd, 0x8d, 0x97, 0x4a, 0x77, 0xe0, 0x71, 0xc0, 0xdd, 0x98, 0x67, 0x58, 0xa7, 0x5e, 0x87, 0x7d, 0xb8, 0x48, 0xb9, 0x9e, 0x5f, 0x57, 0xdc, 0x86, 0x96, 0x5f, 0x35, 0x5f, 0x16, 0xb9, 0x0a, 0x79, 0x9c, 0x50, 0xbb, 0x73, 0xe5, 0xc1, 0x22, 0x16, 0x10, 0x84, 0x7e, 0x19, 0xf0, 0x5b, 0x1f, 0xcb, 0xdb, 0xd3, 0xfb, 0xfe, 0xc0, 0x45, 0x0f, 0x52, 0xf4, 0x5c, 0xc1, 0x83, 0xf9, 0x24, 0x3d, 0x2f, 0xf0, 0x61, 0x1e, 0x9e, 0x54, 0x47, 0xd0, 0x3e, 0x81, 0x47, 0x4d, 0xdb, 0xe5, 0x4f, 0x4e, 0x6d, 0x27, 0x0c, 0xf8, 0xf8, 0x1c, 0x85, 0xb7, 0x3b, 0x31, 0x8a, 0xcf, 0x4a, 0x88, 0xf7, 0xdd, 0x9d, 0xaa, 0xf7, 0xb8, 0xb9, 0x01, 0xbb, 0xc9, 0x90, 0x3a, 0xd4, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x80, 0xc7, 0x02, 0x72, 0x7c, 0xcc, 0xdb, 0x78, 0x8e, 0x23, 0x7b, 0xf9, 0x83, 0x31, 0xfe, 0x6f, 0x76, 0x8c, 0x6f, 0x64, 0xf7, 0x73, 0x1e, 0x60, 0x9f, 0x03, 0xf6, 0x25, 0xe0, 0x20, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x38, 0xee, 0x3d, 0x15, 0xff, 0xeb, 0xc1, 0x5d, 0x2a, 0xd7, 0xed, 0x32, 0x74, 0xa2, 0xac, 0xe5, 0xf7, 0xc7, 0x4b, 0x62, 0x69, 0xbe, 0x9f, 0x56, 0x86, 0x40, 0xcc, 0x12, 0xdf, 0x9f, 0xa8, 0xbd, 0x6d, 0x2e, 0x72, 0x23, 0xb8, 0xe0, 0x34, 0x4a, 0x75, 0xb7, 0x5a, 0xeb, 0x0a, 0x56, 0x27, 0xcf, 0x2b, 0x1d, 0x37, 0xea, 0x62, 0x04, 0x76, 0x4d, 0xc5, 0x62, 0x31, 0xcb, 0xb9, 0x71, 0x4b, 0xde, 0xb6, 0x98, 0xcf, 0x81, 0x87, 0x37, 0x3c, 0xd0, 0xfd, 0x89, 0xb8, 0x7d, 0xe2, 0x13, 0xb7, 0x4d, 0x13, 0x39, 0x64, 0x33, 0x04, 0x91, 0x7a, 0xc0, 0xc1, 0x0b, 0xb7, 0xb9, 0x76, 0x03, 0xaf, 0xa7, 0x59, 0x9b, 0xcb, 0xea, 0xbf, 0x96, 0xc0, 0xbe, 0x6d, 0x4a, 0x86, 0xb0, 0xb7, 0x71, 0x0f, 0x52, 0xe4, 0x5a, 0x82, 0x94, 0xe5, 0x76, 0x4b, 0xf0, 0x5e, 0x7a, 0xd1, 0xad, 0x6e, 0xf3, 0x57, 0x41, 0xd8, 0x98, 0x88, 0xad, 0x01, 0x7f, 0xcb, 0xcb, 0x89, 0xb7, 0x3a, 0x21, 0x2a, 0x9f, 0x9c, 0x3f, 0x28, 0xf1, 0x97, 0xb1, 0x09, 0xd9, 0xe3, 0x7b, 0xfe, 0x11, 0xa5, 0xf2, 0x12, 0xf7, 0x0d, 0x0e, 0x9a, 0xf4, 0xa8, 0xf4, 0x04, 0x95, 0x9d, 0xac, 0x78, 0x05, 0x1b, 0xf1, 0x96, 0x83, 0x37, 0x67, 0xdc, 0xfd, 0x94, 0x30, 0xbc, 0xd0, 0x5e, 0x63, 0xdc, 0x7c, 0x21, 0x6e, 0xbc, 0x57, 0x67, 0x0f, 0x47, 0xbc, 0x60, 0xcf, 0xc8, 0x5d, 0x65, 0x26, 0x4c, 0x2e, 0x1b, 0x7a, 0x53, 0x4e, 0xdd, 0x4e, 0xfd, 0x2f, 0x6d, 0xfb, 0x03, 0x6c, \ No newline at end of file diff --git a/config.lua b/config.lua index f0a212f5e..2e7069210 100644 --- a/config.lua +++ b/config.lua @@ -34,6 +34,7 @@ VSYNC=true CRT_MONITOR=false GIF_SCALE=3 UI_SCALE=4 +VOLUME=12 --------------------------- function TIC() diff --git a/src/defines.h b/src/defines.h index a075576bd..694d0651a 100644 --- a/src/defines.h +++ b/src/defines.h @@ -47,3 +47,20 @@ #define _BITSET(a,b) ((a) |= (1ULL<<(b))) #define _BITCLEAR(a,b) ((a) &= ~(1ULL<<(b))) #define _BITFLIP(a,b) ((a) ^= (1ULL<<(b))) + +#define REP0(X) +#define REP1(X) X +#define REP2(X) REP1(X) X +#define REP3(X) REP2(X) X +#define REP4(X) REP3(X) X +#define REP5(X) REP4(X) X +#define REP6(X) REP5(X) X +#define REP7(X) REP6(X) X +#define REP8(X) REP7(X) X +#define REP9(X) REP8(X) X +#define REP10(X) REP9(X) X + +#define REP(HUNDREDS,TENS,ONES,X) \ + REP##HUNDREDS(REP10(REP10(X))) \ + REP##TENS(REP10(X)) \ + REP##ONES(X) diff --git a/src/studio/config.c b/src/studio/config.c index 23ad2d5a2..f97fccc3c 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -193,6 +193,7 @@ static void readConfig(Config* config) readGlobalBool(lua, "CHECK_NEW_VERSION", &config->data.checkNewVersion); readGlobalBool(lua, "NO_SOUND", &config->data.noSound); readGlobalInteger(lua, "UI_SCALE", &config->data.uiScale); + readGlobalInteger(lua, "VOLUME", &config->data.volume); readGlobalBool(lua, "VSYNC", &config->data.vsync); readGlobalBool(lua, "SOFTWARE_RENDERING", &config->data.soft); #if defined(CRT_SHADER_SUPPORT) @@ -213,7 +214,8 @@ static void readConfig(Config* config) { .uiScale = 4, .cart = config->cart, - .theme.cursor = {-1, -1, -1, false} + .theme.cursor = {-1, -1, -1, false}, + .volume = MAX_VOLUME, }; } diff --git a/src/studio/studio.c b/src/studio/studio.c index 1d57099ba..4078db21c 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1221,19 +1221,14 @@ static MenuOption VSyncOption = optionVSyncSet, }; -// !TODO: temp var -static s32 VolumePos = 15; - static s32 optionVolumeGet() { - // !TODO: not impelemnted - return VolumePos; + return impl.config->data.volume; } static void optionVolumeSet(s32 pos) { - // !TODO: not impelemnted - VolumePos = pos; + impl.config->data.volume = pos; } static MenuOption VolumeOption = @@ -1926,6 +1921,22 @@ static void recordFrame(u32* pixels) #endif +static void applyVolume() +{ + tic_mem* tic = impl.studio.tic; + + if(getConfig()->noSound) + ZEROMEM(tic->ram.registers); + else + { + s32 volume = getConfig()->volume; + void* addr = &tic->ram.stereo; + + for(s32 i = 0; i != TIC_SOUND_CHANNELS * TIC_STEREO_CHANNELS; ++i) + tic_tool_poke4(addr, i, tic_tool_peek4(addr, i) * volume / MAX_VOLUME); + } +} + static void renderStudio() { tic_mem* tic = impl.studio.tic; @@ -2020,8 +2031,7 @@ static void renderStudio() default: break; } - if(getConfig()->noSound) - memset(tic->ram.registers, 0, sizeof tic->ram.registers); + applyVolume(); tic_core_tick_end(tic); diff --git a/src/studio/system.h b/src/studio/system.h index fb7613664..e04c80c49 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -123,6 +123,7 @@ typedef struct const tic_cartridge* cart; s32 uiScale; + s32 volume; } StudioConfig; From 072c742ef366434f6042f5b67da69cb41135f896 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 27 Dec 2021 09:29:04 +0300 Subject: [PATCH 203/379] Better sound volume impl #1613 #1748 --- build/assets/config.tic.dat | 2 +- config.lua | 1 - src/studio/config.c | 1 - src/studio/studio.c | 33 +++++++++++++-------------------- src/studio/studio.h | 2 +- src/studio/system.h | 1 - 6 files changed, 15 insertions(+), 25 deletions(-) diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 9550b0939..3dd190918 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0x43, 0xe7, 0x9a, 0x2a, 0xcf, 0x62, 0x0f, 0x01, 0x48, 0x10, 0x24, 0x01, 0x52, 0xb5, 0x89, 0x88, 0x72, 0x71, 0x49, 0x48, 0x62, 0x59, 0x24, 0x55, 0x24, 0x24, 0xd9, 0xe5, 0x72, 0x31, 0x20, 0x38, 0x20, 0x11, 0x43, 0x00, 0x6b, 0x00, 0x0a, 0xe4, 0x6e, 0x54, 0x95, 0xa3, 0x0e, 0x39, 0xe4, 0xea, 0x3d, 0x6d, 0x92, 0x4b, 0xcc, 0xd2, 0x21, 0x8f, 0x3f, 0xd0, 0x92, 0x12, 0x27, 0x76, 0x3a, 0x58, 0x6f, 0x9c, 0x77, 0x4c, 0xd1, 0xce, 0xfb, 0x01, 0x21, 0xda, 0x38, 0xef, 0x6c, 0x95, 0xf2, 0x7d, 0xfd, 0x98, 0xe9, 0x99, 0xe9, 0x19, 0x4a, 0x6b, 0xd9, 0xde, 0x30, 0xec, 0x61, 0xab, 0xa7, 0xfb, 0xeb, 0xef, 0xeb, 0xef, 0x3d, 0x3d, 0x3d, 0x28, 0x8d, 0x5a, 0x96, 0xf5, 0xc2, 0xbb, 0x9f, 0xb6, 0xfa, 0x0c, 0xca, 0x9d, 0x3b, 0x77, 0xee, 0x1e, 0x1e, 0x1e, 0xde, 0xc5, 0x16, 0xba, 0x77, 0x19, 0xf5, 0x2a, 0x63, 0x83, 0xe1, 0x9d, 0x3b, 0x6c, 0x78, 0x78, 0x48, 0x87, 0x77, 0x7e, 0x95, 0x0e, 0xd9, 0x5d, 0xca, 0xe8, 0x5d, 0x4a, 0x55, 0xe5, 0xf8, 0xa3, 0xa3, 0xa3, 0xb9, 0x74, 0x3a, 0x9d, 0xc3, 0x16, 0xba, 0x39, 0xc0, 0x53, 0x15, 0xf1, 0x47, 0x47, 0xd9, 0x30, 0x9d, 0xa6, 0xc3, 0xd1, 0xd7, 0x00, 0x3f, 0x47, 0x87, 0x54, 0xd4, 0x01, 0xcd, 0x59, 0x8c, 0xe3, 0x03, 0xee, 0x5c, 0xb1, 0x58, 0x9c, 0xc3, 0x16, 0xba, 0x73, 0x04, 0x2a, 0xe0, 0xce, 0x49, 0xfc, 0x74, 0x9a, 0x0d, 0x8b, 0x45, 0x3a, 0x4c, 0x17, 0x00, 0x7f, 0x8e, 0x0e, 0x09, 0x54, 0x3a, 0x07, 0xf8, 0x73, 0x12, 0xbf, 0xd7, 0xeb, 0x35, 0xeb, 0xf5, 0x7a, 0x13, 0x5b, 0xe8, 0xf2, 0x4a, 0x2c, 0x82, 0x2d, 0xe2, 0xf7, 0x7a, 0x6c, 0x58, 0xaf, 0xd3, 0x61, 0x6f, 0x1b, 0xf0, 0x9b, 0x40, 0xb3, 0x49, 0xa9, 0x05, 0x15, 0xdb, 0x6f, 0x1c, 0x1d, 0xbd, 0x7c, 0x84, 0xe5, 0xd1, 0xc3, 0xa3, 0xa3, 0xe1, 0xf0, 0xe8, 0xd1, 0x70, 0xf8, 0x10, 0xbb, 0xf0, 0xcf, 0xa3, 0x6f, 0x0f, 0x87, 0xaf, 0x28, 0x38, 0x1f, 0x07, 0x38, 0x9f, 0x17, 0x81, 0x3f, 0x94, 0xf8, 0xb2, 0x85, 0x7e, 0x00, 0xfe, 0x48, 0xd2, 0x7f, 0x24, 0xf1, 0x1f, 0xf9, 0xf8, 0x3f, 0x53, 0xaf, 0xff, 0x48, 0xfd, 0xd6, 0x76, 0xbd, 0xbe, 0x7d, 0x4b, 0xd4, 0x5e, 0x8f, 0xb7, 0x30, 0x72, 0x6b, 0xb7, 0xd7, 0x7b, 0xc9, 0x4e, 0xa7, 0x3f, 0x91, 0x1e, 0x7d, 0x2d, 0x9d, 0x7e, 0xed, 0x53, 0x69, 0xbd, 0x85, 0xbb, 0x4f, 0xfd, 0xd8, 0xe8, 0xe8, 0x0b, 0xef, 0x1e, 0x1e, 0xa6, 0x0e, 0xbf, 0xf2, 0xce, 0x21, 0xaf, 0xef, 0x7c, 0xe5, 0x50, 0xdd, 0xc3, 0xdd, 0x3b, 0xbf, 0xf8, 0xe5, 0x2f, 0x8f, 0x4c, 0x15, 0x8b, 0xe7, 0x8a, 0x85, 0xd7, 0x8b, 0xbc, 0xbe, 0x9e, 0x06, 0x2d, 0x63, 0x5b, 0x28, 0x16, 0xe0, 0x5f, 0xa4, 0xcd, 0xed, 0x8d, 0xb6, 0xe7, 0xd7, 0xd7, 0xf9, 0xfd, 0x2f, 0x80, 0x1f, 0x30, 0x8b, 0xa2, 0x6e, 0xfb, 0xec, 0xae, 0xc5, 0xc0, 0xf6, 0x83, 0xbb, 0x60, 0xff, 0x43, 0x59, 0xd1, 0x1f, 0x2c, 0x3a, 0x18, 0x32, 0x36, 0x1c, 0x72, 0x7b, 0xa3, 0xed, 0xd3, 0xf7, 0xa1, 0xc5, 0x2b, 0x9d, 0xfe, 0x09, 0xf0, 0x03, 0x0f, 0x3f, 0x47, 0x29, 0xd8, 0x9e, 0xd7, 0x5c, 0x9a, 0x32, 0xee, 0x07, 0xa3, 0x3e, 0x3e, 0xb7, 0x37, 0xda, 0xfe, 0xc1, 0x83, 0x07, 0x73, 0xc5, 0xb9, 0x39, 0xbc, 0x47, 0x1a, 0x1e, 0xfe, 0x1c, 0xa5, 0x60, 0x7b, 0xfa, 0x00, 0xea, 0x5c, 0x91, 0x32, 0xee, 0x07, 0x69, 0x1f, 0x9f, 0xdb, 0x1a, 0x6d, 0x5f, 0xc7, 0xf6, 0xab, 0xfc, 0xfe, 0xe7, 0xc0, 0x0f, 0x3c, 0xfc, 0xa6, 0xc5, 0xc0, 0xf6, 0x83, 0x26, 0xd8, 0xbf, 0x2e, 0x2b, 0xfa, 0x83, 0xc2, 0x87, 0x30, 0xb0, 0xe2, 0x7c, 0x00, 0xc7, 0x75, 0x78, 0xd8, 0x07, 0x82, 0xf0, 0xa8, 0x0f, 0x04, 0xe0, 0x06, 0x1f, 0x50, 0xf0, 0x38, 0x1f, 0xc0, 0x71, 0x84, 0xc7, 0xf9, 0x00, 0x8e, 0x23, 0x3c, 0xce, 0x07, 0x70, 0x1c, 0xe1, 0x71, 0x3e, 0x80, 0xe3, 0xc6, 0xf8, 0xe5, 0x25, 0x9d, 0xcb, 0xb1, 0xfb, 0xa6, 0xf8, 0x05, 0x38, 0xd8, 0x13, 0xea, 0x7d, 0xa8, 0xd6, 0x73, 0x28, 0xdb, 0xd7, 0x9c, 0x97, 0xac, 0xef, 0x53, 0x41, 0xe7, 0x8a, 0x54, 0x46, 0x78, 0x05, 0xf5, 0x17, 0xb1, 0x44, 0xe0, 0xdf, 0x7a, 0xd9, 0x9b, 0x53, 0x3c, 0x67, 0x59, 0xbc, 0x7e, 0xf7, 0xc9, 0x13, 0xde, 0x7e, 0xf3, 0xe5, 0xa3, 0xa2, 0x5e, 0x14, 0x5c, 0x9f, 0xa7, 0x15, 0xeb, 0x63, 0x5e, 0xfc, 0xf8, 0xc5, 0xf6, 0x3e, 0x8b, 0xc6, 0xaf, 0x85, 0x31, 0x3b, 0x80, 0xd8, 0xe5, 0x3e, 0x10, 0x8e, 0xdf, 0xe7, 0xc1, 0xc3, 0xe3, 0x27, 0x4f, 0xac, 0xb3, 0x72, 0x56, 0xce, 0xca, 0x0f, 0xa9, 0x10, 0x22, 0x2a, 0x64, 0x73, 0x4a, 0x18, 0xaf, 0x7a, 0xa1, 0x8c, 0x00, 0x08, 0x2a, 0xc5, 0xac, 0x80, 0x93, 0x58, 0x28, 0xc9, 0x22, 0x1c, 0x2e, 0x26, 0x70, 0xb1, 0x0d, 0x12, 0x00, 0xda, 0xcc, 0x12, 0xe3, 0x4c, 0xf6, 0x03, 0xf8, 0x62, 0x8c, 0xc3, 0xe5, 0xdc, 0xe0, 0xfa, 0x4c, 0xd0, 0x57, 0x6b, 0x30, 0x12, 0x59, 0x1f, 0xf9, 0x17, 0xf8, 0x96, 0xa8, 0x0a, 0x04, 0x49, 0x3c, 0xae, 0xfa, 0xec, 0x69, 0xf4, 0xf1, 0x22, 0x06, 0xf9, 0xa8, 0x5a, 0x9b, 0xf1, 0xfb, 0xa0, 0x78, 0xbe, 0xce, 0x4c, 0xfa, 0x13, 0x32, 0x51, 0xa1, 0x3b, 0xae, 0xbf, 0x30, 0xff, 0x30, 0x9f, 0x50, 0x5e, 0x8d, 0xf8, 0x8c, 0x80, 0xea, 0x99, 0x57, 0xb1, 0x1f, 0x30, 0x1f, 0x25, 0xc8, 0x12, 0x81, 0x96, 0x60, 0x4b, 0x69, 0x10, 0xee, 0xf1, 0xad, 0xec, 0x63, 0x51, 0x83, 0x7d, 0x99, 0xa8, 0xdc, 0x46, 0xcc, 0xe0, 0x24, 0xd4, 0xaf, 0x11, 0xfb, 0x4a, 0x19, 0xa9, 0xb4, 0x5f, 0x78, 0x57, 0x20, 0x61, 0xe8, 0x3f, 0x96, 0xb2, 0xb1, 0xc9, 0x7f, 0x38, 0x6d, 0x13, 0x7e, 0xc8, 0x3f, 0x68, 0xd4, 0x3f, 0x4c, 0xad, 0x36, 0x01, 0x94, 0x84, 0xda, 0xc5, 0x3f, 0x74, 0x64, 0x16, 0xf5, 0x2f, 0x65, 0x5f, 0xd9, 0x46, 0xa4, 0xe7, 0x7a, 0x31, 0xf0, 0xa6, 0xf3, 0xc8, 0x88, 0x11, 0x17, 0x17, 0x97, 0x7a, 0x23, 0x3c, 0x86, 0xac, 0xa0, 0xfc, 0xca, 0x9f, 0x94, 0x5d, 0x68, 0x64, 0x5b, 0x85, 0xeb, 0x52, 0xe1, 0xe3, 0x06, 0xf7, 0xf1, 0xf0, 0x69, 0x0c, 0xbe, 0xee, 0xbf, 0x4a, 0xc7, 0x11, 0xfa, 0x44, 0xca, 0x47, 0x24, 0xbf, 0x21, 0xf6, 0x99, 0x8c, 0x33, 0x16, 0x05, 0x7b, 0x7a, 0x97, 0x36, 0xa6, 0x06, 0xfd, 0x2a, 0xbe, 0x54, 0x8d, 0xe8, 0x4e, 0xe6, 0x17, 0xc1, 0x8b, 0x15, 0xf1, 0x4f, 0xcb, 0xf7, 0x90, 0xa8, 0xff, 0x11, 0x9f, 0x06, 0x6f, 0x23, 0xfa, 0xc1, 0x2a, 0xf3, 0x17, 0x15, 0x3a, 0x8c, 0x8d, 0x0f, 0x16, 0xcc, 0x5f, 0x54, 0xe4, 0x10, 0x35, 0x40, 0xbc, 0x7b, 0xaa, 0x8d, 0xc7, 0xa8, 0x4d, 0x77, 0x3f, 0x55, 0xe3, 0x5c, 0x87, 0xc6, 0xb9, 0x96, 0xe6, 0x57, 0x7a, 0xce, 0xd2, 0xf3, 0x5b, 0xa2, 0x6f, 0x52, 0x4b, 0xe6, 0x5e, 0x19, 0x7a, 0x4c, 0xe5, 0x5b, 0x83, 0x69, 0x59, 0xd4, 0xc4, 0x90, 0x29, 0x09, 0x64, 0x1d, 0xc2, 0xf4, 0x4b, 0xf6, 0xf5, 0xfc, 0x0a, 0x5d, 0xcc, 0x5e, 0x16, 0xb6, 0x81, 0xfc, 0x2a, 0x63, 0x1b, 0x33, 0x14, 0x81, 0x0e, 0xf1, 0x6c, 0x48, 0x3c, 0xdd, 0x73, 0x19, 0x34, 0xdf, 0x08, 0xc6, 0x20, 0x51, 0xcc, 0x73, 0x39, 0x71, 0x59, 0xa2, 0xbb, 0x30, 0x23, 0x7e, 0xdc, 0xa9, 0xe7, 0x18, 0xf1, 0x75, 0x41, 0x08, 0x21, 0x92, 0x4a, 0xb0, 0x95, 0xe3, 0xba, 0xf3, 0x50, 0xc1, 0x38, 0x08, 0xc2, 0x78, 0x9a, 0x38, 0x2b, 0x67, 0xe5, 0xb4, 0x17, 0x7e, 0x44, 0x36, 0x1c, 0x0e, 0x07, 0xf8, 0xa6, 0x8f, 0x85, 0xb7, 0xfd, 0xbe, 0x6c, 0x87, 0x12, 0xdc, 0xd7, 0xc1, 0xfd, 0xbe, 0x98, 0x3e, 0x14, 0xad, 0x5f, 0x0c, 0x74, 0x42, 0xe0, 0x08, 0x9d, 0x33, 0x0b, 0xfc, 0x70, 0xcb, 0xa0, 0x8f, 0x86, 0x04, 0xbb, 0x41, 0x45, 0x03, 0xb1, 0x68, 0x19, 0x6a, 0xa5, 0x1f, 0x06, 0x2a, 0x3f, 0x41, 0x3a, 0x31, 0xf8, 0xca, 0x4f, 0x8c, 0xf8, 0x67, 0x16, 0xf8, 0x18, 0xc5, 0xbf, 0xa1, 0x32, 0xdf, 0xac, 0xfd, 0x98, 0x6a, 0xc2, 0xc7, 0x00, 0x87, 0xb1, 0xc1, 0xd0, 0x84, 0x8f, 0xe7, 0x4a, 0x43, 0xac, 0xfd, 0x38, 0xfc, 0xc1, 0x50, 0x54, 0x66, 0xc4, 0x47, 0x3c, 0x5e, 0x4f, 0x5c, 0x3f, 0x8a, 0x3f, 0x0c, 0x55, 0x03, 0xfe, 0x50, 0xaf, 0x89, 0xfc, 0x9b, 0xf1, 0x3d, 0xd9, 0x07, 0x52, 0x85, 0x3a, 0xbe, 0x2e, 0x3b, 0xde, 0x9f, 0x1c, 0x7f, 0x10, 0x5c, 0x10, 0x37, 0xb2, 0x32, 0x16, 0x13, 0xa0, 0xec, 0x29, 0x8b, 0x1e, 0xcc, 0x2c, 0x6c, 0x6f, 0x33, 0x2f, 0x9a, 0xad, 0xa3, 0xbc, 0x48, 0x39, 0x63, 0xf1, 0xa5, 0x8d, 0x13, 0xf0, 0xd9, 0x20, 0x09, 0xbf, 0xcf, 0xbe, 0x37, 0x7c, 0xcd, 0x4e, 0x71, 0xf8, 0xca, 0xd6, 0xdf, 0xcb, 0xfa, 0x83, 0x24, 0xfc, 0x7e, 0x02, 0x7e, 0xb8, 0xf4, 0x05, 0xcf, 0xbc, 0x0e, 0x9e, 0xa2, 0x26, 0xc4, 0xa5, 0x1f, 0x9f, 0xcf, 0xe0, 0x1c, 0xa6, 0xf8, 0x67, 0xc9, 0x79, 0x20, 0x09, 0x7f, 0x90, 0x84, 0xdf, 0x3f, 0x11, 0x7f, 0x30, 0x4c, 0xc2, 0xf7, 0xf2, 0xc7, 0x47, 0x58, 0x3f, 0x10, 0xbf, 0x66, 0x7c, 0x2f, 0xfe, 0x3f, 0x22, 0xff, 0x83, 0x24, 0x7c, 0x95, 0x07, 0x74, 0xdf, 0x8d, 0x79, 0x7e, 0xea, 0xbe, 0x73, 0x62, 0x6c, 0x3f, 0x4b, 0x1e, 0x60, 0x71, 0x7e, 0x15, 0xe4, 0xc5, 0xe0, 0x53, 0x83, 0x50, 0xfc, 0x78, 0xf9, 0x3a, 0x82, 0x3f, 0xd4, 0xf2, 0xb5, 0x19, 0x7f, 0xa0, 0xe2, 0x6f, 0x60, 0xc4, 0x97, 0x79, 0xbe, 0x9f, 0xb8, 0x7e, 0x02, 0x7e, 0x34, 0xdf, 0xc7, 0xe1, 0x07, 0xf2, 0x40, 0x18, 0x3f, 0x7e, 0xfd, 0xc1, 0x50, 0xcb, 0x01, 0x03, 0x13, 0xff, 0x2a, 0x07, 0xf4, 0x9f, 0xc1, 0x96, 0x7d, 0x29, 0xcb, 0x27, 0xbe, 0xf6, 0x69, 0x0b, 0xbf, 0x8e, 0xbc, 0xf7, 0x2a, 0xd4, 0x0f, 0xa1, 0xb2, 0x57, 0xa1, 0x7e, 0x28, 0x5a, 0x18, 0x78, 0xfc, 0x18, 0x06, 0x1f, 0xab, 0x09, 0x4f, 0xac, 0xc7, 0x00, 0x78, 0x0f, 0x26, 0x3c, 0x66, 0x72, 0xd2, 0xe3, 0x27, 0xf8, 0x27, 0x6e, 0x71, 0xaa, 0x56, 0x25, 0xf8, 0xac, 0x9c, 0x95, 0xb3, 0xf2, 0x7f, 0x7a, 0x13, 0xaf, 0x55, 0xcb, 0x8a, 0x7e, 0x3f, 0xa1, 0x96, 0x95, 0xf4, 0xa5, 0x9e, 0x8a, 0xa3, 0xe9, 0x40, 0x1b, 0x3e, 0x7f, 0x25, 0xf2, 0x18, 0x0e, 0x6f, 0xa2, 0xc7, 0xaf, 0xfe, 0xb9, 0x2b, 0x55, 0xfd, 0xd0, 0x11, 0x24, 0xc7, 0x27, 0xe2, 0xec, 0x8e, 0x92, 0xe8, 0xf9, 0x32, 0x4d, 0x92, 0x4f, 0x9d, 0xe9, 0x12, 0xfd, 0xb8, 0x2e, 0x72, 0x7c, 0xec, 0x55, 0x6a, 0x38, 0x7e, 0x27, 0x44, 0x1c, 0xfb, 0xf3, 0x63, 0x3f, 0x62, 0x3e, 0xa2, 0xa7, 0x2c, 0xfe, 0x0c, 0x57, 0xff, 0x94, 0x11, 0xc7, 0x2f, 0x7d, 0x8a, 0xb7, 0x59, 0x4a, 0xa2, 0xe7, 0xf7, 0x56, 0x44, 0x7f, 0x51, 0xba, 0x4c, 0x9e, 0x9e, 0xb2, 0xe8, 0xe7, 0x0b, 0xef, 0x7c, 0x57, 0xf9, 0x40, 0xf8, 0xfb, 0x18, 0xf3, 0xbe, 0xaf, 0xc9, 0x29, 0x11, 0x38, 0xf1, 0xbe, 0xbb, 0x11, 0x1a, 0x4f, 0x9f, 0x51, 0x35, 0xd7, 0x8a, 0xe0, 0x33, 0x6d, 0x1d, 0xd3, 0xe7, 0x17, 0x05, 0x37, 0xf1, 0xaf, 0xaf, 0x6f, 0xf8, 0xfc, 0x27, 0xf1, 0x49, 0xa0, 0x35, 0xc3, 0x85, 0x71, 0x28, 0x8b, 0xd7, 0xb9, 0x49, 0xff, 0x61, 0x78, 0xc4, 0xbe, 0x9a, 0x6d, 0x4c, 0xfe, 0xa7, 0xdb, 0xde, 0xe4, 0x03, 0x01, 0x3c, 0xd3, 0xe7, 0x2d, 0x4d, 0x7e, 0x63, 0xfc, 0x4a, 0xbf, 0xe5, 0x67, 0xdf, 0x86, 0x35, 0x94, 0xfc, 0xbc, 0x32, 0xd1, 0x86, 0xed, 0x2f, 0x60, 0x7e, 0x6b, 0xc6, 0x8f, 0xb3, 0x8f, 0x46, 0xdf, 0x80, 0xaf, 0xdb, 0x3f, 0xce, 0xbf, 0x02, 0x70, 0x83, 0xfc, 0x7c, 0x9c, 0x12, 0xcd, 0x8e, 0xba, 0xfb, 0x05, 0x65, 0x0b, 0xcb, 0x47, 0xd5, 0x47, 0x8b, 0x58, 0xff, 0x27, 0x9e, 0x91, 0x99, 0xc1, 0xbf, 0x39, 0x4d, 0xf9, 0x4d, 0x81, 0xb7, 0x61, 0xfd, 0x85, 0x6b, 0x98, 0x3e, 0x95, 0xbc, 0xf1, 0x3c, 0x49, 0x22, 0xf9, 0x8f, 0xd3, 0x27, 0x72, 0x0e, 0x35, 0xf1, 0x1f, 0xd4, 0x6f, 0xa2, 0xfe, 0x59, 0x7c, 0x7c, 0x04, 0xf1, 0x49, 0x02, 0x7e, 0x54, 0x7f, 0x4c, 0xe5, 0x3f, 0x66, 0xf2, 0x0f, 0x12, 0x55, 0x82, 0xc9, 0x3e, 0x71, 0xfc, 0x87, 0x61, 0x24, 0xfa, 0xfc, 0x20, 0xc4, 0xd7, 0x21, 0xa3, 0x66, 0xfb, 0xeb, 0x72, 0x06, 0xe3, 0x97, 0x88, 0xaa, 0xf3, 0x19, 0xb6, 0xbf, 0x96, 0x5b, 0x22, 0x9f, 0xd1, 0x58, 0xe8, 0xf9, 0x92, 0xf0, 0x79, 0xd1, 0xbf, 0x89, 0x3e, 0x13, 0xbc, 0xe7, 0x0f, 0x89, 0xf9, 0x7c, 0xfb, 0x94, 0xdf, 0x94, 0xc2, 0xfe, 0x6b, 0x58, 0xd2, 0x88, 0x83, 0xb9, 0x5b, 0xe4, 0x6f, 0x83, 0xff, 0x86, 0x7c, 0xc0, 0x84, 0xcf, 0xd4, 0x27, 0x60, 0x16, 0x4d, 0x90, 0x49, 0xf4, 0x83, 0xcf, 0x28, 0x43, 0x0e, 0xc4, 0x3d, 0x05, 0x91, 0x7b, 0x0b, 0xe3, 0xf3, 0x4f, 0xe6, 0x38, 0x19, 0x47, 0x56, 0x28, 0x46, 0x99, 0x21, 0x07, 0x45, 0x04, 0xb4, 0xe2, 0xfd, 0x33, 0x9c, 0xfc, 0x89, 0x89, 0xbe, 0x9e, 0x1f, 0x0d, 0xf6, 0xd5, 0xab, 0x65, 0x90, 0x5f, 0x3d, 0x1b, 0x79, 0xfc, 0x13, 0x03, 0x3c, 0x89, 0xff, 0x50, 0x0c, 0x9b, 0x9e, 0x21, 0x27, 0xe7, 0x80, 0x90, 0x7d, 0x68, 0xcc, 0x33, 0xc0, 0xa0, 0x1e, 0xdd, 0xfe, 0xc6, 0xf8, 0x0f, 0xdb, 0xce, 0x24, 0x7f, 0x42, 0xfc, 0x87, 0x63, 0xd8, 0xe4, 0xcb, 0x81, 0x1c, 0x40, 0x4d, 0xfa, 0x25, 0xde, 0x37, 0x74, 0x13, 0x3c, 0x2c, 0x3b, 0x4d, 0xca, 0x01, 0x31, 0xf1, 0x4f, 0x63, 0xe2, 0xdf, 0x22, 0x86, 0x6a, 0x8a, 0x7f, 0x16, 0x13, 0xff, 0xe2, 0x83, 0xb3, 0xf5, 0x7c, 0x7e, 0x2d, 0x7b, 0x56, 0xce, 0xca, 0x59, 0x39, 0x2b, 0xc1, 0xfd, 0x01, 0xd5, 0x5e, 0x4b, 0x68, 0x34, 0xf5, 0x58, 0x24, 0x61, 0xff, 0x40, 0x88, 0xf7, 0x13, 0x4a, 0xaf, 0x8d, 0xe4, 0x7f, 0xbd, 0x35, 0xa4, 0xc7, 0xc0, 0xbb, 0x2b, 0x89, 0x39, 0x9e, 0x50, 0x3f, 0xcd, 0x21, 0x66, 0xfe, 0xe3, 0x19, 0x0c, 0xc9, 0x48, 0xcc, 0xfb, 0x33, 0x6a, 0x99, 0xdf, 0x9f, 0x95, 0x8c, 0xea, 0x1c, 0x22, 0x4e, 0x87, 0xec, 0xa4, 0x73, 0x88, 0xd0, 0x71, 0x84, 0x15, 0xdd, 0xe6, 0x3c, 0xb5, 0xbd, 0xac, 0xf8, 0x23, 0x00, 0xe3, 0x99, 0x81, 0xfe, 0xd3, 0x26, 0x66, 0xe2, 0x5d, 0x93, 0xdf, 0xf4, 0x78, 0xd3, 0xe9, 0x27, 0xc1, 0x2d, 0x03, 0x7d, 0xa2, 0xf9, 0x86, 0xe9, 0xf9, 0xc7, 0x88, 0xf6, 0xd8, 0x24, 0xe6, 0xed, 0x17, 0xb1, 0x82, 0x3e, 0x16, 0xd1, 0x1b, 0x09, 0x1e, 0xf3, 0x44, 0xe8, 0x93, 0x64, 0xfc, 0x24, 0xfe, 0xac, 0x84, 0xd8, 0x30, 0xc1, 0x13, 0x8e, 0x67, 0x62, 0xf7, 0xe2, 0x8a, 0x27, 0x66, 0xdc, 0xdb, 0x24, 0xfe, 0x3c, 0x31, 0x20, 0xbf, 0x89, 0x47, 0xaa, 0xcb, 0x6f, 0x99, 0xe3, 0x47, 0xd7, 0x0f, 0x31, 0x6d, 0x6f, 0x48, 0xb0, 0x35, 0xd9, 0xc7, 0x3b, 0x5e, 0x8b, 0xc1, 0x8f, 0xf3, 0x3f, 0xdd, 0xfe, 0x46, 0xff, 0x0a, 0xc1, 0x49, 0xdc, 0xfa, 0x31, 0xf9, 0x81, 0x90, 0x13, 0xe4, 0x0b, 0xe5, 0x87, 0x38, 0xff, 0xb2, 0x82, 0x3f, 0x0d, 0x8c, 0xd2, 0x8f, 0xc9, 0x95, 0xe1, 0xad, 0x9f, 0x89, 0x3e, 0x0b, 0xc5, 0x68, 0x92, 0xfe, 0x48, 0x8c, 0xfd, 0x48, 0x0c, 0x7f, 0x01, 0xfb, 0x99, 0xf4, 0x17, 0xd2, 0x51, 0x9c, 0xfd, 0x98, 0x26, 0xa3, 0x49, 0xff, 0x71, 0xf1, 0x1f, 0xd6, 0x6f, 0x9c, 0xfe, 0x4e, 0xb2, 0x1f, 0x39, 0x41, 0xff, 0x1e, 0x8f, 0x31, 0xf8, 0x34, 0xce, 0x3e, 0x1a, 0xdc, 0xc4, 0x5f, 0x38, 0xbf, 0x30, 0xd3, 0xf9, 0x9f, 0x2e, 0xdf, 0x09, 0x31, 0x6c, 0x3a, 0x7e, 0x0f, 0xf8, 0x5f, 0x8c, 0x7d, 0x9e, 0xfa, 0x38, 0x9f, 0x58, 0xcf, 0xfc, 0xfe, 0xcf, 0x42, 0x79, 0x22, 0xcc, 0x3b, 0xb3, 0xe2, 0xe3, 0x37, 0x9c, 0x03, 0x68, 0xcc, 0xcf, 0xc3, 0xe3, 0xec, 0x1b, 0xc8, 0x51, 0x71, 0xf8, 0x21, 0x3f, 0xb2, 0x12, 0x72, 0x5c, 0xf8, 0x8c, 0x94, 0x18, 0x62, 0x28, 0x2e, 0x77, 0x1b, 0xe9, 0x93, 0x60, 0x20, 0x13, 0x03, 0x7d, 0xa2, 0x1d, 0x1d, 0x99, 0xe2, 0x37, 0x29, 0xbf, 0x98, 0x72, 0x80, 0x65, 0x25, 0xe7, 0x00, 0x2b, 0x21, 0x86, 0xa9, 0x95, 0x8c, 0xcf, 0xe2, 0x72, 0xa8, 0x6e, 0x1f, 0x43, 0x8c, 0xb0, 0xf8, 0xc7, 0xa3, 0x7f, 0xfc, 0x1c, 0xb7, 0xbf, 0x20, 0xf1, 0xfb, 0xaf, 0x70, 0x0c, 0xd3, 0x93, 0xe0, 0x56, 0x3c, 0xdc, 0x14, 0xff, 0xe1, 0xfd, 0x1b, 0x49, 0xa0, 0x1f, 0xf7, 0x7d, 0x46, 0xe5, 0xc5, 0xa4, 0xf8, 0x67, 0x31, 0xf1, 0x4f, 0x0d, 0x3e, 0x66, 0xf4, 0x0f, 0x62, 0x8e, 0x7f, 0x4f, 0xbf, 0x2f, 0xe6, 0x5e, 0xb5, 0xe8, 0x3d, 0xd3, 0xf5, 0xed, 0xef, 0x98, 0xae, 0xd3, 0xf0, 0x72, 0xc2, 0x7e, 0xdf, 0x74, 0x0d, 0x1e, 0x99, 0xae, 0x53, 0xf1, 0x32, 0xf6, 0xff, 0xcc, 0xbe, 0xdf, 0x78, 0x3f, 0x7c, 0xa1, 0x7d, 0x1f, 0x7f, 0x10, 0xbe, 0xce, 0xec, 0x7b, 0x5a, 0xec, 0x8b, 0x57, 0xd4, 0xbe, 0x78, 0x9d, 0xd9, 0xf7, 0xcc, 0xbe, 0x1f, 0xf7, 0x72, 0x6c, 0x30, 0x6f, 0xff, 0xde, 0xb1, 0xc1, 0xbc, 0xc3, 0x53, 0x61, 0xdf, 0x63, 0x83, 0x79, 0xbf, 0xf5, 0xf0, 0xd8, 0x60, 0xde, 0x0f, 0x1f, 0x9e, 0x06, 0x79, 0xbf, 0xfe, 0x7b, 0x51, 0x03, 0x1f, 0x3d, 0xfc, 0xc7, 0x7f, 0x8a, 0x1a, 0xf8, 0xe8, 0x54, 0xc8, 0xfb, 0xe7, 0x7f, 0x61, 0x8a, 0xdf, 0xff, 0xfe, 0x9f, 0x53, 0x9b, 0x9f, 0xfb, 0xf7, 0xf8, 0x9f, 0x2c, 0xf7, 0x8e, 0x79, 0x81, 0x60, 0xe5, 0x7f, 0xb2, 0x7c, 0x47, 0x8c, 0x9e, 0x8a, 0xfc, 0xfc, 0xde, 0xfb, 0xfc, 0x4f, 0x96, 0xf7, 0x8f, 0x8f, 0xef, 0x3f, 0x38, 0x3e, 0x7e, 0xfc, 0xcf, 0x1f, 0xf0, 0x3f, 0x59, 0x3e, 0x38, 0x3e, 0xfe, 0xcb, 0xbf, 0x3a, 0x1d, 0xf2, 0x1e, 0x47, 0xca, 0x1f, 0x7c, 0xf3, 0xd8, 0x50, 0xfe, 0xe5, 0xbb, 0xa7, 0x44, 0xde, 0x77, 0x7f, 0x29, 0x20, 0xd7, 0x57, 0x7f, 0xe7, 0xb7, 0x7e, 0xfb, 0x77, 0xbf, 0x76, 0xfc, 0xcb, 0xbf, 0x12, 0x18, 0xfd, 0xdb, 0xbf, 0xfb, 0xeb, 0xbf, 0xf9, 0xfb, 0x7f, 0x38, 0x15, 0xf2, 0xfe, 0xda, 0xaf, 0x07, 0x24, 0xfb, 0xe3, 0x3f, 0xf9, 0xc3, 0x3f, 0xfa, 0xd3, 0x3f, 0x3b, 0xfe, 0x8d, 0xdf, 0x0c, 0x8c, 0xfe, 0xfb, 0x7f, 0xfc, 0xeb, 0xbf, 0xfd, 0xe7, 0x7f, 0x8d, 0xdc, 0xb3, 0xac, 0x4f, 0xf2, 0xeb, 0xd5, 0x11, 0xbc, 0x7e, 0x94, 0x5f, 0xfc, 0xde, 0x7a, 0x9a, 0x8b, 0xff, 0xef, 0x58, 0xd6, 0x39, 0xbc, 0x5e, 0x84, 0xeb, 0x25, 0xb8, 0xc8, 0x39, 0x32, 0x62, 0x05, 0x2f, 0x12, 0xba, 0x74, 0x0a, 0xe7, 0x80, 0xc4, 0xcf, 0x5b, 0xaf, 0x58, 0xaf, 0xbc, 0xf0, 0xca, 0x0b, 0x4f, 0xb7, 0x66, 0xf8, 0x7a, 0xf1, 0x93, 0xe7, 0x7e, 0xdc, 0xaa, 0x5c, 0x2e, 0x2f, 0x97, 0x4b, 0xa9, 0xb7, 0x53, 0x23, 0x0b, 0xab, 0x8b, 0x65, 0xbb, 0x94, 0x1a, 0x81, 0xdb, 0x91, 0x37, 0x2f, 0xd9, 0x58, 0x4a, 0xd3, 0xb3, 0x39, 0xe8, 0x5d, 0x54, 0xbd, 0x02, 0xf6, 0xd6, 0x2b, 0x6b, 0x4b, 0x2b, 0x97, 0xec, 0xd2, 0x0c, 0x76, 0x56, 0xae, 0x2d, 0xbf, 0x59, 0x5e, 0x03, 0xd0, 0x34, 0xf6, 0x3e, 0x5b, 0xfe, 0xfc, 0x8d, 0xd5, 0xb5, 0xc5, 0x52, 0x11, 0x3b, 0xf3, 0x57, 0x97, 0x38, 0x16, 0x27, 0xb1, 0xb0, 0xba, 0xbc, 0x5c, 0x5e, 0xa9, 0x94, 0xa6, 0x39, 0xd6, 0xfa, 0xd2, 0xa5, 0x15, 0x4e, 0x90, 0x4f, 0x5c, 0x2f, 0x5f, 0x29, 0x2f, 0x54, 0x6c, 0x09, 0x5b, 0xb8, 0xb6, 0xb6, 0xbe, 0x0a, 0x14, 0xc5, 0x5a, 0x97, 0xe7, 0x17, 0x57, 0x6f, 0xd8, 0xa5, 0xae, 0xbb, 0xe7, 0x70, 0x9a, 0x57, 0x2a, 0x1b, 0x17, 0x57, 0x81, 0x4e, 0xbd, 0xda, 0xec, 0xf0, 0x91, 0xe5, 0xf9, 0xca, 0xc2, 0xe5, 0x8d, 0xc5, 0xf2, 0x95, 0xa5, 0xe5, 0xa5, 0x4a, 0x79, 0x6d, 0x5d, 0x4d, 0xbd, 0x9d, 0x4b, 0xa5, 0x46, 0x2e, 0xcd, 0x2f, 0x97, 0xaf, 0xce, 0x2f, 0x4a, 0xa1, 0x2a, 0xab, 0xd7, 0x16, 0x2e, 0xc3, 0x3d, 0xef, 0x00, 0xa9, 0xab, 0x97, 0xe7, 0x4b, 0xd3, 0x6f, 0x4c, 0x21, 0x95, 0xdb, 0x02, 0xe3, 0x76, 0x2a, 0xb5, 0x70, 0xb9, 0xbc, 0xf0, 0xd9, 0x8d, 0x95, 0xf2, 0x8d, 0x8d, 0xeb, 0x40, 0x6d, 0x69, 0x75, 0x85, 0x13, 0x4c, 0xad, 0xac, 0x6e, 0xac, 0xaf, 0x5e, 0x5b, 0x59, 0x14, 0x0b, 0xa7, 0x2e, 0x2d, 0x5d, 0xdc, 0xb8, 0x52, 0x5e, 0xb9, 0x54, 0xb9, 0x5c, 0x2a, 0x4c, 0xd9, 0x13, 0x13, 0x76, 0xa3, 0x65, 0x77, 0x9c, 0x5a, 0xbb, 0xb5, 0xd5, 0x49, 0xad, 0xaf, 0x5e, 0xac, 0xdc, 0x98, 0x5f, 0x2b, 0x6f, 0xac, 0x95, 0x57, 0x16, 0xcb, 0xa8, 0x2b, 0x89, 0x74, 0x7d, 0xfd, 0xf3, 0x2b, 0x0b, 0x82, 0xdc, 0xc2, 0x5a, 0x65, 0x63, 0x79, 0x75, 0x65, 0xa9, 0xb2, 0xba, 0xa6, 0x51, 0x5c, 0x5f, 0x98, 0xbf, 0x52, 0x2e, 0x15, 0x53, 0xd7, 0x96, 0xe4, 0xed, 0x4c, 0xea, 0xfa, 0xea, 0x95, 0x6b, 0x60, 0x9f, 0xe9, 0x42, 0x2a, 0x35, 0x11, 0x5f, 0x52, 0xf5, 0xbd, 0x56, 0xad, 0xdb, 0x68, 0xb7, 0xec, 0xca, 0xd2, 0x42, 0x26, 0x9b, 0x1a, 0xa9, 0x35, 0x3b, 0xd8, 0x34, 0xdb, 0xb5, 0x6a, 0xd3, 0x6e, 0x56, 0x37, 0x9d, 0x66, 0x29, 0x5d, 0xd9, 0x69, 0x74, 0x6c, 0xf8, 0xeb, 0x1c, 0x74, 0xba, 0xce, 0x4d, 0x1b, 0x98, 0xad, 0x37, 0xb6, 0xf7, 0xdc, 0x2a, 0xc7, 0xab, 0x55, 0xdd, 0xae, 0xdb, 0xd8, 0xda, 0x76, 0xd2, 0x0a, 0xab, 0xd3, 0x78, 0xcb, 0x29, 0xed, 0xba, 0x8d, 0x56, 0x37, 0xc3, 0x09, 0xe4, 0xa6, 0x72, 0x13, 0xe7, 0x81, 0xa6, 0x3e, 0x94, 0x29, 0xcc, 0x4c, 0x4d, 0xe0, 0xc4, 0xec, 0xe4, 0x64, 0x21, 0x97, 0x99, 0x2e, 0x9e, 0x87, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xad, 0xad, 0x14, 0x97, 0x12, 0x2d, 0x58, 0x5e, 0xe3, 0x0e, 0x06, 0x0a, 0xad, 0x94, 0x3f, 0x57, 0xfa, 0xc2, 0x17, 0x40, 0xe1, 0xaf, 0xdf, 0x72, 0xdc, 0x0e, 0x2e, 0x3c, 0x3d, 0x3d, 0x05, 0xdd, 0x6a, 0x17, 0x56, 0xdf, 0xdc, 0xeb, 0x3a, 0xf6, 0x2d, 0xa7, 0x56, 0xb4, 0xb7, 0x77, 0xf7, 0x36, 0xae, 0x3b, 0x6e, 0xd7, 0xd9, 0xbf, 0x10, 0x06, 0x16, 0x38, 0xb0, 0xe2, 0xec, 0x2f, 0xb4, 0xdb, 0xee, 0x56, 0x04, 0x3c, 0xc3, 0xc1, 0x0b, 0xed, 0x66, 0xdb, 0x45, 0xd8, 0x5e, 0xab, 0x51, 0x6f, 0xbb, 0x37, 0xed, 0x9b, 0xd5, 0xae, 0x80, 0x2c, 0xb7, 0xb7, 0x9c, 0xe6, 0xf5, 0x86, 0xd3, 0xbb, 0xea, 0xb6, 0x7f, 0xd6, 0xe1, 0x3a, 0x5b, 0xae, 0x02, 0x3e, 0x5f, 0xe8, 0x56, 0xd5, 0x3d, 0x68, 0xb4, 0xb6, 0x05, 0x9d, 0x9a, 0xa2, 0xa1, 0x8d, 0x16, 0xec, 0xae, 0xb6, 0xf0, 0xad, 0x76, 0x63, 0x0b, 0x28, 0x37, 0x5a, 0x19, 0xbc, 0xcb, 0x2a, 0xc7, 0xe2, 0x88, 0x76, 0x29, 0xc8, 0xc8, 0x88, 0x42, 0x04, 0x00, 0x12, 0xca, 0xe8, 0x52, 0x64, 0xf9, 0x8c, 0xed, 0xe6, 0xc6, 0xd5, 0x76, 0xa7, 0xc1, 0xcd, 0x51, 0x4a, 0x66, 0xd6, 0x1e, 0xe3, 0x3c, 0x66, 0x7c, 0x3d, 0xe5, 0xec, 0xe9, 0xfc, 0x14, 0xa7, 0x73, 0x3b, 0x35, 0xf2, 0xc5, 0x2f, 0x82, 0x3b, 0x5f, 0x5d, 0xfa, 0x5c, 0xf9, 0x8a, 0x51, 0xd9, 0x93, 0x93, 0xbb, 0xae, 0x53, 0x6b, 0xf0, 0x91, 0x9d, 0xc6, 0xf6, 0xce, 0xae, 0x5d, 0x6f, 0xb6, 0xab, 0xdd, 0x44, 0x59, 0x95, 0x22, 0x3b, 0xd5, 0x9b, 0xbb, 0x4d, 0xc7, 0x2d, 0x2c, 0xda, 0x9d, 0xf6, 0x9e, 0x5b, 0x73, 0x74, 0x18, 0xa7, 0x62, 0x77, 0xdd, 0xed, 0x8d, 0x7d, 0xf3, 0xf0, 0x81, 0x79, 0xb8, 0x67, 0x1e, 0xde, 0x89, 0x0e, 0x77, 0x6a, 0xae, 0x69, 0x36, 0x0e, 0xc3, 0x6c, 0x2e, 0x9a, 0x5d, 0xbe, 0xb9, 0xd7, 0xac, 0x76, 0x9d, 0x2d, 0x08, 0xc9, 0xdd, 0xbd, 0xae, 0xed, 0x3a, 0x9d, 0x76, 0x73, 0x0f, 0x55, 0x97, 0x47, 0xf9, 0x50, 0x2e, 0x18, 0x2a, 0x71, 0x1b, 0x14, 0x66, 0xcf, 0xe7, 0xa7, 0x72, 0xd3, 0x33, 0x33, 0x5c, 0x75, 0x02, 0xfd, 0x72, 0xd5, 0xdd, 0x6a, 0x39, 0x9d, 0x8e, 0xdd, 0xae, 0x03, 0xdd, 0x6a, 0xab, 0xd9, 0x68, 0x39, 0x79, 0x01, 0xb2, 0x27, 0xde, 0xc8, 0x4f, 0x81, 0x69, 0x3a, 0xed, 0x7a, 0x57, 0x8c, 0x4c, 0x4c, 0x9f, 0xe7, 0x23, 0x37, 0x9d, 0xad, 0xc6, 0xde, 0x4d, 0x18, 0x13, 0xfc, 0xec, 0x00, 0x8d, 0x75, 0xc0, 0x2d, 0x21, 0x82, 0x89, 0xf0, 0x6e, 0x63, 0xdf, 0x69, 0x76, 0x78, 0xd2, 0x08, 0x2e, 0x31, 0x51, 0x08, 0xaf, 0x30, 0xc3, 0x07, 0x90, 0x62, 0x80, 0xfc, 0xd5, 0xc6, 0x7e, 0x69, 0xa2, 0xe8, 0x53, 0x5f, 0x6c, 0x74, 0x76, 0x9b, 0xd5, 0x03, 0xbb, 0x57, 0x75, 0x77, 0x25, 0xad, 0x29, 0x8e, 0xd9, 0x6a, 0xb7, 0x1c, 0xd1, 0x07, 0x07, 0x99, 0x14, 0x02, 0x38, 0xfb, 0x5d, 0xd7, 0xb9, 0xe9, 0x28, 0x7d, 0x20, 0x8e, 0x50, 0x08, 0x4e, 0x39, 0x3f, 0x83, 0x3a, 0x81, 0x9b, 0x99, 0x37, 0x50, 0x2d, 0xb6, 0x5c, 0x60, 0xfe, 0x66, 0x7b, 0xaf, 0xd5, 0xe5, 0x5a, 0xd9, 0xa9, 0x6e, 0xb5, 0x7b, 0xe0, 0xf8, 0x9d, 0x2f, 0xe5, 0x3d, 0x9e, 0xb0, 0xb7, 0x58, 0x75, 0xbf, 0x54, 0x9a, 0xca, 0xcf, 0x5e, 0x08, 0x8c, 0x5e, 0x01, 0x0f, 0xeb, 0x96, 0xa6, 0x71, 0x98, 0x53, 0x9a, 0x78, 0x4e, 0x45, 0xf2, 0xd5, 0x59, 0xbb, 0xf4, 0xa6, 0xdd, 0x6d, 0xdb, 0x57, 0x40, 0x89, 0x55, 0x57, 0x8a, 0x3e, 0xdf, 0xe9, 0xec, 0xa1, 0x1b, 0xef, 0x75, 0xf0, 0x5f, 0x31, 0xe5, 0x60, 0x17, 0x7c, 0x02, 0x5c, 0xba, 0xbb, 0x07, 0xf6, 0xb7, 0xbb, 0x98, 0x0c, 0x3b, 0x3b, 0xed, 0xbd, 0xe6, 0x16, 0xa8, 0xa8, 0x6b, 0x6f, 0x3a, 0x76, 0xcb, 0x71, 0xb6, 0x9c, 0x2d, 0x5f, 0xa4, 0x4a, 0x5b, 0xd0, 0x9c, 0xce, 0x88, 0x7e, 0x2d, 0xfb, 0xb6, 0xeb, 0x00, 0x76, 0x2b, 0x53, 0x9b, 0x03, 0x31, 0xa7, 0x66, 0xa6, 0x66, 0x66, 0xb3, 0x9f, 0xa9, 0x4d, 0x4e, 0x17, 0xf2, 0x3f, 0x55, 0xf8, 0xe9, 0xdd, 0x76, 0x2f, 0x93, 0xa9, 0x8d, 0xc3, 0xf8, 0xec, 0x6c, 0x76, 0x72, 0x1a, 0x9b, 0x5c, 0x21, 0x3f, 0x93, 0xbd, 0x70, 0x5b, 0xa8, 0xb9, 0xe8, 0xd1, 0xcb, 0xf0, 0x9e, 0x47, 0x8d, 0x67, 0xbc, 0x8c, 0xbf, 0x58, 0x2d, 0xef, 0x66, 0x73, 0x7a, 0x77, 0x3b, 0xd8, 0xdd, 0xcc, 0x22, 0x4d, 0x21, 0xa7, 0x18, 0x45, 0xf1, 0x51, 0xc6, 0xe7, 0x2b, 0xfc, 0xba, 0xbb, 0xbd, 0x69, 0x12, 0x1d, 0x24, 0x9c, 0x2a, 0x4e, 0x17, 0xa7, 0xde, 0xf8, 0x4c, 0x6d, 0x4c, 0x88, 0xce, 0x85, 0x1d, 0x43, 0x05, 0xd4, 0x72, 0x53, 0xf9, 0x99, 0xe9, 0xf3, 0xe7, 0xcf, 0x67, 0x27, 0x84, 0x22, 0x74, 0xe9, 0x91, 0x60, 0x8c, 0xec, 0x62, 0x2d, 0x29, 0xb9, 0xea, 0x6c, 0xeb, 0x1d, 0x5d, 0xea, 0x15, 0x90, 0xd9, 0xe9, 0x74, 0x6d, 0x47, 0x45, 0xba, 0x48, 0x4a, 0xf6, 0x76, 0xe3, 0x96, 0xd3, 0x12, 0x29, 0x01, 0x25, 0xdf, 0x6d, 0xc3, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xda, 0xe2, 0x1a, 0x70, 0x9a, 0xe0, 0xc3, 0xf5, 0x8e, 0xd3, 0x55, 0xda, 0x6a, 0x76, 0xda, 0xf6, 0x5b, 0x8e, 0xdb, 0xfe, 0x49, 0x8c, 0x4c, 0x8c, 0x79, 0xd7, 0x71, 0x54, 0xae, 0x28, 0xda, 0x17, 0x9d, 0x6e, 0x6d, 0x27, 0xc3, 0xc3, 0x04, 0x28, 0xe5, 0xf8, 0x0d, 0x4c, 0xcb, 0xf2, 0x4c, 0x0f, 0x23, 0x25, 0xd4, 0x50, 0xdb, 0xcd, 0xc0, 0xed, 0x18, 0x30, 0x35, 0x8e, 0xb0, 0x71, 0x1e, 0x4b, 0x10, 0x08, 0xa0, 0x8d, 0xd9, 0x6c, 0x76, 0x12, 0xc6, 0x79, 0x82, 0x97, 0x32, 0x7b, 0x7e, 0x30, 0x9d, 0x2f, 0x40, 0x22, 0x97, 0x56, 0x29, 0x2c, 0x66, 0x44, 0x46, 0xcd, 0x01, 0xa9, 0xfc, 0xfe, 0x41, 0x8e, 0xe7, 0x96, 0x6c, 0x1e, 0xe4, 0xf7, 0x25, 0x87, 0x28, 0xef, 0x56, 0x5b, 0x35, 0x07, 0x33, 0x87, 0x27, 0xbd, 0x4c, 0x26, 0xe0, 0x04, 0x2d, 0xa9, 0x18, 0x2e, 0xa6, 0x97, 0xee, 0x10, 0xc9, 0x93, 0x20, 0xfb, 0x36, 0x32, 0x2d, 0xb9, 0xbd, 0x20, 0x39, 0x9a, 0xc8, 0x20, 0xff, 0x13, 0x9e, 0x24, 0xd9, 0xec, 0x84, 0x12, 0x21, 0x2b, 0x4c, 0x38, 0x32, 0x22, 0x73, 0xc8, 0xa2, 0x7d, 0xa9, 0xba, 0xd7, 0xe9, 0x34, 0xaa, 0x2d, 0xdf, 0x57, 0x70, 0x44, 0x3a, 0x0a, 0xea, 0x48, 0xe5, 0xe4, 0x6a, 0xd3, 0xf1, 0xec, 0xec, 0xec, 0xef, 0x16, 0x32, 0x7c, 0x68, 0x0c, 0xd7, 0xc6, 0x35, 0x3c, 0xa1, 0x8a, 0x13, 0xdd, 0xea, 0xae, 0x47, 0xd6, 0xae, 0x37, 0x9a, 0x5d, 0xc7, 0xb5, 0xab, 0xcd, 0x36, 0xd8, 0x70, 0xa7, 0xed, 0xbe, 0x65, 0xab, 0xfc, 0xc8, 0x0d, 0x72, 0x19, 0x46, 0x8a, 0xbe, 0x41, 0xc4, 0x62, 0x9e, 0x45, 0xf8, 0x94, 0xcd, 0x92, 0xb0, 0x9a, 0x32, 0x58, 0x66, 0x02, 0x3c, 0x34, 0x87, 0x73, 0xc4, 0x83, 0x56, 0xf8, 0x60, 0x78, 0x12, 0xe6, 0xcb, 0xf0, 0xa4, 0xad, 0xc8, 0xa4, 0x20, 0x25, 0xb1, 0xfa, 0x56, 0xa7, 0x5b, 0xe2, 0x4a, 0x46, 0xb1, 0xf2, 0xfc, 0xd9, 0x87, 0x72, 0x2d, 0xb4, 0x5b, 0xf0, 0xdc, 0x05, 0xb0, 0x32, 0x1a, 0x58, 0xa8, 0xe7, 0x60, 0x36, 0xcc, 0xfb, 0xb8, 0x5c, 0x27, 0x25, 0x99, 0xd1, 0x35, 0x9a, 0xbd, 0xcd, 0x12, 0x57, 0x2b, 0xd0, 0xe6, 0xdc, 0x0b, 0x75, 0xea, 0x13, 0x6a, 0xde, 0x04, 0x4c, 0x3a, 0x86, 0x09, 0x5b, 0xfe, 0x84, 0x10, 0x05, 0x60, 0x6e, 0x4d, 0xd8, 0x45, 0x28, 0xdb, 0x0b, 0xa1, 0xbc, 0xe6, 0xa6, 0x99, 0xcd, 0xb1, 0xde, 0xe6, 0x78, 0x6d, 0xac, 0x57, 0x1b, 0xdf, 0x1a, 0xeb, 0x6d, 0x65, 0x27, 0x33, 0xd0, 0x85, 0x0e, 0xdc, 0x7a, 0xa6, 0x9b, 0x7d, 0x66, 0xd3, 0xcd, 0x26, 0x9b, 0xae, 0x1a, 0x31, 0x5d, 0x21, 0x6a, 0x95, 0x1f, 0x9c, 0x7d, 0xf9, 0x24, 0x27, 0x32, 0xa9, 0xf0, 0x83, 0x72, 0x82, 0xaa, 0xef, 0x04, 0x05, 0xa3, 0x8d, 0xbf, 0x9f, 0x5e, 0x22, 0x27, 0x38, 0xfe, 0x84, 0xc2, 0x47, 0x71, 0xa3, 0xea, 0x58, 0xaf, 0x3a, 0x1e, 0xf4, 0xa5, 0x71, 0x67, 0xac, 0xe7, 0xa0, 0x43, 0x55, 0xc7, 0x95, 0x4f, 0x8d, 0xc3, 0x80, 0xe7, 0x56, 0x92, 0xaa, 0xda, 0x1b, 0x69, 0x0a, 0x13, 0x3c, 0xe1, 0xde, 0x2a, 0xd6, 0x8f, 0x4c, 0xe6, 0x38, 0xd0, 0xf3, 0xaf, 0x27, 0x0e, 0xa0, 0xe4, 0xd4, 0x56, 0xcd, 0x5f, 0x7c, 0xbe, 0xd9, 0x84, 0xdd, 0x8d, 0x97, 0x4a, 0x77, 0xe0, 0x71, 0xc0, 0xdd, 0x98, 0x67, 0x58, 0xa7, 0x5e, 0x87, 0x7d, 0xb8, 0x48, 0xb9, 0x9e, 0x5f, 0x57, 0xdc, 0x86, 0x96, 0x5f, 0x35, 0x5f, 0x16, 0xb9, 0x0a, 0x79, 0x9c, 0x50, 0xbb, 0x73, 0xe5, 0xc1, 0x22, 0x16, 0x10, 0x84, 0x7e, 0x19, 0xf0, 0x5b, 0x1f, 0xcb, 0xdb, 0xd3, 0xfb, 0xfe, 0xc0, 0x45, 0x0f, 0x52, 0xf4, 0x5c, 0xc1, 0x83, 0xf9, 0x24, 0x3d, 0x2f, 0xf0, 0x61, 0x1e, 0x9e, 0x54, 0x47, 0xd0, 0x3e, 0x81, 0x47, 0x4d, 0xdb, 0xe5, 0x4f, 0x4e, 0x6d, 0x27, 0x0c, 0xf8, 0xf8, 0x1c, 0x85, 0xb7, 0x3b, 0x31, 0x8a, 0xcf, 0x4a, 0x88, 0xf7, 0xdd, 0x9d, 0xaa, 0xf7, 0xb8, 0xb9, 0x01, 0xbb, 0xc9, 0x90, 0x3a, 0xd4, 0x23, 0x07, 0xfc, 0x07, 0xd9, 0xbe, 0x80, 0xc7, 0x02, 0x72, 0x7c, 0xcc, 0xdb, 0x78, 0x8e, 0x23, 0x7b, 0xf9, 0x83, 0x31, 0xfe, 0x6f, 0x76, 0x8c, 0x6f, 0x64, 0xf7, 0x73, 0x1e, 0x60, 0x9f, 0x03, 0xf6, 0x25, 0xe0, 0x20, 0x20, 0x02, 0xd2, 0x81, 0x67, 0xd5, 0x38, 0xee, 0x3d, 0x15, 0xff, 0xeb, 0xc1, 0x5d, 0x2a, 0xd7, 0xed, 0x32, 0x74, 0xa2, 0xac, 0xe5, 0xf7, 0xc7, 0x4b, 0x62, 0x69, 0xbe, 0x9f, 0x56, 0x86, 0x40, 0xcc, 0x12, 0xdf, 0x9f, 0xa8, 0xbd, 0x6d, 0x2e, 0x72, 0x23, 0xb8, 0xe0, 0x34, 0x4a, 0x75, 0xb7, 0x5a, 0xeb, 0x0a, 0x56, 0x27, 0xcf, 0x2b, 0x1d, 0x37, 0xea, 0x62, 0x04, 0x76, 0x4d, 0xc5, 0x62, 0x31, 0xcb, 0xb9, 0x71, 0x4b, 0xde, 0xb6, 0x98, 0xcf, 0x81, 0x87, 0x37, 0x3c, 0xd0, 0xfd, 0x89, 0xb8, 0x7d, 0xe2, 0x13, 0xb7, 0x4d, 0x13, 0x39, 0x64, 0x33, 0x04, 0x91, 0x7a, 0xc0, 0xc1, 0x0b, 0xb7, 0xb9, 0x76, 0x03, 0xaf, 0xa7, 0x59, 0x9b, 0xcb, 0xea, 0xbf, 0x96, 0xc0, 0xbe, 0x6d, 0x4a, 0x86, 0xb0, 0xb7, 0x71, 0x0f, 0x52, 0xe4, 0x5a, 0x82, 0x94, 0xe5, 0x76, 0x4b, 0xf0, 0x5e, 0x7a, 0xd1, 0xad, 0x6e, 0xf3, 0x57, 0x41, 0xd8, 0x98, 0x88, 0xad, 0x01, 0x7f, 0xcb, 0xcb, 0x89, 0xb7, 0x3a, 0x21, 0x2a, 0x9f, 0x9c, 0x3f, 0x28, 0xf1, 0x97, 0xb1, 0x09, 0xd9, 0xe3, 0x7b, 0xfe, 0x11, 0xa5, 0xf2, 0x12, 0xf7, 0x0d, 0x0e, 0x9a, 0xf4, 0xa8, 0xf4, 0x04, 0x95, 0x9d, 0xac, 0x78, 0x05, 0x1b, 0xf1, 0x96, 0x83, 0x37, 0x67, 0xdc, 0xfd, 0x94, 0x30, 0xbc, 0xd0, 0x5e, 0x63, 0xdc, 0x7c, 0x21, 0x6e, 0xbc, 0x57, 0x67, 0x0f, 0x47, 0xbc, 0x60, 0xcf, 0xc8, 0x5d, 0x65, 0x26, 0x4c, 0x2e, 0x1b, 0x7a, 0x53, 0x4e, 0xdd, 0x4e, 0xfd, 0x2f, 0x6d, 0xfb, 0x03, 0x6c, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x92, 0x58, 0x16, 0x49, 0x15, 0x49, 0x49, 0x76, 0xb9, 0x5c, 0x34, 0x08, 0x0e, 0x48, 0xc4, 0x20, 0xc0, 0x1a, 0x80, 0x02, 0xb9, 0x1b, 0x55, 0xe5, 0xa8, 0x43, 0x0e, 0xb9, 0x7a, 0x4f, 0x9b, 0xe4, 0x12, 0xb3, 0x74, 0xc8, 0xe3, 0x0f, 0xb4, 0xa4, 0xc4, 0x89, 0x9d, 0x0e, 0xd6, 0x1b, 0xdb, 0x79, 0x9a, 0xa2, 0xed, 0xc4, 0xce, 0x0b, 0x42, 0xb8, 0xb1, 0xf3, 0xde, 0x2a, 0xe5, 0xfb, 0xfa, 0x31, 0xd3, 0x33, 0xd3, 0x33, 0x94, 0xd6, 0xb2, 0xbd, 0x61, 0xd8, 0xc3, 0x56, 0x4f, 0xf7, 0xd7, 0xdf, 0xd7, 0xdf, 0x7b, 0x7a, 0x7a, 0x50, 0x1a, 0xb6, 0x2c, 0xeb, 0xb9, 0x77, 0x3e, 0x61, 0xf5, 0x18, 0x94, 0x3b, 0x77, 0xee, 0xdc, 0x3d, 0x38, 0x38, 0xb8, 0x8b, 0x2d, 0x74, 0xef, 0x32, 0xea, 0x55, 0xc6, 0xfa, 0x83, 0x3b, 0x77, 0xd8, 0xe0, 0xe0, 0x80, 0x0e, 0xee, 0xfc, 0x36, 0x1d, 0xb0, 0xbb, 0x94, 0xd1, 0xbb, 0x94, 0xaa, 0xca, 0xf1, 0x87, 0x87, 0x87, 0x73, 0xe9, 0x74, 0x3a, 0x87, 0x2d, 0x74, 0x73, 0x80, 0xa7, 0x2a, 0xe2, 0x0f, 0x0f, 0xb3, 0x41, 0x3a, 0x4d, 0x07, 0xc3, 0xaf, 0x02, 0x7e, 0x8e, 0x0e, 0xa8, 0xa8, 0x7d, 0x9a, 0xb3, 0x18, 0xc7, 0x07, 0xdc, 0xe9, 0x62, 0xb1, 0x38, 0x8d, 0x2d, 0x74, 0xa7, 0x09, 0x54, 0xc0, 0x9d, 0x96, 0xf8, 0xe9, 0x34, 0x1b, 0x14, 0x8b, 0x74, 0x90, 0x2e, 0x00, 0xfe, 0x34, 0x1d, 0x10, 0xa8, 0x74, 0x1a, 0xf0, 0xa7, 0x25, 0x7e, 0xb7, 0xdb, 0x6d, 0xd4, 0x6a, 0xb5, 0x06, 0xb6, 0xd0, 0xe5, 0x95, 0x58, 0x04, 0x5b, 0xc4, 0xef, 0x76, 0xd9, 0xa0, 0x56, 0xa3, 0x83, 0xee, 0x26, 0xe0, 0x37, 0x80, 0x66, 0x83, 0x52, 0x0b, 0x2a, 0xb6, 0x5f, 0x3b, 0x3c, 0x7c, 0xf1, 0x10, 0xcb, 0xa3, 0x87, 0x87, 0x87, 0x83, 0xc1, 0xe1, 0xa3, 0xc1, 0xe0, 0x21, 0x76, 0xe1, 0x9f, 0x47, 0xdf, 0x1e, 0x0c, 0x5e, 0x52, 0x70, 0x3e, 0x0e, 0x70, 0x3e, 0x2f, 0x02, 0x7f, 0x28, 0xf1, 0x65, 0x0b, 0xfd, 0x00, 0xfc, 0x91, 0xa4, 0xff, 0x48, 0xe2, 0x3f, 0xf2, 0xf1, 0x3f, 0x5f, 0xab, 0xfd, 0x4c, 0xed, 0xd6, 0x66, 0xad, 0xb6, 0x79, 0x4b, 0xd4, 0x6e, 0x97, 0xb7, 0x30, 0x72, 0x6b, 0xa7, 0xdb, 0x7d, 0xc1, 0x4e, 0xa7, 0x3f, 0x96, 0x1e, 0x7e, 0x35, 0x9d, 0x7e, 0xf5, 0x95, 0xb4, 0xde, 0xc2, 0xdd, 0x2b, 0x3f, 0x37, 0x3c, 0xfc, 0xdc, 0x3b, 0x07, 0x07, 0xa9, 0x83, 0x2f, 0xbd, 0x7d, 0xc0, 0xeb, 0xdb, 0x5f, 0x3a, 0x50, 0xf7, 0x70, 0xf7, 0xf6, 0xaf, 0x7f, 0xf1, 0x8b, 0x43, 0x13, 0xc5, 0xe2, 0xb9, 0x62, 0xe1, 0xb5, 0x22, 0xaf, 0xaf, 0xa5, 0x41, 0xcb, 0xd8, 0x16, 0x8a, 0x05, 0xf8, 0x17, 0x69, 0x73, 0x7b, 0xa3, 0xed, 0xf9, 0xf5, 0x55, 0x7e, 0xff, 0x6b, 0xe0, 0x07, 0xcc, 0xa2, 0xa8, 0xdb, 0x1e, 0xbb, 0x6b, 0x31, 0xb0, 0x7d, 0xff, 0x2e, 0xd8, 0xff, 0x40, 0x56, 0xf4, 0x07, 0x8b, 0xf6, 0x07, 0x8c, 0x0d, 0x06, 0xdc, 0xde, 0x68, 0xfb, 0xf4, 0x7d, 0x68, 0xf1, 0x4a, 0xa7, 0x7f, 0x1e, 0xfc, 0xc0, 0xc3, 0xcf, 0x51, 0x0a, 0xb6, 0xe7, 0x35, 0x97, 0xa6, 0x8c, 0xfb, 0xc1, 0xb0, 0x8f, 0xcf, 0xed, 0x8d, 0xb6, 0x7f, 0xf0, 0xe0, 0xc1, 0x74, 0x71, 0x7a, 0x1a, 0xef, 0x91, 0x86, 0x87, 0x3f, 0x4d, 0x29, 0xd8, 0x9e, 0x3e, 0x80, 0x3a, 0x5d, 0xa4, 0x8c, 0xfb, 0x41, 0xda, 0xc7, 0xe7, 0xb6, 0x46, 0xdb, 0xd7, 0xb0, 0xfd, 0x32, 0xbf, 0xff, 0x15, 0xf0, 0x03, 0x0f, 0xbf, 0x61, 0x31, 0xb0, 0x7d, 0xbf, 0x01, 0xf6, 0xaf, 0xc9, 0x8a, 0xfe, 0xa0, 0xf0, 0x21, 0x0c, 0xac, 0x38, 0x1f, 0xc0, 0x71, 0x1d, 0x1e, 0xf6, 0x81, 0x20, 0x3c, 0xea, 0x03, 0x01, 0xb8, 0xc1, 0x07, 0x14, 0x3c, 0xce, 0x07, 0x70, 0x1c, 0xe1, 0x71, 0x3e, 0x80, 0xe3, 0x08, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0xb8, 0x31, 0x7e, 0x79, 0x49, 0xe7, 0x72, 0xec, 0xbe, 0x29, 0x7e, 0x01, 0x0e, 0xf6, 0x84, 0x7a, 0x1f, 0xaa, 0xf5, 0x0c, 0xca, 0xe6, 0x75, 0xe7, 0x05, 0xeb, 0xc7, 0x54, 0xd0, 0xb9, 0x22, 0x95, 0x11, 0x5e, 0x41, 0xfd, 0x45, 0x2c, 0x11, 0xf8, 0xb7, 0x5e, 0xf4, 0xe6, 0x14, 0xcf, 0x59, 0x16, 0xaf, 0x3f, 0x78, 0xfc, 0x98, 0xb7, 0x5f, 0x7f, 0xf1, 0xb0, 0xa8, 0x17, 0x05, 0xd7, 0xe7, 0x69, 0xc5, 0xfa, 0x88, 0x17, 0x3f, 0x7e, 0xb1, 0xbd, 0xcf, 0xa2, 0xf1, 0x6b, 0x61, 0xcc, 0xf6, 0x21, 0x76, 0xb9, 0x0f, 0x84, 0xe3, 0xf7, 0x59, 0xf0, 0x70, 0xfc, 0xf8, 0xb1, 0x75, 0x56, 0xce, 0xca, 0x59, 0xf9, 0x29, 0x15, 0x42, 0x44, 0x85, 0x6c, 0x4e, 0x09, 0xe3, 0x55, 0x2f, 0x94, 0x11, 0x00, 0x41, 0xa5, 0x98, 0x15, 0x70, 0x12, 0x0b, 0x25, 0x59, 0x84, 0xc3, 0xc5, 0x04, 0x2e, 0xb6, 0x41, 0x02, 0x40, 0x9b, 0x59, 0x62, 0x9c, 0xc9, 0x7e, 0x00, 0x5f, 0x8c, 0x71, 0xb8, 0x9c, 0x1b, 0x5c, 0x9f, 0x09, 0xfa, 0x6a, 0x0d, 0x46, 0x22, 0xeb, 0x23, 0xff, 0x02, 0xdf, 0x12, 0x55, 0x81, 0x20, 0x89, 0xc7, 0x55, 0x9f, 0x3d, 0x8d, 0x3e, 0x5e, 0xc4, 0x20, 0x1f, 0x55, 0x6b, 0x33, 0x7e, 0x1f, 0x14, 0xcf, 0xd7, 0x99, 0x49, 0x7f, 0x42, 0x26, 0x2a, 0x74, 0xc7, 0xf5, 0x17, 0xe6, 0x1f, 0xe6, 0x13, 0xca, 0xab, 0x11, 0x9f, 0x11, 0x50, 0x3d, 0xf3, 0x2a, 0xf6, 0x03, 0xe6, 0xa3, 0x04, 0x59, 0x22, 0xd0, 0x12, 0x6c, 0x29, 0x0d, 0xc2, 0x3d, 0xbe, 0x95, 0x7d, 0x2c, 0x6a, 0xb0, 0x2f, 0x13, 0x95, 0xdb, 0x88, 0x19, 0x9c, 0x84, 0xfa, 0x35, 0x62, 0x5f, 0x29, 0x23, 0x95, 0xf6, 0x0b, 0xef, 0x0a, 0x24, 0x0c, 0xfd, 0xc7, 0x52, 0x36, 0x36, 0xf9, 0x0f, 0xa7, 0x6d, 0xc2, 0x0f, 0xf9, 0x07, 0x8d, 0xfa, 0x87, 0xa9, 0xd5, 0x26, 0x80, 0x92, 0x50, 0xbb, 0xf8, 0x87, 0x8e, 0xcc, 0xa2, 0xfe, 0xa5, 0xec, 0x2b, 0xdb, 0x88, 0xf4, 0x5c, 0x2f, 0x06, 0xde, 0x74, 0x1e, 0x19, 0x31, 0xe2, 0xe2, 0xe2, 0x52, 0x6f, 0x84, 0xc7, 0x90, 0x15, 0x94, 0x5f, 0xf9, 0x93, 0xb2, 0x0b, 0x8d, 0x6c, 0xab, 0x70, 0x5d, 0x2a, 0x7c, 0xdc, 0xe0, 0x3e, 0x1e, 0x3e, 0x8d, 0xc1, 0xd7, 0xfd, 0x57, 0xe9, 0x38, 0x42, 0x9f, 0x48, 0xf9, 0x88, 0xe4, 0x37, 0xc4, 0x3e, 0x93, 0x71, 0xc6, 0xa2, 0x60, 0x4f, 0xef, 0xd2, 0xc6, 0xd4, 0xa0, 0x5f, 0xc5, 0x97, 0xaa, 0x11, 0xdd, 0xc9, 0xfc, 0x22, 0x78, 0xb1, 0x22, 0xfe, 0x69, 0xf9, 0x1e, 0x12, 0xf5, 0x3f, 0xe2, 0xd3, 0xe0, 0x6d, 0x44, 0x3f, 0x58, 0x65, 0xfe, 0xa2, 0x42, 0x87, 0xb1, 0xf1, 0xc1, 0x82, 0xf9, 0x8b, 0x8a, 0x1c, 0xa2, 0x06, 0x88, 0x77, 0x4f, 0xb5, 0xf1, 0x18, 0xb5, 0xe9, 0xee, 0xa7, 0x6a, 0x9c, 0xeb, 0xd0, 0x38, 0xd7, 0xd2, 0xfc, 0x4a, 0xcf, 0x59, 0x7a, 0x7e, 0x4b, 0xf4, 0x4d, 0x6a, 0xc9, 0xdc, 0x2b, 0x43, 0x8f, 0xa9, 0x7c, 0x6b, 0x30, 0x2d, 0x8b, 0x9a, 0x18, 0x32, 0x25, 0x81, 0xac, 0x43, 0x98, 0x7e, 0xc9, 0xbe, 0x9e, 0x5f, 0xa1, 0x8b, 0xd9, 0xcb, 0xc2, 0x36, 0x90, 0x5f, 0x65, 0x6c, 0x63, 0x86, 0x22, 0xd0, 0x21, 0x9e, 0x0d, 0x89, 0xa7, 0x7b, 0x2e, 0x83, 0xe6, 0x1b, 0xc1, 0x18, 0x24, 0x8a, 0x79, 0x2e, 0x27, 0x2e, 0x4b, 0x74, 0x17, 0x66, 0xc4, 0x8f, 0x3b, 0xf5, 0x1c, 0x23, 0xbe, 0x2e, 0x08, 0x21, 0x44, 0x52, 0x09, 0xb6, 0x72, 0x5c, 0x77, 0x1e, 0x2a, 0x18, 0x07, 0x41, 0x18, 0x4f, 0x13, 0x67, 0xe5, 0xac, 0x9c, 0xf6, 0xc2, 0x8f, 0xc8, 0x06, 0x83, 0x41, 0x1f, 0xdf, 0xf4, 0xb1, 0xf0, 0xb6, 0xd7, 0x93, 0xed, 0x40, 0x82, 0x7b, 0x3a, 0xb8, 0xd7, 0x13, 0xd3, 0x07, 0xa2, 0xf5, 0x8b, 0x81, 0x4e, 0x08, 0x1c, 0xa1, 0x73, 0x66, 0x81, 0x9f, 0x6e, 0xe9, 0xf7, 0xd0, 0x90, 0x60, 0x37, 0xa8, 0x68, 0x20, 0x16, 0x2d, 0x03, 0xad, 0xf4, 0xc2, 0x40, 0xe5, 0x27, 0x48, 0x27, 0x06, 0x5f, 0xf9, 0x89, 0x11, 0xff, 0xcc, 0x02, 0x1f, 0xa1, 0xf8, 0x37, 0x54, 0xe6, 0x9b, 0xb5, 0x17, 0x53, 0x4d, 0xf8, 0x18, 0xe0, 0x30, 0xd6, 0x1f, 0x98, 0xf0, 0xf1, 0x5c, 0x69, 0x80, 0xb5, 0x17, 0x87, 0xdf, 0x1f, 0x88, 0xca, 0x8c, 0xf8, 0x88, 0xc7, 0xeb, 0x89, 0xeb, 0x47, 0xf1, 0x07, 0xa1, 0x6a, 0xc0, 0x1f, 0xe8, 0x35, 0x91, 0x7f, 0x33, 0xbe, 0x27, 0x7b, 0x5f, 0xaa, 0x50, 0xc7, 0xd7, 0x65, 0xc7, 0xfb, 0x93, 0xe3, 0x0f, 0x82, 0x0b, 0xe2, 0x46, 0x56, 0xc6, 0x62, 0x02, 0x94, 0x3d, 0x61, 0xd1, 0x83, 0x99, 0x85, 0xed, 0x6d, 0xe6, 0x45, 0xb3, 0x75, 0x94, 0x17, 0x29, 0x67, 0x2c, 0xbe, 0xb4, 0x71, 0x02, 0x3e, 0xeb, 0x27, 0xe1, 0xf7, 0xd8, 0x8f, 0x86, 0xaf, 0xd9, 0x29, 0x0e, 0x5f, 0xd9, 0xfa, 0x47, 0x59, 0xbf, 0x9f, 0x84, 0xdf, 0x4b, 0xc0, 0x0f, 0x97, 0x9e, 0xe0, 0x99, 0xd7, 0xfe, 0x13, 0xd4, 0x84, 0xb8, 0xf4, 0xe3, 0xf3, 0x29, 0x9c, 0xc3, 0x14, 0xff, 0x2c, 0x39, 0x0f, 0x24, 0xe1, 0xf7, 0x93, 0xf0, 0x7b, 0x27, 0xe2, 0xf7, 0x07, 0x49, 0xf8, 0x5e, 0xfe, 0xf8, 0x10, 0xeb, 0x07, 0xe2, 0xd7, 0x8c, 0xef, 0xc5, 0xff, 0x87, 0xe4, 0xbf, 0x9f, 0x84, 0xaf, 0xf2, 0x80, 0xee, 0xbb, 0x31, 0xcf, 0x4f, 0xdd, 0x77, 0x4e, 0x8c, 0xed, 0xa7, 0xc9, 0x03, 0x2c, 0xce, 0xaf, 0x82, 0xbc, 0x18, 0x7c, 0xaa, 0x1f, 0x8a, 0x1f, 0x2f, 0x5f, 0x47, 0xf0, 0x07, 0x5a, 0xbe, 0x36, 0xe3, 0xf7, 0x55, 0xfc, 0xf5, 0x8d, 0xf8, 0x32, 0xcf, 0xf7, 0x12, 0xd7, 0x4f, 0xc0, 0x8f, 0xe6, 0xfb, 0x38, 0xfc, 0x40, 0x1e, 0x08, 0xe3, 0xc7, 0xaf, 0xdf, 0x1f, 0x68, 0x39, 0xa0, 0x6f, 0xe2, 0x5f, 0xe5, 0x80, 0xde, 0x53, 0xd8, 0xb2, 0x27, 0x65, 0xf9, 0xd8, 0x57, 0x3e, 0x61, 0xe1, 0xd7, 0x91, 0x77, 0x5f, 0x86, 0xfa, 0x01, 0x54, 0xf6, 0x32, 0xd4, 0x0f, 0x44, 0x0b, 0x03, 0xc7, 0xc7, 0x30, 0x78, 0xac, 0x26, 0x3c, 0xb6, 0x8e, 0x01, 0xf0, 0x2e, 0x4c, 0x38, 0x66, 0x72, 0xd2, 0xf1, 0x63, 0xfc, 0x13, 0xb7, 0x38, 0x55, 0xab, 0x12, 0x7c, 0x56, 0xce, 0xca, 0x59, 0xf9, 0x3f, 0xbd, 0x89, 0xd7, 0xaa, 0x65, 0x45, 0xbf, 0x9f, 0x50, 0xcb, 0x4a, 0xfa, 0x52, 0x4f, 0xc5, 0xd1, 0x74, 0xa0, 0x0d, 0x9f, 0xbf, 0x12, 0x79, 0x0c, 0x87, 0x37, 0xd1, 0xe3, 0x57, 0xff, 0xdc, 0x95, 0xaa, 0x7e, 0xe8, 0x08, 0x92, 0xe3, 0x13, 0x71, 0x76, 0x47, 0x49, 0xf4, 0x7c, 0x99, 0x26, 0xc9, 0xa7, 0xce, 0x74, 0x89, 0x7e, 0x5c, 0x17, 0x39, 0x3e, 0xf6, 0x2a, 0x35, 0x1c, 0xbf, 0x13, 0x22, 0x8e, 0xfd, 0xf9, 0xb1, 0x1f, 0x31, 0x1f, 0xd1, 0x53, 0x16, 0x7f, 0x86, 0xab, 0x7f, 0xca, 0x88, 0xe3, 0x97, 0x3e, 0xc1, 0xdb, 0x2c, 0x25, 0xd1, 0xf3, 0x7b, 0x2b, 0xa2, 0xbf, 0x28, 0x5d, 0x26, 0x4f, 0x4f, 0x59, 0xf4, 0xf3, 0x85, 0x77, 0xbe, 0xab, 0x7c, 0x20, 0xfc, 0x7d, 0x8c, 0x79, 0xdf, 0xd7, 0xe4, 0x94, 0x08, 0x9c, 0x78, 0xdf, 0xdd, 0x08, 0x8d, 0xa7, 0xcf, 0xa8, 0x9a, 0x6b, 0x45, 0xf0, 0x99, 0xb6, 0x8e, 0xe9, 0xf3, 0x8b, 0x82, 0x9b, 0xf8, 0xd7, 0xd7, 0x37, 0x7c, 0xfe, 0x93, 0xf8, 0x24, 0xd0, 0x9a, 0xe1, 0xc2, 0x38, 0x94, 0xc5, 0xeb, 0xdc, 0xa4, 0xff, 0x30, 0x3c, 0x62, 0x5f, 0xcd, 0x36, 0x26, 0xff, 0xd3, 0x6d, 0x6f, 0xf2, 0x81, 0x00, 0x9e, 0xe9, 0xf3, 0x96, 0x26, 0xbf, 0x31, 0x7e, 0xa5, 0xdf, 0xf2, 0xb3, 0x6f, 0xc3, 0x1a, 0x4a, 0x7e, 0x5e, 0x99, 0x68, 0xc3, 0xf6, 0x17, 0x30, 0xbf, 0x35, 0xe3, 0xc7, 0xd9, 0x47, 0xa3, 0x6f, 0xc0, 0xd7, 0xed, 0x1f, 0xe7, 0x5f, 0x01, 0xb8, 0x41, 0x7e, 0x3e, 0x4e, 0x89, 0x66, 0x47, 0xdd, 0xfd, 0x82, 0xb2, 0x85, 0xe5, 0xa3, 0xea, 0xa3, 0x45, 0xac, 0xff, 0x13, 0xcf, 0xc8, 0xcc, 0xe0, 0xdf, 0x9c, 0xa6, 0xfc, 0xa6, 0xc0, 0xdb, 0xb0, 0xfe, 0xc2, 0x35, 0x4c, 0x9f, 0x4a, 0xde, 0x78, 0x9e, 0x24, 0x91, 0xfc, 0xc7, 0xe9, 0x13, 0x39, 0x87, 0x9a, 0xf8, 0x0f, 0xea, 0x37, 0x51, 0xff, 0x2c, 0x3e, 0x3e, 0x82, 0xf8, 0x24, 0x01, 0x3f, 0xaa, 0x3f, 0xa6, 0xf2, 0x1f, 0x33, 0xf9, 0x07, 0x89, 0x2a, 0xc1, 0x64, 0x9f, 0x38, 0xfe, 0xc3, 0x30, 0x12, 0x7d, 0x7e, 0x10, 0xe2, 0xeb, 0x90, 0x51, 0xb3, 0xfd, 0x75, 0x39, 0x83, 0xf1, 0x4b, 0x44, 0xd5, 0xf9, 0x0c, 0xdb, 0x5f, 0xcb, 0x2d, 0x91, 0xcf, 0x68, 0x2c, 0xf4, 0x7c, 0x49, 0xf8, 0xbc, 0xe8, 0xdf, 0x44, 0x9f, 0x09, 0xde, 0xf3, 0x87, 0xc4, 0x7c, 0xbe, 0x7d, 0xc2, 0x6f, 0x4a, 0x61, 0xff, 0x35, 0x2c, 0x69, 0xc4, 0xc1, 0xdc, 0x2d, 0xf2, 0xb7, 0xc1, 0x7f, 0x43, 0x3e, 0x60, 0xc2, 0x67, 0xea, 0x13, 0x30, 0x8b, 0x26, 0xc8, 0x24, 0xfa, 0xc1, 0x67, 0x94, 0x21, 0x07, 0xe2, 0x9e, 0x82, 0xc8, 0xbd, 0x85, 0xf1, 0xf9, 0x27, 0x73, 0x9c, 0x8c, 0x23, 0x2b, 0x14, 0xa3, 0xcc, 0x90, 0x83, 0x22, 0x02, 0x5a, 0xf1, 0xfe, 0x19, 0x4e, 0xfe, 0xc4, 0x44, 0x5f, 0xcf, 0x8f, 0x06, 0xfb, 0xea, 0xd5, 0x32, 0xc8, 0xaf, 0x9e, 0x8d, 0x3c, 0xfe, 0x89, 0x01, 0x9e, 0xc4, 0x7f, 0x28, 0x86, 0x4d, 0xcf, 0x90, 0x93, 0x73, 0x40, 0xc8, 0x3e, 0x34, 0xe6, 0x19, 0x60, 0x50, 0x8f, 0x6e, 0x7f, 0x63, 0xfc, 0x87, 0x6d, 0x67, 0x92, 0x3f, 0x21, 0xfe, 0xc3, 0x31, 0x6c, 0xf2, 0xe5, 0x40, 0x0e, 0xa0, 0x26, 0xfd, 0x12, 0xef, 0x1b, 0xba, 0x09, 0x1e, 0x96, 0x9d, 0x26, 0xe5, 0x80, 0x98, 0xf8, 0xa7, 0x31, 0xf1, 0x6f, 0x11, 0x43, 0x35, 0xc5, 0x3f, 0x8b, 0x89, 0x7f, 0xf1, 0xc1, 0xd9, 0x7a, 0x36, 0xbf, 0x96, 0x3d, 0x2b, 0x67, 0xe5, 0xac, 0x9c, 0x95, 0xe0, 0xfe, 0x80, 0x6a, 0xaf, 0x25, 0x34, 0x9a, 0x7a, 0x2c, 0x92, 0xb0, 0x7f, 0x20, 0xc4, 0xfb, 0x09, 0xa5, 0xd7, 0x46, 0xf2, 0xbf, 0xde, 0x1a, 0xd2, 0x63, 0xe0, 0xdd, 0x95, 0xc4, 0x1c, 0x4f, 0xa8, 0x9f, 0xe6, 0x10, 0x33, 0xff, 0xf1, 0x0c, 0x86, 0x64, 0x24, 0xe6, 0xfd, 0x19, 0xb5, 0xcc, 0xef, 0xcf, 0x4a, 0x46, 0x75, 0x0e, 0x11, 0xa7, 0x43, 0x76, 0xd2, 0x39, 0x44, 0xe8, 0x38, 0xc2, 0x8a, 0x6e, 0x73, 0x9e, 0xd8, 0x5e, 0x56, 0xfc, 0x11, 0x80, 0xf1, 0xcc, 0x40, 0xff, 0x69, 0x13, 0x33, 0xf1, 0xae, 0xc9, 0x6f, 0x7a, 0xbc, 0xe9, 0xf4, 0x93, 0xe0, 0x96, 0x81, 0x3e, 0xd1, 0x7c, 0xc3, 0xf4, 0xfc, 0x63, 0x44, 0x7b, 0x6c, 0x12, 0xf3, 0xf6, 0x8b, 0x58, 0x41, 0x1f, 0x8b, 0xe8, 0x8d, 0x04, 0x8f, 0x79, 0x22, 0xf4, 0x49, 0x32, 0x7e, 0x12, 0x7f, 0x56, 0x42, 0x6c, 0x98, 0xe0, 0x09, 0xc7, 0x33, 0xb1, 0x7b, 0x71, 0xc5, 0x13, 0x33, 0xee, 0x6d, 0x12, 0x7f, 0x9e, 0x18, 0x90, 0xdf, 0xc4, 0x23, 0xd5, 0xe5, 0xb7, 0xcc, 0xf1, 0xa3, 0xeb, 0x87, 0x98, 0xb6, 0x37, 0x24, 0xd8, 0x9a, 0xec, 0xe3, 0x1d, 0xaf, 0xc5, 0xe0, 0xc7, 0xf9, 0x9f, 0x6e, 0x7f, 0xa3, 0x7f, 0x85, 0xe0, 0x24, 0x6e, 0xfd, 0x98, 0xfc, 0x40, 0xc8, 0x09, 0xf2, 0x85, 0xf2, 0x43, 0x9c, 0x7f, 0x59, 0xc1, 0x9f, 0x06, 0x46, 0xe9, 0xc7, 0xe4, 0xca, 0xf0, 0xd6, 0xcf, 0x44, 0x9f, 0x85, 0x62, 0x34, 0x49, 0x7f, 0x24, 0xc6, 0x7e, 0x24, 0x86, 0xbf, 0x80, 0xfd, 0x4c, 0xfa, 0x0b, 0xe9, 0x28, 0xce, 0x7e, 0x4c, 0x93, 0xd1, 0xa4, 0xff, 0xb8, 0xf8, 0x0f, 0xeb, 0x37, 0x4e, 0x7f, 0x27, 0xd9, 0x8f, 0x9c, 0xa0, 0x7f, 0x8f, 0xc7, 0x18, 0x7c, 0x1a, 0x67, 0x1f, 0x0d, 0x6e, 0xe2, 0x2f, 0x9c, 0x5f, 0x98, 0xe9, 0xfc, 0x4f, 0x97, 0xef, 0x84, 0x18, 0x36, 0x1d, 0xbf, 0x07, 0xfc, 0x2f, 0xc6, 0x3e, 0x4f, 0x7c, 0x9c, 0x4f, 0xac, 0xa7, 0x7e, 0xff, 0x67, 0xa1, 0x3c, 0x11, 0xe6, 0x9d, 0x59, 0xf1, 0xf1, 0x1b, 0xce, 0x01, 0x34, 0xe6, 0xe7, 0xe1, 0x71, 0xf6, 0x0d, 0xe4, 0xa8, 0x38, 0xfc, 0x90, 0x1f, 0x59, 0x09, 0x39, 0x2e, 0x7c, 0x46, 0x4a, 0x0c, 0x31, 0x14, 0x97, 0xbb, 0x8d, 0xf4, 0x49, 0x30, 0x90, 0x89, 0x81, 0x3e, 0xd1, 0x8e, 0x8e, 0x4c, 0xf1, 0x9b, 0x94, 0x5f, 0x4c, 0x39, 0xc0, 0xb2, 0x92, 0x73, 0x80, 0x95, 0x10, 0xc3, 0xd4, 0x4a, 0xc6, 0x67, 0x71, 0x39, 0x54, 0xb7, 0x8f, 0x21, 0x46, 0x58, 0xfc, 0xe3, 0xd1, 0x3f, 0x7e, 0x8e, 0xdb, 0x5f, 0x90, 0xf8, 0xfd, 0x57, 0x38, 0x86, 0xe9, 0x49, 0x70, 0x2b, 0x1e, 0x6e, 0x8a, 0xff, 0xf0, 0xfe, 0x8d, 0x24, 0xd0, 0x8f, 0xfb, 0x3e, 0xa3, 0xf2, 0x62, 0x52, 0xfc, 0xb3, 0x98, 0xf8, 0xa7, 0x06, 0x1f, 0x33, 0xfa, 0x07, 0x31, 0xc7, 0xbf, 0xa7, 0xdf, 0xe7, 0x73, 0x2f, 0x5b, 0xf4, 0x9e, 0xe9, 0xfa, 0xf6, 0x77, 0x4c, 0xd7, 0x69, 0x78, 0x39, 0x61, 0x7f, 0x6a, 0xba, 0xfa, 0x8f, 0x4c, 0xd7, 0xa9, 0x78, 0x19, 0xfb, 0x7f, 0x66, 0xdf, 0xaf, 0xbd, 0x17, 0xbe, 0xd0, 0xbe, 0xc7, 0xef, 0x87, 0xaf, 0x33, 0xfb, 0x9e, 0x16, 0xfb, 0xe2, 0x15, 0xb5, 0x2f, 0x5e, 0x67, 0xf6, 0x3d, 0xb3, 0xef, 0x47, 0xbd, 0x1c, 0x19, 0xcc, 0xdb, 0xbb, 0x77, 0x64, 0x30, 0xef, 0xe0, 0x54, 0xd8, 0xf7, 0xc8, 0x60, 0xde, 0x6f, 0x3d, 0x3c, 0x32, 0x98, 0xf7, 0x83, 0x87, 0xa7, 0x41, 0xde, 0xaf, 0xfe, 0x49, 0xd4, 0xc0, 0x87, 0x0f, 0xff, 0xe9, 0x9f, 0xa3, 0x06, 0x3e, 0x3c, 0x15, 0xf2, 0xfe, 0xf5, 0xdf, 0x98, 0xe2, 0xf7, 0xbf, 0xff, 0xe7, 0xd4, 0xe6, 0xe7, 0xde, 0x3d, 0xfe, 0x27, 0xcb, 0xbd, 0x23, 0x5e, 0x20, 0x58, 0xf9, 0x9f, 0x2c, 0xdf, 0x11, 0xa3, 0xa7, 0x22, 0x3f, 0xbf, 0xfb, 0x1e, 0xff, 0x93, 0xe5, 0xbd, 0xa3, 0xa3, 0xfb, 0x0f, 0x8e, 0x8e, 0x8e, 0xff, 0xe5, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x47, 0x47, 0xdf, 0xfd, 0xdb, 0xd3, 0x21, 0xef, 0x51, 0xa4, 0xfc, 0xd9, 0xd7, 0x8f, 0x0c, 0xe5, 0x5f, 0x7f, 0x70, 0x4a, 0xe4, 0x7d, 0xe7, 0x37, 0x02, 0x72, 0x7d, 0xf9, 0x8f, 0xfe, 0xe0, 0x0f, 0xff, 0xf8, 0x2b, 0x47, 0xbf, 0xf9, 0x5b, 0x81, 0xd1, 0xef, 0xff, 0xfd, 0xdf, 0x7d, 0xef, 0x1f, 0xfe, 0xf1, 0x54, 0xc8, 0xfb, 0x3b, 0xbf, 0x1b, 0x90, 0xec, 0xcf, 0xff, 0xe2, 0x1b, 0xdf, 0xfc, 0xcb, 0xbf, 0x3a, 0xfa, 0xbd, 0xdf, 0x0f, 0x8c, 0xfe, 0xfb, 0x7f, 0xfc, 0xf0, 0xdf, 0xfe, 0xf3, 0xbf, 0x86, 0xee, 0x59, 0xd6, 0xc7, 0xf9, 0xf5, 0xf2, 0x10, 0x5e, 0x3f, 0xcb, 0x2f, 0x7e, 0x6f, 0x3d, 0xc9, 0xc5, 0xff, 0x77, 0x2c, 0xeb, 0x1c, 0x5e, 0xcf, 0xc3, 0xf5, 0x02, 0x5c, 0xe4, 0x1c, 0x19, 0xb2, 0x82, 0x17, 0x09, 0x5d, 0x3a, 0x85, 0x73, 0x40, 0xe2, 0x57, 0xad, 0x97, 0xac, 0x97, 0x9e, 0x7b, 0xe9, 0xb9, 0x27, 0x5b, 0x33, 0x7c, 0x3d, 0xff, 0xf1, 0x1f, 0xbe, 0x62, 0xad, 0x5e, 0x29, 0x2f, 0x94, 0x4b, 0xa9, 0xb7, 0x52, 0x43, 0xb3, 0x4b, 0x73, 0x65, 0xbb, 0x94, 0x1a, 0x82, 0xdb, 0xa1, 0x37, 0x2e, 0xdb, 0x58, 0x4a, 0x93, 0xe7, 0x73, 0xd0, 0xbb, 0xa4, 0x7a, 0x05, 0xec, 0xad, 0xac, 0x2e, 0xcf, 0x2f, 0x5e, 0xb6, 0x4b, 0x53, 0xd8, 0x59, 0xbc, 0xbe, 0xf0, 0x46, 0x79, 0x19, 0x40, 0x93, 0xd8, 0xfb, 0x54, 0xf9, 0x33, 0x37, 0x97, 0x96, 0xe7, 0x4a, 0x45, 0xec, 0xcc, 0x5c, 0x9b, 0xe7, 0x58, 0x9c, 0xc4, 0xec, 0xd2, 0xc2, 0x42, 0x79, 0x71, 0xb5, 0x34, 0xc9, 0xb1, 0x56, 0xe6, 0x2f, 0x2f, 0x72, 0x82, 0x7c, 0xe2, 0x4a, 0xf9, 0x6a, 0x79, 0x76, 0xd5, 0x96, 0xb0, 0xd9, 0xeb, 0xcb, 0x2b, 0x4b, 0x40, 0x51, 0xac, 0x75, 0x65, 0x66, 0x6e, 0xe9, 0xa6, 0x5d, 0xea, 0xb8, 0xbb, 0x0e, 0xa7, 0x79, 0x75, 0x75, 0xed, 0xd2, 0x12, 0xd0, 0xa9, 0x55, 0x1a, 0x6d, 0x3e, 0xb2, 0x30, 0xb3, 0x3a, 0x7b, 0x65, 0x6d, 0xae, 0x7c, 0x75, 0x7e, 0x61, 0x7e, 0xb5, 0xbc, 0xbc, 0xa2, 0xa6, 0xde, 0xce, 0xa5, 0x52, 0x43, 0x97, 0x67, 0x16, 0xca, 0xd7, 0x66, 0xe6, 0xa4, 0x50, 0xab, 0x4b, 0xd7, 0x67, 0xaf, 0xc0, 0x3d, 0xef, 0x00, 0xa9, 0x6b, 0x57, 0x66, 0x4a, 0x93, 0xaf, 0x4f, 0x20, 0x95, 0xdb, 0x02, 0xe3, 0x76, 0x2a, 0x35, 0x7b, 0xa5, 0x3c, 0xfb, 0xa9, 0xb5, 0xc5, 0xf2, 0xcd, 0xb5, 0x1b, 0x40, 0x6d, 0x7e, 0x69, 0x91, 0x13, 0x4c, 0x5d, 0x9e, 0xbf, 0xb4, 0x76, 0xb5, 0xbc, 0x78, 0x79, 0xf5, 0x4a, 0xa9, 0x30, 0x61, 0x8f, 0x8d, 0xd9, 0xf5, 0xa6, 0xdd, 0x76, 0xaa, 0xad, 0xe6, 0x46, 0x3b, 0xb5, 0xb2, 0x74, 0x69, 0xf5, 0xe6, 0xcc, 0x72, 0x79, 0x6d, 0xb9, 0xbc, 0x38, 0x57, 0x46, 0xe5, 0x08, 0xf6, 0x52, 0x37, 0x56, 0x3e, 0xb3, 0x38, 0x2b, 0xf0, 0x67, 0x97, 0x57, 0xd7, 0x16, 0x96, 0x16, 0xe7, 0x57, 0x97, 0x96, 0x25, 0x10, 0x29, 0xae, 0xcc, 0xce, 0x5c, 0x2d, 0x97, 0x8a, 0xa9, 0xeb, 0xf3, 0xf2, 0x76, 0x2a, 0x75, 0x63, 0xe9, 0xea, 0x75, 0x30, 0xc8, 0x64, 0x21, 0x95, 0x1a, 0x8b, 0x2f, 0xa9, 0xda, 0x6e, 0xb3, 0xda, 0xa9, 0xb7, 0x9a, 0xf6, 0xea, 0xfc, 0x6c, 0x26, 0x9b, 0x1a, 0xaa, 0x36, 0xda, 0xd8, 0x34, 0x5a, 0xd5, 0x4a, 0xc3, 0x6e, 0x54, 0xd6, 0x9d, 0x46, 0x29, 0xbd, 0xba, 0x55, 0x6f, 0xdb, 0xf0, 0xd7, 0xde, 0x6f, 0x77, 0x9c, 0x6d, 0x1b, 0x98, 0xad, 0xd5, 0x37, 0x77, 0xdd, 0x0a, 0xc7, 0xab, 0x56, 0xdc, 0x8e, 0x5b, 0xdf, 0xd8, 0x74, 0xd2, 0x0a, 0xab, 0x5d, 0x7f, 0xd3, 0x29, 0xed, 0xb8, 0xf5, 0x66, 0x27, 0xc3, 0x09, 0xe4, 0x26, 0x72, 0x63, 0x17, 0x80, 0xa6, 0x3e, 0x94, 0x29, 0x4c, 0x4d, 0x8c, 0xe1, 0xc4, 0xec, 0xf8, 0x78, 0x21, 0x97, 0x99, 0x2c, 0x5e, 0x80, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xcd, 0x8d, 0x14, 0x97, 0x12, 0x4d, 0x56, 0x5e, 0xe6, 0x1e, 0x05, 0x1a, 0x5c, 0x2d, 0x7f, 0xba, 0xf4, 0xd9, 0xcf, 0x82, 0x86, 0x5f, 0xbb, 0xe5, 0xb8, 0x6d, 0x5c, 0x78, 0x72, 0x72, 0x02, 0xba, 0x95, 0x0e, 0xac, 0xbe, 0xbe, 0xdb, 0x71, 0xec, 0x5b, 0x4e, 0xb5, 0x68, 0x6f, 0xee, 0xec, 0xae, 0xdd, 0x70, 0xdc, 0x8e, 0xb3, 0x77, 0x31, 0x0c, 0x2c, 0x70, 0xe0, 0xaa, 0xb3, 0x37, 0xdb, 0x6a, 0xb9, 0x1b, 0x11, 0xf0, 0x14, 0x07, 0xcf, 0xb6, 0x1a, 0x2d, 0x17, 0x61, 0xbb, 0xcd, 0x7a, 0xad, 0xe5, 0x6e, 0xdb, 0xdb, 0x95, 0x8e, 0x80, 0x2c, 0xb4, 0x36, 0x9c, 0xc6, 0x8d, 0xba, 0xd3, 0xbd, 0xe6, 0xb6, 0x7e, 0xd9, 0xe1, 0x3a, 0x5b, 0xa8, 0x00, 0x3e, 0x5f, 0xe8, 0x56, 0xc5, 0xdd, 0xaf, 0x37, 0x37, 0x05, 0x9d, 0xaa, 0xa2, 0xa1, 0x8d, 0x16, 0xec, 0x8e, 0xb6, 0xf0, 0xad, 0x56, 0x7d, 0x03, 0x28, 0xd7, 0x9b, 0x19, 0xbc, 0xcb, 0x2a, 0x4f, 0xe2, 0x88, 0x76, 0x29, 0xc8, 0xc8, 0x90, 0x42, 0x04, 0x00, 0x12, 0xca, 0xe8, 0x52, 0x64, 0xf9, 0x8c, 0xcd, 0xc6, 0xda, 0xb5, 0x56, 0xbb, 0xce, 0xcd, 0x51, 0x4a, 0x66, 0xd6, 0x1e, 0xe1, 0x3c, 0x66, 0x7c, 0x3d, 0xe5, 0xec, 0xc9, 0xfc, 0x04, 0xa7, 0x73, 0x3b, 0x35, 0xf4, 0xb9, 0xcf, 0x81, 0xff, 0x5e, 0x9b, 0xff, 0x74, 0xf9, 0xaa, 0x51, 0xd9, 0xe3, 0xe3, 0x3b, 0xae, 0x53, 0xad, 0xf3, 0x91, 0xad, 0xfa, 0xe6, 0xd6, 0x8e, 0x5d, 0x6b, 0xb4, 0x2a, 0x9d, 0x44, 0x59, 0x95, 0x22, 0xdb, 0x95, 0xed, 0x9d, 0x86, 0xe3, 0x16, 0xe6, 0xec, 0x76, 0x6b, 0xd7, 0xad, 0x3a, 0x3a, 0x8c, 0x53, 0xb1, 0x3b, 0xee, 0xe6, 0xda, 0x9e, 0x79, 0x78, 0xdf, 0x3c, 0xdc, 0x35, 0x0f, 0x6f, 0x45, 0x87, 0xdb, 0x55, 0xd7, 0x34, 0x1b, 0x87, 0x61, 0x36, 0x17, 0xcd, 0x2e, 0x6f, 0xef, 0x36, 0x2a, 0x1d, 0x67, 0x03, 0x42, 0x72, 0x67, 0xb7, 0x63, 0xbb, 0x4e, 0xbb, 0xd5, 0xd8, 0x45, 0xd5, 0xe5, 0x51, 0x3e, 0x94, 0x0b, 0x86, 0x4a, 0xdc, 0x06, 0x85, 0xf3, 0x17, 0xf2, 0x13, 0xb9, 0xc9, 0xa9, 0x29, 0xae, 0x3a, 0x81, 0x7e, 0xa5, 0xe2, 0x6e, 0x34, 0x9d, 0x76, 0xdb, 0x6e, 0xd5, 0x80, 0x6e, 0xa5, 0xd9, 0xa8, 0x37, 0x9d, 0xbc, 0x00, 0xd9, 0x63, 0xaf, 0xe7, 0x27, 0xc0, 0x34, 0xed, 0x56, 0xad, 0x23, 0x46, 0xc6, 0x26, 0x2f, 0xf0, 0x91, 0x6d, 0x67, 0xa3, 0xbe, 0xbb, 0x0d, 0x63, 0x82, 0x9f, 0x2d, 0xa0, 0xb1, 0x02, 0xb8, 0x25, 0x44, 0x30, 0x11, 0xde, 0xa9, 0xef, 0x39, 0x8d, 0x36, 0x4f, 0x1a, 0xc1, 0x25, 0xc6, 0x0a, 0xe1, 0x15, 0xa6, 0xf8, 0x00, 0x52, 0x0c, 0x90, 0xbf, 0x56, 0xdf, 0x2b, 0x8d, 0x15, 0x7d, 0xea, 0x73, 0xf5, 0xf6, 0x4e, 0xa3, 0xb2, 0x6f, 0x77, 0x2b, 0xee, 0x8e, 0xa4, 0x35, 0xc1, 0x31, 0x9b, 0xad, 0xa6, 0x23, 0xfa, 0xe0, 0x20, 0xe3, 0x42, 0x00, 0x67, 0xaf, 0xe3, 0x3a, 0xdb, 0x8e, 0xd2, 0x07, 0xe2, 0x08, 0x85, 0xe0, 0x94, 0x0b, 0x53, 0xa8, 0x13, 0xb8, 0x99, 0x7a, 0x1d, 0xd5, 0x62, 0xcb, 0x05, 0x66, 0xb6, 0x5b, 0xbb, 0xcd, 0x0e, 0xd7, 0xca, 0x56, 0x65, 0xa3, 0xd5, 0x05, 0xc7, 0x6f, 0x7f, 0x21, 0xef, 0xf1, 0x84, 0xbd, 0xb9, 0x8a, 0xfb, 0x85, 0xd2, 0x44, 0xfe, 0xfc, 0xc5, 0xc0, 0xe8, 0x55, 0xf0, 0xb0, 0x4e, 0x69, 0x12, 0x87, 0x39, 0xa5, 0xb1, 0x67, 0x54, 0x24, 0x5f, 0xed, 0xe5, 0xcb, 0x6f, 0xd8, 0x9d, 0x96, 0x7d, 0x15, 0x94, 0x58, 0x71, 0xa5, 0xe8, 0x33, 0xed, 0xf6, 0x2e, 0xba, 0xf1, 0x6e, 0x1b, 0xff, 0x15, 0x53, 0xf6, 0x77, 0xc0, 0x27, 0xc0, 0xa5, 0x3b, 0xbb, 0x60, 0x7f, 0xbb, 0x83, 0xc9, 0xb0, 0xbd, 0xd5, 0xda, 0x6d, 0x6c, 0x80, 0x8a, 0x3a, 0xf6, 0xba, 0x63, 0x37, 0x1d, 0x67, 0xc3, 0xd9, 0xf0, 0x45, 0x5a, 0x6d, 0x09, 0x9a, 0x93, 0x19, 0xd1, 0xaf, 0x66, 0xdf, 0x72, 0x1d, 0xc0, 0x6e, 0x66, 0xaa, 0xd3, 0x20, 0xe6, 0xc4, 0xd4, 0xc4, 0xd4, 0xf9, 0xec, 0x27, 0xab, 0xe3, 0x93, 0x85, 0xfc, 0x2f, 0x16, 0x7e, 0x69, 0xa7, 0xd5, 0xcd, 0x64, 0xaa, 0xa3, 0x30, 0x7e, 0xfe, 0x7c, 0x76, 0x7c, 0x12, 0x9b, 0x5c, 0x21, 0x3f, 0x95, 0xbd, 0x78, 0x5b, 0xa8, 0xb9, 0xe8, 0xd1, 0xcb, 0xf0, 0x9e, 0x47, 0x8d, 0x67, 0xbc, 0x8c, 0xbf, 0x58, 0x35, 0xef, 0x66, 0x73, 0x7a, 0x77, 0x33, 0xd8, 0x5d, 0xcf, 0x22, 0x4d, 0x21, 0xa7, 0x18, 0x45, 0xf1, 0x51, 0xc6, 0x67, 0x2b, 0xfc, 0x8a, 0xbb, 0xb9, 0x6e, 0x12, 0x1d, 0x24, 0x9c, 0x28, 0x4e, 0x16, 0x27, 0x5e, 0xff, 0x64, 0x75, 0x44, 0x88, 0xce, 0x85, 0x1d, 0x41, 0x05, 0x54, 0x73, 0x13, 0xf9, 0xa9, 0xc9, 0x0b, 0x17, 0x2e, 0x64, 0xc7, 0x84, 0x22, 0x74, 0xe9, 0x91, 0x60, 0x8c, 0xec, 0x62, 0x2d, 0x29, 0xb9, 0xea, 0x6c, 0xea, 0x1d, 0x5d, 0xea, 0x45, 0x90, 0xd9, 0x69, 0x77, 0x6c, 0x47, 0x45, 0xba, 0x48, 0x4a, 0xf6, 0x66, 0xfd, 0x96, 0xd3, 0x14, 0x29, 0x01, 0x25, 0xdf, 0x69, 0xc1, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xd2, 0xe4, 0x1a, 0x70, 0x1a, 0xe0, 0xc3, 0xb5, 0xb6, 0xd3, 0x51, 0xda, 0x6a, 0xb4, 0x5b, 0xf6, 0x9b, 0x8e, 0xdb, 0xfa, 0x05, 0x8c, 0x4c, 0x8c, 0x79, 0xd7, 0x71, 0x54, 0xae, 0x28, 0xda, 0x97, 0x9c, 0x4e, 0x75, 0x2b, 0xc3, 0xc3, 0x04, 0x28, 0xe5, 0xf8, 0x0d, 0x4c, 0xcb, 0xf2, 0x4c, 0x0f, 0x23, 0x25, 0xd4, 0x50, 0xcb, 0xcd, 0xc0, 0xed, 0x08, 0x30, 0x35, 0x8a, 0xb0, 0x51, 0x1e, 0x4b, 0x10, 0x08, 0xa0, 0x8d, 0xf3, 0xd9, 0xec, 0x38, 0x8c, 0xf3, 0x04, 0x2f, 0x65, 0xf6, 0xfc, 0x60, 0x32, 0x5f, 0x80, 0x44, 0x2e, 0xad, 0x52, 0x98, 0xcb, 0x88, 0x8c, 0x9a, 0x03, 0x52, 0xf9, 0xbd, 0xfd, 0x1c, 0xcf, 0x2d, 0xd9, 0x3c, 0xc8, 0xef, 0x4b, 0x0e, 0x51, 0xde, 0xa9, 0x34, 0xab, 0x0e, 0x66, 0x0e, 0x4f, 0x7a, 0x99, 0x4c, 0xc0, 0x09, 0x9a, 0x52, 0x31, 0x5c, 0x4c, 0x2f, 0xdd, 0x21, 0x92, 0x27, 0x41, 0xf6, 0x2d, 0x64, 0x5a, 0x72, 0x7b, 0x51, 0x72, 0x34, 0x96, 0x41, 0xfe, 0xc7, 0x3c, 0x49, 0xb2, 0xd9, 0x31, 0x25, 0x42, 0x56, 0x98, 0x70, 0x68, 0x48, 0xe6, 0x90, 0x39, 0xfb, 0x72, 0x65, 0xb7, 0xdd, 0xae, 0x57, 0x9a, 0xbe, 0xaf, 0xe0, 0x88, 0x74, 0x14, 0xd4, 0x91, 0xca, 0xc9, 0x95, 0x86, 0xe3, 0xd9, 0xd9, 0xd9, 0xdb, 0x29, 0x64, 0xf8, 0xd0, 0x08, 0xae, 0x8d, 0x6b, 0x78, 0x42, 0x15, 0xc7, 0x3a, 0x95, 0x1d, 0x8f, 0xac, 0x5d, 0xab, 0x37, 0x3a, 0x8e, 0x6b, 0x57, 0x1a, 0x2d, 0xb0, 0xe1, 0x56, 0xcb, 0x7d, 0xd3, 0x56, 0xf9, 0x91, 0x1b, 0xe4, 0x0a, 0x8c, 0x14, 0x7d, 0x83, 0x88, 0xc5, 0x3c, 0x8b, 0xf0, 0x29, 0xeb, 0x25, 0x61, 0x35, 0x65, 0xb0, 0xcc, 0x18, 0x78, 0x68, 0x0e, 0xe7, 0x88, 0x07, 0xad, 0xf0, 0xc1, 0xf0, 0x24, 0xcc, 0x97, 0xe1, 0x49, 0x1b, 0x91, 0x49, 0x41, 0x4a, 0x62, 0xf5, 0x8d, 0x76, 0xa7, 0xc4, 0x95, 0x8c, 0x62, 0xe5, 0xf9, 0xb3, 0x0f, 0xe5, 0x9a, 0x6d, 0x35, 0xe1, 0xb9, 0x0b, 0x60, 0x65, 0x34, 0xb0, 0x50, 0xd7, 0xc1, 0x6c, 0x98, 0xf7, 0x71, 0xb9, 0x4e, 0x4a, 0x32, 0xa3, 0x6b, 0x34, 0xbb, 0xeb, 0x25, 0xae, 0x56, 0xa0, 0xcd, 0xb9, 0x17, 0xea, 0xd4, 0x27, 0x54, 0xbd, 0x09, 0x98, 0x74, 0x0c, 0x13, 0x36, 0xfc, 0x09, 0x21, 0x0a, 0xc0, 0xdc, 0xb2, 0xb0, 0x8b, 0x50, 0xb6, 0x17, 0x42, 0x79, 0xcd, 0x4d, 0x33, 0xeb, 0x23, 0xdd, 0xf5, 0xd1, 0xea, 0x48, 0xb7, 0x3a, 0xba, 0x31, 0xd2, 0xdd, 0xc8, 0x8e, 0x67, 0xa0, 0x0b, 0x1d, 0xb8, 0xf5, 0x4c, 0x77, 0xfe, 0xa9, 0x4d, 0x77, 0x3e, 0xd9, 0x74, 0x95, 0x88, 0xe9, 0x0a, 0x51, 0xab, 0xfc, 0xe4, 0xec, 0xcb, 0x27, 0x39, 0x91, 0x49, 0x85, 0x9f, 0x94, 0x13, 0x54, 0x7c, 0x27, 0x28, 0x18, 0x6d, 0xfc, 0xe3, 0xf4, 0x12, 0x39, 0xc1, 0xf1, 0x27, 0x14, 0x3e, 0x8c, 0x1b, 0x55, 0x46, 0xba, 0x95, 0xd1, 0xa0, 0x2f, 0x8d, 0x3a, 0x23, 0x5d, 0x07, 0x1d, 0xaa, 0x32, 0xaa, 0x7c, 0x6a, 0x14, 0x06, 0x3c, 0xb7, 0x92, 0x54, 0xd5, 0xde, 0x48, 0x53, 0x98, 0xe0, 0x09, 0xf7, 0x56, 0xb1, 0x7e, 0x64, 0x32, 0xc7, 0xbe, 0x9e, 0x7f, 0x3d, 0x71, 0x00, 0x25, 0xa7, 0xb6, 0x6a, 0xfe, 0xe2, 0x33, 0x8d, 0x06, 0xec, 0x6e, 0xbc, 0x54, 0xba, 0x05, 0x8f, 0x03, 0xee, 0xc6, 0x3c, 0xc3, 0x3a, 0xb5, 0x1a, 0xec, 0xc3, 0x45, 0xca, 0xf5, 0xfc, 0x7a, 0xd5, 0xad, 0x6b, 0xf9, 0x55, 0xf3, 0x65, 0x91, 0xab, 0x90, 0xc7, 0x31, 0xb5, 0x3b, 0x57, 0x1e, 0x2c, 0x62, 0x01, 0x41, 0xe8, 0x97, 0x01, 0xbf, 0xf5, 0xb1, 0xbc, 0x3d, 0xbd, 0xef, 0x0f, 0x5c, 0xf4, 0x20, 0x45, 0xcf, 0x15, 0x3c, 0x98, 0x4f, 0xd2, 0xf3, 0x02, 0x1f, 0xe6, 0xe1, 0x49, 0x75, 0x04, 0xed, 0x13, 0x78, 0xd4, 0xb4, 0x5c, 0xfe, 0xe4, 0xd4, 0x76, 0xc2, 0x80, 0x8f, 0xcf, 0x51, 0x78, 0xbb, 0x13, 0xa3, 0xf8, 0xac, 0x84, 0x78, 0xdf, 0xd9, 0xaa, 0x78, 0x8f, 0x9b, 0x9b, 0xb0, 0x9b, 0x0c, 0xa9, 0x43, 0x3d, 0x72, 0xc0, 0x7f, 0x90, 0xed, 0x8b, 0x78, 0x0e, 0x20, 0xc7, 0x47, 0xbc, 0x8d, 0xe7, 0x28, 0xb2, 0x97, 0xdf, 0x1f, 0xe1, 0xff, 0x66, 0x47, 0xf8, 0x46, 0x76, 0x2f, 0xe7, 0x01, 0xf6, 0x38, 0x60, 0x4f, 0x02, 0xf6, 0x03, 0x22, 0x20, 0x1d, 0x78, 0x56, 0x8d, 0xe2, 0xde, 0x53, 0xf1, 0xbf, 0x12, 0xdc, 0xa5, 0x72, 0xdd, 0x2e, 0x40, 0x27, 0xca, 0x5a, 0x7e, 0x6f, 0xb4, 0x24, 0x96, 0xe6, 0xfb, 0x69, 0x65, 0x08, 0xc4, 0x2c, 0xf1, 0xfd, 0x89, 0xda, 0xdb, 0xe6, 0x22, 0x37, 0x82, 0x0b, 0x4e, 0xa3, 0x54, 0x73, 0x2b, 0xd5, 0x8e, 0x60, 0x75, 0xfc, 0x82, 0xd2, 0x71, 0xbd, 0x26, 0x46, 0x60, 0xd7, 0x54, 0x2c, 0x16, 0xb3, 0x9c, 0x1b, 0xb7, 0xe4, 0x6d, 0x8b, 0xf9, 0x1c, 0x78, 0x78, 0xc3, 0x03, 0xdd, 0x9f, 0x88, 0xdb, 0x27, 0x3e, 0x71, 0xd3, 0x34, 0x91, 0x43, 0xd6, 0x43, 0x10, 0xa9, 0x07, 0x1c, 0xbc, 0x78, 0x9b, 0x6b, 0x37, 0xf0, 0x7a, 0x9a, 0xb5, 0xb9, 0xac, 0xfe, 0x6b, 0x09, 0xec, 0xdb, 0x26, 0x64, 0x08, 0x7b, 0x1b, 0xf7, 0x20, 0x45, 0xae, 0x25, 0x48, 0x59, 0x6e, 0xa7, 0x04, 0xef, 0xa5, 0x97, 0xdc, 0xca, 0x26, 0x7f, 0x15, 0x84, 0x8d, 0x89, 0xd8, 0x1a, 0xf0, 0xb7, 0xbc, 0x9c, 0x78, 0xab, 0x13, 0xa2, 0xf2, 0xc9, 0xf9, 0xfd, 0x12, 0x7f, 0x19, 0x1b, 0x93, 0x3d, 0xbe, 0xe7, 0x1f, 0x52, 0x2a, 0x2f, 0x71, 0xdf, 0xe0, 0xa0, 0x71, 0x8f, 0x4a, 0x57, 0x50, 0xd9, 0xca, 0x8a, 0x57, 0xb0, 0x21, 0x6f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x4f, 0x09, 0xc3, 0x0b, 0xed, 0x35, 0xc2, 0xcd, 0x17, 0xe2, 0xc6, 0x7b, 0x75, 0xf6, 0x70, 0xc4, 0x0b, 0xf6, 0x94, 0xdc, 0x55, 0x66, 0xc2, 0xe4, 0xb2, 0xa1, 0x37, 0xe5, 0xd4, 0xed, 0xd4, 0xff, 0x02, 0xff, 0x61, 0xff, 0x76, \ No newline at end of file diff --git a/config.lua b/config.lua index 2e7069210..ce88cb8b3 100644 --- a/config.lua +++ b/config.lua @@ -27,7 +27,6 @@ THEME= } CHECK_NEW_VERSION=true -NO_SOUND=false GIF_LENGTH=20 -- in seconds SOFTWARE_RENDERING=false VSYNC=true diff --git a/src/studio/config.c b/src/studio/config.c index f97fccc3c..49d752f59 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -191,7 +191,6 @@ static void readConfig(Config* config) readGlobalInteger(lua, "GIF_LENGTH", &config->data.gifLength); readGlobalInteger(lua, "GIF_SCALE", &config->data.gifScale); readGlobalBool(lua, "CHECK_NEW_VERSION", &config->data.checkNewVersion); - readGlobalBool(lua, "NO_SOUND", &config->data.noSound); readGlobalInteger(lua, "UI_SCALE", &config->data.uiScale); readGlobalInteger(lua, "VOLUME", &config->data.volume); readGlobalBool(lua, "VSYNC", &config->data.vsync); diff --git a/src/studio/studio.c b/src/studio/studio.c index 4078db21c..9e77c3db5 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1921,22 +1921,6 @@ static void recordFrame(u32* pixels) #endif -static void applyVolume() -{ - tic_mem* tic = impl.studio.tic; - - if(getConfig()->noSound) - ZEROMEM(tic->ram.registers); - else - { - s32 volume = getConfig()->volume; - void* addr = &tic->ram.stereo; - - for(s32 i = 0; i != TIC_SOUND_CHANNELS * TIC_STEREO_CHANNELS; ++i) - tic_tool_poke4(addr, i, tic_tool_peek4(addr, i) * volume / MAX_VOLUME); - } -} - static void renderStudio() { tic_mem* tic = impl.studio.tic; @@ -2031,8 +2015,6 @@ static void renderStudio() default: break; } - applyVolume(); - tic_core_tick_end(tic); switch(impl.mode) @@ -2240,6 +2222,15 @@ static void studioSound() { tic_mem* tic = impl.studio.tic; tic_core_synth_sound(tic); + + s32 volume = getConfig()->volume; + + if(volume != MAX_VOLUME) + { + s32 size = tic->samples.size / sizeof tic->samples.buffer[0]; + for(s16* it = tic->samples.buffer, *end = it + size; it != end; ++it) + *it = *it * volume / MAX_VOLUME; + } } static void studioLoad(const char* file) @@ -2294,7 +2285,7 @@ static StartArgs parseArgs(s32 argc, char **argv) NULL, }; - StartArgs args = {0}; + StartArgs args = {.volume = -1}; struct argparse_option options[] = { @@ -2397,6 +2388,9 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) if(args.scale) impl.config->data.uiScale = args.scale; + if(args.volume >= 0) + impl.config->data.volume = args.volume & 0x0f; + #if defined(CRT_SHADER_SUPPORT) impl.config->data.crt |= args.crt; #endif @@ -2404,7 +2398,6 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.goFullscreen |= args.fullscreen; impl.config->data.soft |= args.soft; impl.config->data.vsync |= args.vsync; - impl.config->data.noSound |= args.nosound; impl.config->data.cli |= args.cli; impl.studio.tick = studioTick; diff --git a/src/studio/studio.h b/src/studio/studio.h index 13e4f63d5..294ed7412 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -71,7 +71,7 @@ #define CMD_PARAMS_LIST(macro) \ macro(skip, bool, BOOLEAN, "", "skip startup animation") \ - macro(nosound, bool, BOOLEAN, "", "disable sound output") \ + macro(volume, s32, INTEGER, "=", "global volume value [0-15]") \ macro(cli, bool, BOOLEAN, "", "console only output") \ macro(fullscreen, bool, BOOLEAN, "", "enable fullscreen mode") \ macro(vsync, bool, BOOLEAN, "", "enable VSYNC") \ diff --git a/src/studio/system.h b/src/studio/system.h index e04c80c49..3dbd1800b 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -104,7 +104,6 @@ typedef struct s32 gifLength; bool checkNewVersion; - bool noSound; bool cli; bool soft; From 9322d57b0cf6684cdad2a4c5ca94fad5627723cc Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 27 Dec 2021 10:20:57 +0300 Subject: [PATCH 204/379] Added (B)/Escape/Return button handling to the Game Menu and Surf #1748 #1740 --- src/studio/screens/menu.c | 46 +++++++++++++++++++-- src/studio/screens/menu.h | 3 +- src/studio/screens/surf.c | 3 +- src/studio/studio.c | 86 +++++++++++++++++++++++---------------- 4 files changed, 96 insertions(+), 42 deletions(-) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index 8f49d0cf0..a33b85829 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -53,7 +53,8 @@ typedef struct macro(start) \ macro(up) \ macro(down) \ - macro(close) + macro(close) \ + macro(back) #define ANIM_MOVIE(name) Movie name; #define ANIM_FREE(name) FREE(menu->anim.name.items); @@ -67,8 +68,10 @@ struct Menu MenuItem* items; s32 count; s32 pos; + s32 backPos; void* data; + void(*back)(void*); struct { @@ -163,6 +166,14 @@ static void closeDone(Menu *menu) menu->items[menu->pos].handler(menu->data); } +static void backDone(Menu *menu) +{ + resetMovie(menu, &menu->anim.idle); + s32 pos = menu->backPos; + menu->back(menu->data); + menu->pos = pos; +} + static void printShadow(tic_mem* tic, const char* text, s32 x, s32 y, tic_color color) { tic_api_print(tic, text, x, y + 1, tic_color_black, true, 1, false); @@ -244,7 +255,7 @@ static void drawMenu(Menu* menu, s32 x, s32 y) } } - if(tic_api_btnp(menu->tic, A, -1, -1)) + if(tic_api_btnp(menu->tic, A, -1, -1) || tic_api_keyp(tic, tic_key_return, -1, -1)) { if(option) { @@ -256,7 +267,13 @@ static void drawMenu(Menu* menu, s32 x, s32 y) playSystemSfx(2); resetMovie(menu, &menu->anim.close); } - } + } + + if(tic_api_btnp(menu->tic, B, -1, -1) && menu->back) + { + playSystemSfx(2); + resetMovie(menu, &menu->anim.back); + } } s32 i = 0; @@ -350,6 +367,14 @@ Menu* studio_menu_create(struct tic_mem* tic) {10, 0, 10, &menu->anim.cursor, linear}, {0, TIC80_WIDTH, 10, &menu->anim.offset, linear}, }), + + .back = MOVIE_DEF(10, backDone, + { + {0, -10, 10, &menu->anim.top, linear}, + {0, 10, 10, &menu->anim.bottom, linear}, + {10, 0, 10, &menu->anim.cursor, linear}, + {0, TIC80_WIDTH, 10, &menu->anim.offset, linear}, + }), }, }; @@ -386,7 +411,7 @@ void studio_menu_tick(Menu* menu) menu->ticks++; } -void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, void* data) +void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 backPos, void(*back)(void*), void* data) { const s32 size = sizeof menu->items[0] * rows; @@ -398,6 +423,8 @@ void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, void .data = data, .count = rows, .pos = pos, + .backPos = backPos, + .back = back, }; memcpy(menu->items, items, size); @@ -408,6 +435,17 @@ void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, void resetMovie(menu, &menu->anim.start); } +bool studio_menu_back(Menu* menu) +{ + if(menu->back) + { + playSystemSfx(2); + resetMovie(menu, &menu->anim.back); + } + + return menu->back != NULL; +} + void studio_menu_free(Menu* menu) { ANIM_STATES(ANIM_FREE); diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index cfad6875f..a63ebe340 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -47,7 +47,8 @@ typedef struct MenuOption* option; } MenuItem; -void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, void* data); +void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 backPos, void(*back)(void*), void* data); +bool studio_menu_back(Menu* menu); void studio_menu_free(Menu* menu); void studio_menu_anim(struct tic_mem* tic, s32 ticks); diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index 380fcc88f..d8a5fbd48 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -808,7 +808,8 @@ static void processGamepad(Surf* surf) surf->menu.anim_target = 5; } - if(tic_api_btnp(tic, A, -1, -1)) + if(tic_api_btnp(tic, A, -1, -1) + || tic_api_keyp(tic, tic_key_return, -1, -1)) { SurfItem* item = getMenuItem(surf); item->dir diff --git a/src/studio/studio.c b/src/studio/studio.c index 9e77c3db5..f0d7a10c9 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1141,28 +1141,6 @@ static void hideGameMenu() impl.mode = TIC_RUN_MODE; } -static void showOptionMenu(); - -static const MenuItem GamepadMenu[] = -{ - {"UP <...>", NULL}, - {"DOWN <...>", NULL}, - {"LEFT <...>", NULL}, - {"RIGHT <...>", NULL}, - {"A <...>", NULL}, - {"B <...>", NULL}, - {"X <...>", NULL}, - {"Y <...>", NULL}, - - {"", NULL}, - {"BACK", showOptionMenu}, -}; - -static void setupGamepadMenu() -{ - studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), 0, NULL); -} - static s32 optionFullscreenGet() { return tic_sys_fullscreen_get() ? 1 : 0; @@ -1284,6 +1262,8 @@ static MenuOption KeyboardOption = optionKeyboardSet, }; +static void showGamepadMenu(); + static const MenuItem OptionMenu[] = { #if defined(CRT_SHADER_SUPPORT) @@ -1293,16 +1273,12 @@ static const MenuItem OptionMenu[] = {"FULLSCREEN ", NULL, &FullscreenOption}, {"VOLUME ", NULL, &VolumeOption}, {"KEYBOARD ", NULL, &KeyboardOption}, - {"SETUP GAMEPAD", setupGamepadMenu}, + {"SETUP GAMEPAD", showGamepadMenu}, {"", NULL}, {"BACK", showGameMenu}, }; -static void showOptionMenu() -{ - enum{Count = COUNT_OF(OptionMenu)}; - studio_menu_init(impl.menu, OptionMenu, Count, Count - 5, NULL); -} +static void showOptionsMenu(); static const MenuItem GameMenu[] = { @@ -1311,20 +1287,50 @@ static const MenuItem GameMenu[] = #endif {"RESET GAME", resetGame}, {"RESUME GAME", hideGameMenu}, - {"OPTIONS", showOptionMenu}, + {"OPTIONS", showOptionsMenu}, {"", NULL}, {"QUIT TIC-80", exitStudio}, }; void showGameMenu() { - tic_core_pause(impl.studio.tic); - tic_api_reset(impl.studio.tic); + if(impl.mode != TIC_MENU_MODE) + { + tic_core_pause(impl.studio.tic); + tic_api_reset(impl.studio.tic); + impl.mode = TIC_MENU_MODE; + } enum{Count = COUNT_OF(GameMenu)}; - studio_menu_init(impl.menu, GameMenu, Count, Count - 4, NULL); + studio_menu_init(impl.menu, GameMenu, Count, Count - 4, 0, NULL, NULL); +} + +static void showOptionsMenu() +{ + enum{Count = COUNT_OF(OptionMenu)}; + studio_menu_init(impl.menu, OptionMenu, + Count, Count - 5, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); +} + +static void showGamepadMenu() +{ + static const MenuItem GamepadMenu[] = + { + {"UP <...>", NULL}, + {"DOWN <...>", NULL}, + {"LEFT <...>", NULL}, + {"RIGHT <...>", NULL}, + {"A <...>", NULL}, + {"B <...>", NULL}, + {"X <...>", NULL}, + {"Y <...>", NULL}, + + {"", NULL}, + {"BACK", showOptionsMenu}, + }; - impl.mode = TIC_MENU_MODE; + studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), + 0, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); } static inline bool pointInRect(const tic_point* pt, const tic_rect* rect) @@ -1429,8 +1435,8 @@ void confirmDialog(const char** text, s32 rows, ConfirmCallback callback, void* memcpy(items + rows, Answers, sizeof Answers); - studio_menu_init(impl.menu, items, count, count - 2, - MOVE((ConfirmData){callback, data})); + studio_menu_init(impl.menu, items, count, count - 2, 0, + NULL, MOVE((ConfirmData){callback, data})); } } @@ -1750,7 +1756,12 @@ static void processShortcuts() { if(keyWasPressedOnce(tic_key_escape)) { - impl.mode == TIC_MENU_MODE ? hideGameMenu() : showGameMenu(); + if(impl.mode == TIC_MENU_MODE) + { + if(!studio_menu_back(impl.menu)) + hideGameMenu(); + } + else showGameMenu(); } else if(keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); else if(keyWasPressedOnce(tic_key_return)) @@ -1828,6 +1839,9 @@ static void processShortcuts() } #endif + if(impl.mode == TIC_MENU_MODE && studio_menu_back(impl.menu)) + return; + setStudioMode(impl.mode == TIC_CONSOLE_MODE ? impl.prevMode : TIC_CONSOLE_MODE); } } From 73cdf51cda8549c62302721675e0458f1578e787 Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 27 Dec 2021 15:54:09 +0300 Subject: [PATCH 205/379] Added VSYNC menu switcher, save/restore menu settings #1748 --- build/assets/config.tic.dat | 2 +- config.lua | 7 ++--- src/studio/config.c | 58 +++++++++++++++++++++++++++++-------- src/studio/screens/menu.c | 14 +++++++-- src/studio/screens/menu.h | 1 + src/studio/studio.c | 33 ++++++++++----------- src/studio/system.h | 16 ++++++---- src/system/sdl/main.c | 13 +++++---- 8 files changed, 96 insertions(+), 48 deletions(-) diff --git a/build/assets/config.tic.dat b/build/assets/config.tic.dat index 3dd190918..8c61130f2 100644 --- a/build/assets/config.tic.dat +++ b/build/assets/config.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x92, 0x58, 0x16, 0x49, 0x15, 0x49, 0x49, 0x76, 0xb9, 0x5c, 0x34, 0x08, 0x0e, 0x48, 0xc4, 0x20, 0xc0, 0x1a, 0x80, 0x02, 0xb9, 0x1b, 0x55, 0xe5, 0xa8, 0x43, 0x0e, 0xb9, 0x7a, 0x4f, 0x9b, 0xe4, 0x12, 0xb3, 0x74, 0xc8, 0xe3, 0x0f, 0xb4, 0xa4, 0xc4, 0x89, 0x9d, 0x0e, 0xd6, 0x1b, 0xdb, 0x79, 0x9a, 0xa2, 0xed, 0xc4, 0xce, 0x0b, 0x42, 0xb8, 0xb1, 0xf3, 0xde, 0x2a, 0xe5, 0xfb, 0xfa, 0x31, 0xd3, 0x33, 0xd3, 0x33, 0x94, 0xd6, 0xb2, 0xbd, 0x61, 0xd8, 0xc3, 0x56, 0x4f, 0xf7, 0xd7, 0xdf, 0xd7, 0xdf, 0x7b, 0x7a, 0x7a, 0x50, 0x1a, 0xb6, 0x2c, 0xeb, 0xb9, 0x77, 0x3e, 0x61, 0xf5, 0x18, 0x94, 0x3b, 0x77, 0xee, 0xdc, 0x3d, 0x38, 0x38, 0xb8, 0x8b, 0x2d, 0x74, 0xef, 0x32, 0xea, 0x55, 0xc6, 0xfa, 0x83, 0x3b, 0x77, 0xd8, 0xe0, 0xe0, 0x80, 0x0e, 0xee, 0xfc, 0x36, 0x1d, 0xb0, 0xbb, 0x94, 0xd1, 0xbb, 0x94, 0xaa, 0xca, 0xf1, 0x87, 0x87, 0x87, 0x73, 0xe9, 0x74, 0x3a, 0x87, 0x2d, 0x74, 0x73, 0x80, 0xa7, 0x2a, 0xe2, 0x0f, 0x0f, 0xb3, 0x41, 0x3a, 0x4d, 0x07, 0xc3, 0xaf, 0x02, 0x7e, 0x8e, 0x0e, 0xa8, 0xa8, 0x7d, 0x9a, 0xb3, 0x18, 0xc7, 0x07, 0xdc, 0xe9, 0x62, 0xb1, 0x38, 0x8d, 0x2d, 0x74, 0xa7, 0x09, 0x54, 0xc0, 0x9d, 0x96, 0xf8, 0xe9, 0x34, 0x1b, 0x14, 0x8b, 0x74, 0x90, 0x2e, 0x00, 0xfe, 0x34, 0x1d, 0x10, 0xa8, 0x74, 0x1a, 0xf0, 0xa7, 0x25, 0x7e, 0xb7, 0xdb, 0x6d, 0xd4, 0x6a, 0xb5, 0x06, 0xb6, 0xd0, 0xe5, 0x95, 0x58, 0x04, 0x5b, 0xc4, 0xef, 0x76, 0xd9, 0xa0, 0x56, 0xa3, 0x83, 0xee, 0x26, 0xe0, 0x37, 0x80, 0x66, 0x83, 0x52, 0x0b, 0x2a, 0xb6, 0x5f, 0x3b, 0x3c, 0x7c, 0xf1, 0x10, 0xcb, 0xa3, 0x87, 0x87, 0x87, 0x83, 0xc1, 0xe1, 0xa3, 0xc1, 0xe0, 0x21, 0x76, 0xe1, 0x9f, 0x47, 0xdf, 0x1e, 0x0c, 0x5e, 0x52, 0x70, 0x3e, 0x0e, 0x70, 0x3e, 0x2f, 0x02, 0x7f, 0x28, 0xf1, 0x65, 0x0b, 0xfd, 0x00, 0xfc, 0x91, 0xa4, 0xff, 0x48, 0xe2, 0x3f, 0xf2, 0xf1, 0x3f, 0x5f, 0xab, 0xfd, 0x4c, 0xed, 0xd6, 0x66, 0xad, 0xb6, 0x79, 0x4b, 0xd4, 0x6e, 0x97, 0xb7, 0x30, 0x72, 0x6b, 0xa7, 0xdb, 0x7d, 0xc1, 0x4e, 0xa7, 0x3f, 0x96, 0x1e, 0x7e, 0x35, 0x9d, 0x7e, 0xf5, 0x95, 0xb4, 0xde, 0xc2, 0xdd, 0x2b, 0x3f, 0x37, 0x3c, 0xfc, 0xdc, 0x3b, 0x07, 0x07, 0xa9, 0x83, 0x2f, 0xbd, 0x7d, 0xc0, 0xeb, 0xdb, 0x5f, 0x3a, 0x50, 0xf7, 0x70, 0xf7, 0xf6, 0xaf, 0x7f, 0xf1, 0x8b, 0x43, 0x13, 0xc5, 0xe2, 0xb9, 0x62, 0xe1, 0xb5, 0x22, 0xaf, 0xaf, 0xa5, 0x41, 0xcb, 0xd8, 0x16, 0x8a, 0x05, 0xf8, 0x17, 0x69, 0x73, 0x7b, 0xa3, 0xed, 0xf9, 0xf5, 0x55, 0x7e, 0xff, 0x6b, 0xe0, 0x07, 0xcc, 0xa2, 0xa8, 0xdb, 0x1e, 0xbb, 0x6b, 0x31, 0xb0, 0x7d, 0xff, 0x2e, 0xd8, 0xff, 0x40, 0x56, 0xf4, 0x07, 0x8b, 0xf6, 0x07, 0x8c, 0x0d, 0x06, 0xdc, 0xde, 0x68, 0xfb, 0xf4, 0x7d, 0x68, 0xf1, 0x4a, 0xa7, 0x7f, 0x1e, 0xfc, 0xc0, 0xc3, 0xcf, 0x51, 0x0a, 0xb6, 0xe7, 0x35, 0x97, 0xa6, 0x8c, 0xfb, 0xc1, 0xb0, 0x8f, 0xcf, 0xed, 0x8d, 0xb6, 0x7f, 0xf0, 0xe0, 0xc1, 0x74, 0x71, 0x7a, 0x1a, 0xef, 0x91, 0x86, 0x87, 0x3f, 0x4d, 0x29, 0xd8, 0x9e, 0x3e, 0x80, 0x3a, 0x5d, 0xa4, 0x8c, 0xfb, 0x41, 0xda, 0xc7, 0xe7, 0xb6, 0x46, 0xdb, 0xd7, 0xb0, 0xfd, 0x32, 0xbf, 0xff, 0x15, 0xf0, 0x03, 0x0f, 0xbf, 0x61, 0x31, 0xb0, 0x7d, 0xbf, 0x01, 0xf6, 0xaf, 0xc9, 0x8a, 0xfe, 0xa0, 0xf0, 0x21, 0x0c, 0xac, 0x38, 0x1f, 0xc0, 0x71, 0x1d, 0x1e, 0xf6, 0x81, 0x20, 0x3c, 0xea, 0x03, 0x01, 0xb8, 0xc1, 0x07, 0x14, 0x3c, 0xce, 0x07, 0x70, 0x1c, 0xe1, 0x71, 0x3e, 0x80, 0xe3, 0x08, 0x8f, 0xf3, 0x01, 0x1c, 0x47, 0x78, 0x9c, 0x0f, 0xe0, 0xb8, 0x31, 0x7e, 0x79, 0x49, 0xe7, 0x72, 0xec, 0xbe, 0x29, 0x7e, 0x01, 0x0e, 0xf6, 0x84, 0x7a, 0x1f, 0xaa, 0xf5, 0x0c, 0xca, 0xe6, 0x75, 0xe7, 0x05, 0xeb, 0xc7, 0x54, 0xd0, 0xb9, 0x22, 0x95, 0x11, 0x5e, 0x41, 0xfd, 0x45, 0x2c, 0x11, 0xf8, 0xb7, 0x5e, 0xf4, 0xe6, 0x14, 0xcf, 0x59, 0x16, 0xaf, 0x3f, 0x78, 0xfc, 0x98, 0xb7, 0x5f, 0x7f, 0xf1, 0xb0, 0xa8, 0x17, 0x05, 0xd7, 0xe7, 0x69, 0xc5, 0xfa, 0x88, 0x17, 0x3f, 0x7e, 0xb1, 0xbd, 0xcf, 0xa2, 0xf1, 0x6b, 0x61, 0xcc, 0xf6, 0x21, 0x76, 0xb9, 0x0f, 0x84, 0xe3, 0xf7, 0x59, 0xf0, 0x70, 0xfc, 0xf8, 0xb1, 0x75, 0x56, 0xce, 0xca, 0x59, 0xf9, 0x29, 0x15, 0x42, 0x44, 0x85, 0x6c, 0x4e, 0x09, 0xe3, 0x55, 0x2f, 0x94, 0x11, 0x00, 0x41, 0xa5, 0x98, 0x15, 0x70, 0x12, 0x0b, 0x25, 0x59, 0x84, 0xc3, 0xc5, 0x04, 0x2e, 0xb6, 0x41, 0x02, 0x40, 0x9b, 0x59, 0x62, 0x9c, 0xc9, 0x7e, 0x00, 0x5f, 0x8c, 0x71, 0xb8, 0x9c, 0x1b, 0x5c, 0x9f, 0x09, 0xfa, 0x6a, 0x0d, 0x46, 0x22, 0xeb, 0x23, 0xff, 0x02, 0xdf, 0x12, 0x55, 0x81, 0x20, 0x89, 0xc7, 0x55, 0x9f, 0x3d, 0x8d, 0x3e, 0x5e, 0xc4, 0x20, 0x1f, 0x55, 0x6b, 0x33, 0x7e, 0x1f, 0x14, 0xcf, 0xd7, 0x99, 0x49, 0x7f, 0x42, 0x26, 0x2a, 0x74, 0xc7, 0xf5, 0x17, 0xe6, 0x1f, 0xe6, 0x13, 0xca, 0xab, 0x11, 0x9f, 0x11, 0x50, 0x3d, 0xf3, 0x2a, 0xf6, 0x03, 0xe6, 0xa3, 0x04, 0x59, 0x22, 0xd0, 0x12, 0x6c, 0x29, 0x0d, 0xc2, 0x3d, 0xbe, 0x95, 0x7d, 0x2c, 0x6a, 0xb0, 0x2f, 0x13, 0x95, 0xdb, 0x88, 0x19, 0x9c, 0x84, 0xfa, 0x35, 0x62, 0x5f, 0x29, 0x23, 0x95, 0xf6, 0x0b, 0xef, 0x0a, 0x24, 0x0c, 0xfd, 0xc7, 0x52, 0x36, 0x36, 0xf9, 0x0f, 0xa7, 0x6d, 0xc2, 0x0f, 0xf9, 0x07, 0x8d, 0xfa, 0x87, 0xa9, 0xd5, 0x26, 0x80, 0x92, 0x50, 0xbb, 0xf8, 0x87, 0x8e, 0xcc, 0xa2, 0xfe, 0xa5, 0xec, 0x2b, 0xdb, 0x88, 0xf4, 0x5c, 0x2f, 0x06, 0xde, 0x74, 0x1e, 0x19, 0x31, 0xe2, 0xe2, 0xe2, 0x52, 0x6f, 0x84, 0xc7, 0x90, 0x15, 0x94, 0x5f, 0xf9, 0x93, 0xb2, 0x0b, 0x8d, 0x6c, 0xab, 0x70, 0x5d, 0x2a, 0x7c, 0xdc, 0xe0, 0x3e, 0x1e, 0x3e, 0x8d, 0xc1, 0xd7, 0xfd, 0x57, 0xe9, 0x38, 0x42, 0x9f, 0x48, 0xf9, 0x88, 0xe4, 0x37, 0xc4, 0x3e, 0x93, 0x71, 0xc6, 0xa2, 0x60, 0x4f, 0xef, 0xd2, 0xc6, 0xd4, 0xa0, 0x5f, 0xc5, 0x97, 0xaa, 0x11, 0xdd, 0xc9, 0xfc, 0x22, 0x78, 0xb1, 0x22, 0xfe, 0x69, 0xf9, 0x1e, 0x12, 0xf5, 0x3f, 0xe2, 0xd3, 0xe0, 0x6d, 0x44, 0x3f, 0x58, 0x65, 0xfe, 0xa2, 0x42, 0x87, 0xb1, 0xf1, 0xc1, 0x82, 0xf9, 0x8b, 0x8a, 0x1c, 0xa2, 0x06, 0x88, 0x77, 0x4f, 0xb5, 0xf1, 0x18, 0xb5, 0xe9, 0xee, 0xa7, 0x6a, 0x9c, 0xeb, 0xd0, 0x38, 0xd7, 0xd2, 0xfc, 0x4a, 0xcf, 0x59, 0x7a, 0x7e, 0x4b, 0xf4, 0x4d, 0x6a, 0xc9, 0xdc, 0x2b, 0x43, 0x8f, 0xa9, 0x7c, 0x6b, 0x30, 0x2d, 0x8b, 0x9a, 0x18, 0x32, 0x25, 0x81, 0xac, 0x43, 0x98, 0x7e, 0xc9, 0xbe, 0x9e, 0x5f, 0xa1, 0x8b, 0xd9, 0xcb, 0xc2, 0x36, 0x90, 0x5f, 0x65, 0x6c, 0x63, 0x86, 0x22, 0xd0, 0x21, 0x9e, 0x0d, 0x89, 0xa7, 0x7b, 0x2e, 0x83, 0xe6, 0x1b, 0xc1, 0x18, 0x24, 0x8a, 0x79, 0x2e, 0x27, 0x2e, 0x4b, 0x74, 0x17, 0x66, 0xc4, 0x8f, 0x3b, 0xf5, 0x1c, 0x23, 0xbe, 0x2e, 0x08, 0x21, 0x44, 0x52, 0x09, 0xb6, 0x72, 0x5c, 0x77, 0x1e, 0x2a, 0x18, 0x07, 0x41, 0x18, 0x4f, 0x13, 0x67, 0xe5, 0xac, 0x9c, 0xf6, 0xc2, 0x8f, 0xc8, 0x06, 0x83, 0x41, 0x1f, 0xdf, 0xf4, 0xb1, 0xf0, 0xb6, 0xd7, 0x93, 0xed, 0x40, 0x82, 0x7b, 0x3a, 0xb8, 0xd7, 0x13, 0xd3, 0x07, 0xa2, 0xf5, 0x8b, 0x81, 0x4e, 0x08, 0x1c, 0xa1, 0x73, 0x66, 0x81, 0x9f, 0x6e, 0xe9, 0xf7, 0xd0, 0x90, 0x60, 0x37, 0xa8, 0x68, 0x20, 0x16, 0x2d, 0x03, 0xad, 0xf4, 0xc2, 0x40, 0xe5, 0x27, 0x48, 0x27, 0x06, 0x5f, 0xf9, 0x89, 0x11, 0xff, 0xcc, 0x02, 0x1f, 0xa1, 0xf8, 0x37, 0x54, 0xe6, 0x9b, 0xb5, 0x17, 0x53, 0x4d, 0xf8, 0x18, 0xe0, 0x30, 0xd6, 0x1f, 0x98, 0xf0, 0xf1, 0x5c, 0x69, 0x80, 0xb5, 0x17, 0x87, 0xdf, 0x1f, 0x88, 0xca, 0x8c, 0xf8, 0x88, 0xc7, 0xeb, 0x89, 0xeb, 0x47, 0xf1, 0x07, 0xa1, 0x6a, 0xc0, 0x1f, 0xe8, 0x35, 0x91, 0x7f, 0x33, 0xbe, 0x27, 0x7b, 0x5f, 0xaa, 0x50, 0xc7, 0xd7, 0x65, 0xc7, 0xfb, 0x93, 0xe3, 0x0f, 0x82, 0x0b, 0xe2, 0x46, 0x56, 0xc6, 0x62, 0x02, 0x94, 0x3d, 0x61, 0xd1, 0x83, 0x99, 0x85, 0xed, 0x6d, 0xe6, 0x45, 0xb3, 0x75, 0x94, 0x17, 0x29, 0x67, 0x2c, 0xbe, 0xb4, 0x71, 0x02, 0x3e, 0xeb, 0x27, 0xe1, 0xf7, 0xd8, 0x8f, 0x86, 0xaf, 0xd9, 0x29, 0x0e, 0x5f, 0xd9, 0xfa, 0x47, 0x59, 0xbf, 0x9f, 0x84, 0xdf, 0x4b, 0xc0, 0x0f, 0x97, 0x9e, 0xe0, 0x99, 0xd7, 0xfe, 0x13, 0xd4, 0x84, 0xb8, 0xf4, 0xe3, 0xf3, 0x29, 0x9c, 0xc3, 0x14, 0xff, 0x2c, 0x39, 0x0f, 0x24, 0xe1, 0xf7, 0x93, 0xf0, 0x7b, 0x27, 0xe2, 0xf7, 0x07, 0x49, 0xf8, 0x5e, 0xfe, 0xf8, 0x10, 0xeb, 0x07, 0xe2, 0xd7, 0x8c, 0xef, 0xc5, 0xff, 0x87, 0xe4, 0xbf, 0x9f, 0x84, 0xaf, 0xf2, 0x80, 0xee, 0xbb, 0x31, 0xcf, 0x4f, 0xdd, 0x77, 0x4e, 0x8c, 0xed, 0xa7, 0xc9, 0x03, 0x2c, 0xce, 0xaf, 0x82, 0xbc, 0x18, 0x7c, 0xaa, 0x1f, 0x8a, 0x1f, 0x2f, 0x5f, 0x47, 0xf0, 0x07, 0x5a, 0xbe, 0x36, 0xe3, 0xf7, 0x55, 0xfc, 0xf5, 0x8d, 0xf8, 0x32, 0xcf, 0xf7, 0x12, 0xd7, 0x4f, 0xc0, 0x8f, 0xe6, 0xfb, 0x38, 0xfc, 0x40, 0x1e, 0x08, 0xe3, 0xc7, 0xaf, 0xdf, 0x1f, 0x68, 0x39, 0xa0, 0x6f, 0xe2, 0x5f, 0xe5, 0x80, 0xde, 0x53, 0xd8, 0xb2, 0x27, 0x65, 0xf9, 0xd8, 0x57, 0x3e, 0x61, 0xe1, 0xd7, 0x91, 0x77, 0x5f, 0x86, 0xfa, 0x01, 0x54, 0xf6, 0x32, 0xd4, 0x0f, 0x44, 0x0b, 0x03, 0xc7, 0xc7, 0x30, 0x78, 0xac, 0x26, 0x3c, 0xb6, 0x8e, 0x01, 0xf0, 0x2e, 0x4c, 0x38, 0x66, 0x72, 0xd2, 0xf1, 0x63, 0xfc, 0x13, 0xb7, 0x38, 0x55, 0xab, 0x12, 0x7c, 0x56, 0xce, 0xca, 0x59, 0xf9, 0x3f, 0xbd, 0x89, 0xd7, 0xaa, 0x65, 0x45, 0xbf, 0x9f, 0x50, 0xcb, 0x4a, 0xfa, 0x52, 0x4f, 0xc5, 0xd1, 0x74, 0xa0, 0x0d, 0x9f, 0xbf, 0x12, 0x79, 0x0c, 0x87, 0x37, 0xd1, 0xe3, 0x57, 0xff, 0xdc, 0x95, 0xaa, 0x7e, 0xe8, 0x08, 0x92, 0xe3, 0x13, 0x71, 0x76, 0x47, 0x49, 0xf4, 0x7c, 0x99, 0x26, 0xc9, 0xa7, 0xce, 0x74, 0x89, 0x7e, 0x5c, 0x17, 0x39, 0x3e, 0xf6, 0x2a, 0x35, 0x1c, 0xbf, 0x13, 0x22, 0x8e, 0xfd, 0xf9, 0xb1, 0x1f, 0x31, 0x1f, 0xd1, 0x53, 0x16, 0x7f, 0x86, 0xab, 0x7f, 0xca, 0x88, 0xe3, 0x97, 0x3e, 0xc1, 0xdb, 0x2c, 0x25, 0xd1, 0xf3, 0x7b, 0x2b, 0xa2, 0xbf, 0x28, 0x5d, 0x26, 0x4f, 0x4f, 0x59, 0xf4, 0xf3, 0x85, 0x77, 0xbe, 0xab, 0x7c, 0x20, 0xfc, 0x7d, 0x8c, 0x79, 0xdf, 0xd7, 0xe4, 0x94, 0x08, 0x9c, 0x78, 0xdf, 0xdd, 0x08, 0x8d, 0xa7, 0xcf, 0xa8, 0x9a, 0x6b, 0x45, 0xf0, 0x99, 0xb6, 0x8e, 0xe9, 0xf3, 0x8b, 0x82, 0x9b, 0xf8, 0xd7, 0xd7, 0x37, 0x7c, 0xfe, 0x93, 0xf8, 0x24, 0xd0, 0x9a, 0xe1, 0xc2, 0x38, 0x94, 0xc5, 0xeb, 0xdc, 0xa4, 0xff, 0x30, 0x3c, 0x62, 0x5f, 0xcd, 0x36, 0x26, 0xff, 0xd3, 0x6d, 0x6f, 0xf2, 0x81, 0x00, 0x9e, 0xe9, 0xf3, 0x96, 0x26, 0xbf, 0x31, 0x7e, 0xa5, 0xdf, 0xf2, 0xb3, 0x6f, 0xc3, 0x1a, 0x4a, 0x7e, 0x5e, 0x99, 0x68, 0xc3, 0xf6, 0x17, 0x30, 0xbf, 0x35, 0xe3, 0xc7, 0xd9, 0x47, 0xa3, 0x6f, 0xc0, 0xd7, 0xed, 0x1f, 0xe7, 0x5f, 0x01, 0xb8, 0x41, 0x7e, 0x3e, 0x4e, 0x89, 0x66, 0x47, 0xdd, 0xfd, 0x82, 0xb2, 0x85, 0xe5, 0xa3, 0xea, 0xa3, 0x45, 0xac, 0xff, 0x13, 0xcf, 0xc8, 0xcc, 0xe0, 0xdf, 0x9c, 0xa6, 0xfc, 0xa6, 0xc0, 0xdb, 0xb0, 0xfe, 0xc2, 0x35, 0x4c, 0x9f, 0x4a, 0xde, 0x78, 0x9e, 0x24, 0x91, 0xfc, 0xc7, 0xe9, 0x13, 0x39, 0x87, 0x9a, 0xf8, 0x0f, 0xea, 0x37, 0x51, 0xff, 0x2c, 0x3e, 0x3e, 0x82, 0xf8, 0x24, 0x01, 0x3f, 0xaa, 0x3f, 0xa6, 0xf2, 0x1f, 0x33, 0xf9, 0x07, 0x89, 0x2a, 0xc1, 0x64, 0x9f, 0x38, 0xfe, 0xc3, 0x30, 0x12, 0x7d, 0x7e, 0x10, 0xe2, 0xeb, 0x90, 0x51, 0xb3, 0xfd, 0x75, 0x39, 0x83, 0xf1, 0x4b, 0x44, 0xd5, 0xf9, 0x0c, 0xdb, 0x5f, 0xcb, 0x2d, 0x91, 0xcf, 0x68, 0x2c, 0xf4, 0x7c, 0x49, 0xf8, 0xbc, 0xe8, 0xdf, 0x44, 0x9f, 0x09, 0xde, 0xf3, 0x87, 0xc4, 0x7c, 0xbe, 0x7d, 0xc2, 0x6f, 0x4a, 0x61, 0xff, 0x35, 0x2c, 0x69, 0xc4, 0xc1, 0xdc, 0x2d, 0xf2, 0xb7, 0xc1, 0x7f, 0x43, 0x3e, 0x60, 0xc2, 0x67, 0xea, 0x13, 0x30, 0x8b, 0x26, 0xc8, 0x24, 0xfa, 0xc1, 0x67, 0x94, 0x21, 0x07, 0xe2, 0x9e, 0x82, 0xc8, 0xbd, 0x85, 0xf1, 0xf9, 0x27, 0x73, 0x9c, 0x8c, 0x23, 0x2b, 0x14, 0xa3, 0xcc, 0x90, 0x83, 0x22, 0x02, 0x5a, 0xf1, 0xfe, 0x19, 0x4e, 0xfe, 0xc4, 0x44, 0x5f, 0xcf, 0x8f, 0x06, 0xfb, 0xea, 0xd5, 0x32, 0xc8, 0xaf, 0x9e, 0x8d, 0x3c, 0xfe, 0x89, 0x01, 0x9e, 0xc4, 0x7f, 0x28, 0x86, 0x4d, 0xcf, 0x90, 0x93, 0x73, 0x40, 0xc8, 0x3e, 0x34, 0xe6, 0x19, 0x60, 0x50, 0x8f, 0x6e, 0x7f, 0x63, 0xfc, 0x87, 0x6d, 0x67, 0x92, 0x3f, 0x21, 0xfe, 0xc3, 0x31, 0x6c, 0xf2, 0xe5, 0x40, 0x0e, 0xa0, 0x26, 0xfd, 0x12, 0xef, 0x1b, 0xba, 0x09, 0x1e, 0x96, 0x9d, 0x26, 0xe5, 0x80, 0x98, 0xf8, 0xa7, 0x31, 0xf1, 0x6f, 0x11, 0x43, 0x35, 0xc5, 0x3f, 0x8b, 0x89, 0x7f, 0xf1, 0xc1, 0xd9, 0x7a, 0x36, 0xbf, 0x96, 0x3d, 0x2b, 0x67, 0xe5, 0xac, 0x9c, 0x95, 0xe0, 0xfe, 0x80, 0x6a, 0xaf, 0x25, 0x34, 0x9a, 0x7a, 0x2c, 0x92, 0xb0, 0x7f, 0x20, 0xc4, 0xfb, 0x09, 0xa5, 0xd7, 0x46, 0xf2, 0xbf, 0xde, 0x1a, 0xd2, 0x63, 0xe0, 0xdd, 0x95, 0xc4, 0x1c, 0x4f, 0xa8, 0x9f, 0xe6, 0x10, 0x33, 0xff, 0xf1, 0x0c, 0x86, 0x64, 0x24, 0xe6, 0xfd, 0x19, 0xb5, 0xcc, 0xef, 0xcf, 0x4a, 0x46, 0x75, 0x0e, 0x11, 0xa7, 0x43, 0x76, 0xd2, 0x39, 0x44, 0xe8, 0x38, 0xc2, 0x8a, 0x6e, 0x73, 0x9e, 0xd8, 0x5e, 0x56, 0xfc, 0x11, 0x80, 0xf1, 0xcc, 0x40, 0xff, 0x69, 0x13, 0x33, 0xf1, 0xae, 0xc9, 0x6f, 0x7a, 0xbc, 0xe9, 0xf4, 0x93, 0xe0, 0x96, 0x81, 0x3e, 0xd1, 0x7c, 0xc3, 0xf4, 0xfc, 0x63, 0x44, 0x7b, 0x6c, 0x12, 0xf3, 0xf6, 0x8b, 0x58, 0x41, 0x1f, 0x8b, 0xe8, 0x8d, 0x04, 0x8f, 0x79, 0x22, 0xf4, 0x49, 0x32, 0x7e, 0x12, 0x7f, 0x56, 0x42, 0x6c, 0x98, 0xe0, 0x09, 0xc7, 0x33, 0xb1, 0x7b, 0x71, 0xc5, 0x13, 0x33, 0xee, 0x6d, 0x12, 0x7f, 0x9e, 0x18, 0x90, 0xdf, 0xc4, 0x23, 0xd5, 0xe5, 0xb7, 0xcc, 0xf1, 0xa3, 0xeb, 0x87, 0x98, 0xb6, 0x37, 0x24, 0xd8, 0x9a, 0xec, 0xe3, 0x1d, 0xaf, 0xc5, 0xe0, 0xc7, 0xf9, 0x9f, 0x6e, 0x7f, 0xa3, 0x7f, 0x85, 0xe0, 0x24, 0x6e, 0xfd, 0x98, 0xfc, 0x40, 0xc8, 0x09, 0xf2, 0x85, 0xf2, 0x43, 0x9c, 0x7f, 0x59, 0xc1, 0x9f, 0x06, 0x46, 0xe9, 0xc7, 0xe4, 0xca, 0xf0, 0xd6, 0xcf, 0x44, 0x9f, 0x85, 0x62, 0x34, 0x49, 0x7f, 0x24, 0xc6, 0x7e, 0x24, 0x86, 0xbf, 0x80, 0xfd, 0x4c, 0xfa, 0x0b, 0xe9, 0x28, 0xce, 0x7e, 0x4c, 0x93, 0xd1, 0xa4, 0xff, 0xb8, 0xf8, 0x0f, 0xeb, 0x37, 0x4e, 0x7f, 0x27, 0xd9, 0x8f, 0x9c, 0xa0, 0x7f, 0x8f, 0xc7, 0x18, 0x7c, 0x1a, 0x67, 0x1f, 0x0d, 0x6e, 0xe2, 0x2f, 0x9c, 0x5f, 0x98, 0xe9, 0xfc, 0x4f, 0x97, 0xef, 0x84, 0x18, 0x36, 0x1d, 0xbf, 0x07, 0xfc, 0x2f, 0xc6, 0x3e, 0x4f, 0x7c, 0x9c, 0x4f, 0xac, 0xa7, 0x7e, 0xff, 0x67, 0xa1, 0x3c, 0x11, 0xe6, 0x9d, 0x59, 0xf1, 0xf1, 0x1b, 0xce, 0x01, 0x34, 0xe6, 0xe7, 0xe1, 0x71, 0xf6, 0x0d, 0xe4, 0xa8, 0x38, 0xfc, 0x90, 0x1f, 0x59, 0x09, 0x39, 0x2e, 0x7c, 0x46, 0x4a, 0x0c, 0x31, 0x14, 0x97, 0xbb, 0x8d, 0xf4, 0x49, 0x30, 0x90, 0x89, 0x81, 0x3e, 0xd1, 0x8e, 0x8e, 0x4c, 0xf1, 0x9b, 0x94, 0x5f, 0x4c, 0x39, 0xc0, 0xb2, 0x92, 0x73, 0x80, 0x95, 0x10, 0xc3, 0xd4, 0x4a, 0xc6, 0x67, 0x71, 0x39, 0x54, 0xb7, 0x8f, 0x21, 0x46, 0x58, 0xfc, 0xe3, 0xd1, 0x3f, 0x7e, 0x8e, 0xdb, 0x5f, 0x90, 0xf8, 0xfd, 0x57, 0x38, 0x86, 0xe9, 0x49, 0x70, 0x2b, 0x1e, 0x6e, 0x8a, 0xff, 0xf0, 0xfe, 0x8d, 0x24, 0xd0, 0x8f, 0xfb, 0x3e, 0xa3, 0xf2, 0x62, 0x52, 0xfc, 0xb3, 0x98, 0xf8, 0xa7, 0x06, 0x1f, 0x33, 0xfa, 0x07, 0x31, 0xc7, 0xbf, 0xa7, 0xdf, 0xe7, 0x73, 0x2f, 0x5b, 0xf4, 0x9e, 0xe9, 0xfa, 0xf6, 0x77, 0x4c, 0xd7, 0x69, 0x78, 0x39, 0x61, 0x7f, 0x6a, 0xba, 0xfa, 0x8f, 0x4c, 0xd7, 0xa9, 0x78, 0x19, 0xfb, 0x7f, 0x66, 0xdf, 0xaf, 0xbd, 0x17, 0xbe, 0xd0, 0xbe, 0xc7, 0xef, 0x87, 0xaf, 0x33, 0xfb, 0x9e, 0x16, 0xfb, 0xe2, 0x15, 0xb5, 0x2f, 0x5e, 0x67, 0xf6, 0x3d, 0xb3, 0xef, 0x47, 0xbd, 0x1c, 0x19, 0xcc, 0xdb, 0xbb, 0x77, 0x64, 0x30, 0xef, 0xe0, 0x54, 0xd8, 0xf7, 0xc8, 0x60, 0xde, 0x6f, 0x3d, 0x3c, 0x32, 0x98, 0xf7, 0x83, 0x87, 0xa7, 0x41, 0xde, 0xaf, 0xfe, 0x49, 0xd4, 0xc0, 0x87, 0x0f, 0xff, 0xe9, 0x9f, 0xa3, 0x06, 0x3e, 0x3c, 0x15, 0xf2, 0xfe, 0xf5, 0xdf, 0x98, 0xe2, 0xf7, 0xbf, 0xff, 0xe7, 0xd4, 0xe6, 0xe7, 0xde, 0x3d, 0xfe, 0x27, 0xcb, 0xbd, 0x23, 0x5e, 0x20, 0x58, 0xf9, 0x9f, 0x2c, 0xdf, 0x11, 0xa3, 0xa7, 0x22, 0x3f, 0xbf, 0xfb, 0x1e, 0xff, 0x93, 0xe5, 0xbd, 0xa3, 0xa3, 0xfb, 0x0f, 0x8e, 0x8e, 0x8e, 0xff, 0xe5, 0x7d, 0xfe, 0x27, 0xcb, 0xfb, 0x47, 0x47, 0xdf, 0xfd, 0xdb, 0xd3, 0x21, 0xef, 0x51, 0xa4, 0xfc, 0xd9, 0xd7, 0x8f, 0x0c, 0xe5, 0x5f, 0x7f, 0x70, 0x4a, 0xe4, 0x7d, 0xe7, 0x37, 0x02, 0x72, 0x7d, 0xf9, 0x8f, 0xfe, 0xe0, 0x0f, 0xff, 0xf8, 0x2b, 0x47, 0xbf, 0xf9, 0x5b, 0x81, 0xd1, 0xef, 0xff, 0xfd, 0xdf, 0x7d, 0xef, 0x1f, 0xfe, 0xf1, 0x54, 0xc8, 0xfb, 0x3b, 0xbf, 0x1b, 0x90, 0xec, 0xcf, 0xff, 0xe2, 0x1b, 0xdf, 0xfc, 0xcb, 0xbf, 0x3a, 0xfa, 0xbd, 0xdf, 0x0f, 0x8c, 0xfe, 0xfb, 0x7f, 0xfc, 0xf0, 0xdf, 0xfe, 0xf3, 0xbf, 0x86, 0xee, 0x59, 0xd6, 0xc7, 0xf9, 0xf5, 0xf2, 0x10, 0x5e, 0x3f, 0xcb, 0x2f, 0x7e, 0x6f, 0x3d, 0xc9, 0xc5, 0xff, 0x77, 0x2c, 0xeb, 0x1c, 0x5e, 0xcf, 0xc3, 0xf5, 0x02, 0x5c, 0xe4, 0x1c, 0x19, 0xb2, 0x82, 0x17, 0x09, 0x5d, 0x3a, 0x85, 0x73, 0x40, 0xe2, 0x57, 0xad, 0x97, 0xac, 0x97, 0x9e, 0x7b, 0xe9, 0xb9, 0x27, 0x5b, 0x33, 0x7c, 0x3d, 0xff, 0xf1, 0x1f, 0xbe, 0x62, 0xad, 0x5e, 0x29, 0x2f, 0x94, 0x4b, 0xa9, 0xb7, 0x52, 0x43, 0xb3, 0x4b, 0x73, 0x65, 0xbb, 0x94, 0x1a, 0x82, 0xdb, 0xa1, 0x37, 0x2e, 0xdb, 0x58, 0x4a, 0x93, 0xe7, 0x73, 0xd0, 0xbb, 0xa4, 0x7a, 0x05, 0xec, 0xad, 0xac, 0x2e, 0xcf, 0x2f, 0x5e, 0xb6, 0x4b, 0x53, 0xd8, 0x59, 0xbc, 0xbe, 0xf0, 0x46, 0x79, 0x19, 0x40, 0x93, 0xd8, 0xfb, 0x54, 0xf9, 0x33, 0x37, 0x97, 0x96, 0xe7, 0x4a, 0x45, 0xec, 0xcc, 0x5c, 0x9b, 0xe7, 0x58, 0x9c, 0xc4, 0xec, 0xd2, 0xc2, 0x42, 0x79, 0x71, 0xb5, 0x34, 0xc9, 0xb1, 0x56, 0xe6, 0x2f, 0x2f, 0x72, 0x82, 0x7c, 0xe2, 0x4a, 0xf9, 0x6a, 0x79, 0x76, 0xd5, 0x96, 0xb0, 0xd9, 0xeb, 0xcb, 0x2b, 0x4b, 0x40, 0x51, 0xac, 0x75, 0x65, 0x66, 0x6e, 0xe9, 0xa6, 0x5d, 0xea, 0xb8, 0xbb, 0x0e, 0xa7, 0x79, 0x75, 0x75, 0xed, 0xd2, 0x12, 0xd0, 0xa9, 0x55, 0x1a, 0x6d, 0x3e, 0xb2, 0x30, 0xb3, 0x3a, 0x7b, 0x65, 0x6d, 0xae, 0x7c, 0x75, 0x7e, 0x61, 0x7e, 0xb5, 0xbc, 0xbc, 0xa2, 0xa6, 0xde, 0xce, 0xa5, 0x52, 0x43, 0x97, 0x67, 0x16, 0xca, 0xd7, 0x66, 0xe6, 0xa4, 0x50, 0xab, 0x4b, 0xd7, 0x67, 0xaf, 0xc0, 0x3d, 0xef, 0x00, 0xa9, 0x6b, 0x57, 0x66, 0x4a, 0x93, 0xaf, 0x4f, 0x20, 0x95, 0xdb, 0x02, 0xe3, 0x76, 0x2a, 0x35, 0x7b, 0xa5, 0x3c, 0xfb, 0xa9, 0xb5, 0xc5, 0xf2, 0xcd, 0xb5, 0x1b, 0x40, 0x6d, 0x7e, 0x69, 0x91, 0x13, 0x4c, 0x5d, 0x9e, 0xbf, 0xb4, 0x76, 0xb5, 0xbc, 0x78, 0x79, 0xf5, 0x4a, 0xa9, 0x30, 0x61, 0x8f, 0x8d, 0xd9, 0xf5, 0xa6, 0xdd, 0x76, 0xaa, 0xad, 0xe6, 0x46, 0x3b, 0xb5, 0xb2, 0x74, 0x69, 0xf5, 0xe6, 0xcc, 0x72, 0x79, 0x6d, 0xb9, 0xbc, 0x38, 0x57, 0x46, 0xe5, 0x08, 0xf6, 0x52, 0x37, 0x56, 0x3e, 0xb3, 0x38, 0x2b, 0xf0, 0x67, 0x97, 0x57, 0xd7, 0x16, 0x96, 0x16, 0xe7, 0x57, 0x97, 0x96, 0x25, 0x10, 0x29, 0xae, 0xcc, 0xce, 0x5c, 0x2d, 0x97, 0x8a, 0xa9, 0xeb, 0xf3, 0xf2, 0x76, 0x2a, 0x75, 0x63, 0xe9, 0xea, 0x75, 0x30, 0xc8, 0x64, 0x21, 0x95, 0x1a, 0x8b, 0x2f, 0xa9, 0xda, 0x6e, 0xb3, 0xda, 0xa9, 0xb7, 0x9a, 0xf6, 0xea, 0xfc, 0x6c, 0x26, 0x9b, 0x1a, 0xaa, 0x36, 0xda, 0xd8, 0x34, 0x5a, 0xd5, 0x4a, 0xc3, 0x6e, 0x54, 0xd6, 0x9d, 0x46, 0x29, 0xbd, 0xba, 0x55, 0x6f, 0xdb, 0xf0, 0xd7, 0xde, 0x6f, 0x77, 0x9c, 0x6d, 0x1b, 0x98, 0xad, 0xd5, 0x37, 0x77, 0xdd, 0x0a, 0xc7, 0xab, 0x56, 0xdc, 0x8e, 0x5b, 0xdf, 0xd8, 0x74, 0xd2, 0x0a, 0xab, 0x5d, 0x7f, 0xd3, 0x29, 0xed, 0xb8, 0xf5, 0x66, 0x27, 0xc3, 0x09, 0xe4, 0x26, 0x72, 0x63, 0x17, 0x80, 0xa6, 0x3e, 0x94, 0x29, 0x4c, 0x4d, 0x8c, 0xe1, 0xc4, 0xec, 0xf8, 0x78, 0x21, 0x97, 0x99, 0x2c, 0x5e, 0x80, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xcd, 0x8d, 0x14, 0x97, 0x12, 0x4d, 0x56, 0x5e, 0xe6, 0x1e, 0x05, 0x1a, 0x5c, 0x2d, 0x7f, 0xba, 0xf4, 0xd9, 0xcf, 0x82, 0x86, 0x5f, 0xbb, 0xe5, 0xb8, 0x6d, 0x5c, 0x78, 0x72, 0x72, 0x02, 0xba, 0x95, 0x0e, 0xac, 0xbe, 0xbe, 0xdb, 0x71, 0xec, 0x5b, 0x4e, 0xb5, 0x68, 0x6f, 0xee, 0xec, 0xae, 0xdd, 0x70, 0xdc, 0x8e, 0xb3, 0x77, 0x31, 0x0c, 0x2c, 0x70, 0xe0, 0xaa, 0xb3, 0x37, 0xdb, 0x6a, 0xb9, 0x1b, 0x11, 0xf0, 0x14, 0x07, 0xcf, 0xb6, 0x1a, 0x2d, 0x17, 0x61, 0xbb, 0xcd, 0x7a, 0xad, 0xe5, 0x6e, 0xdb, 0xdb, 0x95, 0x8e, 0x80, 0x2c, 0xb4, 0x36, 0x9c, 0xc6, 0x8d, 0xba, 0xd3, 0xbd, 0xe6, 0xb6, 0x7e, 0xd9, 0xe1, 0x3a, 0x5b, 0xa8, 0x00, 0x3e, 0x5f, 0xe8, 0x56, 0xc5, 0xdd, 0xaf, 0x37, 0x37, 0x05, 0x9d, 0xaa, 0xa2, 0xa1, 0x8d, 0x16, 0xec, 0x8e, 0xb6, 0xf0, 0xad, 0x56, 0x7d, 0x03, 0x28, 0xd7, 0x9b, 0x19, 0xbc, 0xcb, 0x2a, 0x4f, 0xe2, 0x88, 0x76, 0x29, 0xc8, 0xc8, 0x90, 0x42, 0x04, 0x00, 0x12, 0xca, 0xe8, 0x52, 0x64, 0xf9, 0x8c, 0xcd, 0xc6, 0xda, 0xb5, 0x56, 0xbb, 0xce, 0xcd, 0x51, 0x4a, 0x66, 0xd6, 0x1e, 0xe1, 0x3c, 0x66, 0x7c, 0x3d, 0xe5, 0xec, 0xc9, 0xfc, 0x04, 0xa7, 0x73, 0x3b, 0x35, 0xf4, 0xb9, 0xcf, 0x81, 0xff, 0x5e, 0x9b, 0xff, 0x74, 0xf9, 0xaa, 0x51, 0xd9, 0xe3, 0xe3, 0x3b, 0xae, 0x53, 0xad, 0xf3, 0x91, 0xad, 0xfa, 0xe6, 0xd6, 0x8e, 0x5d, 0x6b, 0xb4, 0x2a, 0x9d, 0x44, 0x59, 0x95, 0x22, 0xdb, 0x95, 0xed, 0x9d, 0x86, 0xe3, 0x16, 0xe6, 0xec, 0x76, 0x6b, 0xd7, 0xad, 0x3a, 0x3a, 0x8c, 0x53, 0xb1, 0x3b, 0xee, 0xe6, 0xda, 0x9e, 0x79, 0x78, 0xdf, 0x3c, 0xdc, 0x35, 0x0f, 0x6f, 0x45, 0x87, 0xdb, 0x55, 0xd7, 0x34, 0x1b, 0x87, 0x61, 0x36, 0x17, 0xcd, 0x2e, 0x6f, 0xef, 0x36, 0x2a, 0x1d, 0x67, 0x03, 0x42, 0x72, 0x67, 0xb7, 0x63, 0xbb, 0x4e, 0xbb, 0xd5, 0xd8, 0x45, 0xd5, 0xe5, 0x51, 0x3e, 0x94, 0x0b, 0x86, 0x4a, 0xdc, 0x06, 0x85, 0xf3, 0x17, 0xf2, 0x13, 0xb9, 0xc9, 0xa9, 0x29, 0xae, 0x3a, 0x81, 0x7e, 0xa5, 0xe2, 0x6e, 0x34, 0x9d, 0x76, 0xdb, 0x6e, 0xd5, 0x80, 0x6e, 0xa5, 0xd9, 0xa8, 0x37, 0x9d, 0xbc, 0x00, 0xd9, 0x63, 0xaf, 0xe7, 0x27, 0xc0, 0x34, 0xed, 0x56, 0xad, 0x23, 0x46, 0xc6, 0x26, 0x2f, 0xf0, 0x91, 0x6d, 0x67, 0xa3, 0xbe, 0xbb, 0x0d, 0x63, 0x82, 0x9f, 0x2d, 0xa0, 0xb1, 0x02, 0xb8, 0x25, 0x44, 0x30, 0x11, 0xde, 0xa9, 0xef, 0x39, 0x8d, 0x36, 0x4f, 0x1a, 0xc1, 0x25, 0xc6, 0x0a, 0xe1, 0x15, 0xa6, 0xf8, 0x00, 0x52, 0x0c, 0x90, 0xbf, 0x56, 0xdf, 0x2b, 0x8d, 0x15, 0x7d, 0xea, 0x73, 0xf5, 0xf6, 0x4e, 0xa3, 0xb2, 0x6f, 0x77, 0x2b, 0xee, 0x8e, 0xa4, 0x35, 0xc1, 0x31, 0x9b, 0xad, 0xa6, 0x23, 0xfa, 0xe0, 0x20, 0xe3, 0x42, 0x00, 0x67, 0xaf, 0xe3, 0x3a, 0xdb, 0x8e, 0xd2, 0x07, 0xe2, 0x08, 0x85, 0xe0, 0x94, 0x0b, 0x53, 0xa8, 0x13, 0xb8, 0x99, 0x7a, 0x1d, 0xd5, 0x62, 0xcb, 0x05, 0x66, 0xb6, 0x5b, 0xbb, 0xcd, 0x0e, 0xd7, 0xca, 0x56, 0x65, 0xa3, 0xd5, 0x05, 0xc7, 0x6f, 0x7f, 0x21, 0xef, 0xf1, 0x84, 0xbd, 0xb9, 0x8a, 0xfb, 0x85, 0xd2, 0x44, 0xfe, 0xfc, 0xc5, 0xc0, 0xe8, 0x55, 0xf0, 0xb0, 0x4e, 0x69, 0x12, 0x87, 0x39, 0xa5, 0xb1, 0x67, 0x54, 0x24, 0x5f, 0xed, 0xe5, 0xcb, 0x6f, 0xd8, 0x9d, 0x96, 0x7d, 0x15, 0x94, 0x58, 0x71, 0xa5, 0xe8, 0x33, 0xed, 0xf6, 0x2e, 0xba, 0xf1, 0x6e, 0x1b, 0xff, 0x15, 0x53, 0xf6, 0x77, 0xc0, 0x27, 0xc0, 0xa5, 0x3b, 0xbb, 0x60, 0x7f, 0xbb, 0x83, 0xc9, 0xb0, 0xbd, 0xd5, 0xda, 0x6d, 0x6c, 0x80, 0x8a, 0x3a, 0xf6, 0xba, 0x63, 0x37, 0x1d, 0x67, 0xc3, 0xd9, 0xf0, 0x45, 0x5a, 0x6d, 0x09, 0x9a, 0x93, 0x19, 0xd1, 0xaf, 0x66, 0xdf, 0x72, 0x1d, 0xc0, 0x6e, 0x66, 0xaa, 0xd3, 0x20, 0xe6, 0xc4, 0xd4, 0xc4, 0xd4, 0xf9, 0xec, 0x27, 0xab, 0xe3, 0x93, 0x85, 0xfc, 0x2f, 0x16, 0x7e, 0x69, 0xa7, 0xd5, 0xcd, 0x64, 0xaa, 0xa3, 0x30, 0x7e, 0xfe, 0x7c, 0x76, 0x7c, 0x12, 0x9b, 0x5c, 0x21, 0x3f, 0x95, 0xbd, 0x78, 0x5b, 0xa8, 0xb9, 0xe8, 0xd1, 0xcb, 0xf0, 0x9e, 0x47, 0x8d, 0x67, 0xbc, 0x8c, 0xbf, 0x58, 0x35, 0xef, 0x66, 0x73, 0x7a, 0x77, 0x33, 0xd8, 0x5d, 0xcf, 0x22, 0x4d, 0x21, 0xa7, 0x18, 0x45, 0xf1, 0x51, 0xc6, 0x67, 0x2b, 0xfc, 0x8a, 0xbb, 0xb9, 0x6e, 0x12, 0x1d, 0x24, 0x9c, 0x28, 0x4e, 0x16, 0x27, 0x5e, 0xff, 0x64, 0x75, 0x44, 0x88, 0xce, 0x85, 0x1d, 0x41, 0x05, 0x54, 0x73, 0x13, 0xf9, 0xa9, 0xc9, 0x0b, 0x17, 0x2e, 0x64, 0xc7, 0x84, 0x22, 0x74, 0xe9, 0x91, 0x60, 0x8c, 0xec, 0x62, 0x2d, 0x29, 0xb9, 0xea, 0x6c, 0xea, 0x1d, 0x5d, 0xea, 0x45, 0x90, 0xd9, 0x69, 0x77, 0x6c, 0x47, 0x45, 0xba, 0x48, 0x4a, 0xf6, 0x66, 0xfd, 0x96, 0xd3, 0x14, 0x29, 0x01, 0x25, 0xdf, 0x69, 0xc1, 0x83, 0x0a, 0xfe, 0x95, 0x29, 0xb5, 0xd2, 0xe4, 0x1a, 0x70, 0x1a, 0xe0, 0xc3, 0xb5, 0xb6, 0xd3, 0x51, 0xda, 0x6a, 0xb4, 0x5b, 0xf6, 0x9b, 0x8e, 0xdb, 0xfa, 0x05, 0x8c, 0x4c, 0x8c, 0x79, 0xd7, 0x71, 0x54, 0xae, 0x28, 0xda, 0x97, 0x9c, 0x4e, 0x75, 0x2b, 0xc3, 0xc3, 0x04, 0x28, 0xe5, 0xf8, 0x0d, 0x4c, 0xcb, 0xf2, 0x4c, 0x0f, 0x23, 0x25, 0xd4, 0x50, 0xcb, 0xcd, 0xc0, 0xed, 0x08, 0x30, 0x35, 0x8a, 0xb0, 0x51, 0x1e, 0x4b, 0x10, 0x08, 0xa0, 0x8d, 0xf3, 0xd9, 0xec, 0x38, 0x8c, 0xf3, 0x04, 0x2f, 0x65, 0xf6, 0xfc, 0x60, 0x32, 0x5f, 0x80, 0x44, 0x2e, 0xad, 0x52, 0x98, 0xcb, 0x88, 0x8c, 0x9a, 0x03, 0x52, 0xf9, 0xbd, 0xfd, 0x1c, 0xcf, 0x2d, 0xd9, 0x3c, 0xc8, 0xef, 0x4b, 0x0e, 0x51, 0xde, 0xa9, 0x34, 0xab, 0x0e, 0x66, 0x0e, 0x4f, 0x7a, 0x99, 0x4c, 0xc0, 0x09, 0x9a, 0x52, 0x31, 0x5c, 0x4c, 0x2f, 0xdd, 0x21, 0x92, 0x27, 0x41, 0xf6, 0x2d, 0x64, 0x5a, 0x72, 0x7b, 0x51, 0x72, 0x34, 0x96, 0x41, 0xfe, 0xc7, 0x3c, 0x49, 0xb2, 0xd9, 0x31, 0x25, 0x42, 0x56, 0x98, 0x70, 0x68, 0x48, 0xe6, 0x90, 0x39, 0xfb, 0x72, 0x65, 0xb7, 0xdd, 0xae, 0x57, 0x9a, 0xbe, 0xaf, 0xe0, 0x88, 0x74, 0x14, 0xd4, 0x91, 0xca, 0xc9, 0x95, 0x86, 0xe3, 0xd9, 0xd9, 0xd9, 0xdb, 0x29, 0x64, 0xf8, 0xd0, 0x08, 0xae, 0x8d, 0x6b, 0x78, 0x42, 0x15, 0xc7, 0x3a, 0x95, 0x1d, 0x8f, 0xac, 0x5d, 0xab, 0x37, 0x3a, 0x8e, 0x6b, 0x57, 0x1a, 0x2d, 0xb0, 0xe1, 0x56, 0xcb, 0x7d, 0xd3, 0x56, 0xf9, 0x91, 0x1b, 0xe4, 0x0a, 0x8c, 0x14, 0x7d, 0x83, 0x88, 0xc5, 0x3c, 0x8b, 0xf0, 0x29, 0xeb, 0x25, 0x61, 0x35, 0x65, 0xb0, 0xcc, 0x18, 0x78, 0x68, 0x0e, 0xe7, 0x88, 0x07, 0xad, 0xf0, 0xc1, 0xf0, 0x24, 0xcc, 0x97, 0xe1, 0x49, 0x1b, 0x91, 0x49, 0x41, 0x4a, 0x62, 0xf5, 0x8d, 0x76, 0xa7, 0xc4, 0x95, 0x8c, 0x62, 0xe5, 0xf9, 0xb3, 0x0f, 0xe5, 0x9a, 0x6d, 0x35, 0xe1, 0xb9, 0x0b, 0x60, 0x65, 0x34, 0xb0, 0x50, 0xd7, 0xc1, 0x6c, 0x98, 0xf7, 0x71, 0xb9, 0x4e, 0x4a, 0x32, 0xa3, 0x6b, 0x34, 0xbb, 0xeb, 0x25, 0xae, 0x56, 0xa0, 0xcd, 0xb9, 0x17, 0xea, 0xd4, 0x27, 0x54, 0xbd, 0x09, 0x98, 0x74, 0x0c, 0x13, 0x36, 0xfc, 0x09, 0x21, 0x0a, 0xc0, 0xdc, 0xb2, 0xb0, 0x8b, 0x50, 0xb6, 0x17, 0x42, 0x79, 0xcd, 0x4d, 0x33, 0xeb, 0x23, 0xdd, 0xf5, 0xd1, 0xea, 0x48, 0xb7, 0x3a, 0xba, 0x31, 0xd2, 0xdd, 0xc8, 0x8e, 0x67, 0xa0, 0x0b, 0x1d, 0xb8, 0xf5, 0x4c, 0x77, 0xfe, 0xa9, 0x4d, 0x77, 0x3e, 0xd9, 0x74, 0x95, 0x88, 0xe9, 0x0a, 0x51, 0xab, 0xfc, 0xe4, 0xec, 0xcb, 0x27, 0x39, 0x91, 0x49, 0x85, 0x9f, 0x94, 0x13, 0x54, 0x7c, 0x27, 0x28, 0x18, 0x6d, 0xfc, 0xe3, 0xf4, 0x12, 0x39, 0xc1, 0xf1, 0x27, 0x14, 0x3e, 0x8c, 0x1b, 0x55, 0x46, 0xba, 0x95, 0xd1, 0xa0, 0x2f, 0x8d, 0x3a, 0x23, 0x5d, 0x07, 0x1d, 0xaa, 0x32, 0xaa, 0x7c, 0x6a, 0x14, 0x06, 0x3c, 0xb7, 0x92, 0x54, 0xd5, 0xde, 0x48, 0x53, 0x98, 0xe0, 0x09, 0xf7, 0x56, 0xb1, 0x7e, 0x64, 0x32, 0xc7, 0xbe, 0x9e, 0x7f, 0x3d, 0x71, 0x00, 0x25, 0xa7, 0xb6, 0x6a, 0xfe, 0xe2, 0x33, 0x8d, 0x06, 0xec, 0x6e, 0xbc, 0x54, 0xba, 0x05, 0x8f, 0x03, 0xee, 0xc6, 0x3c, 0xc3, 0x3a, 0xb5, 0x1a, 0xec, 0xc3, 0x45, 0xca, 0xf5, 0xfc, 0x7a, 0xd5, 0xad, 0x6b, 0xf9, 0x55, 0xf3, 0x65, 0x91, 0xab, 0x90, 0xc7, 0x31, 0xb5, 0x3b, 0x57, 0x1e, 0x2c, 0x62, 0x01, 0x41, 0xe8, 0x97, 0x01, 0xbf, 0xf5, 0xb1, 0xbc, 0x3d, 0xbd, 0xef, 0x0f, 0x5c, 0xf4, 0x20, 0x45, 0xcf, 0x15, 0x3c, 0x98, 0x4f, 0xd2, 0xf3, 0x02, 0x1f, 0xe6, 0xe1, 0x49, 0x75, 0x04, 0xed, 0x13, 0x78, 0xd4, 0xb4, 0x5c, 0xfe, 0xe4, 0xd4, 0x76, 0xc2, 0x80, 0x8f, 0xcf, 0x51, 0x78, 0xbb, 0x13, 0xa3, 0xf8, 0xac, 0x84, 0x78, 0xdf, 0xd9, 0xaa, 0x78, 0x8f, 0x9b, 0x9b, 0xb0, 0x9b, 0x0c, 0xa9, 0x43, 0x3d, 0x72, 0xc0, 0x7f, 0x90, 0xed, 0x8b, 0x78, 0x0e, 0x20, 0xc7, 0x47, 0xbc, 0x8d, 0xe7, 0x28, 0xb2, 0x97, 0xdf, 0x1f, 0xe1, 0xff, 0x66, 0x47, 0xf8, 0x46, 0x76, 0x2f, 0xe7, 0x01, 0xf6, 0x38, 0x60, 0x4f, 0x02, 0xf6, 0x03, 0x22, 0x20, 0x1d, 0x78, 0x56, 0x8d, 0xe2, 0xde, 0x53, 0xf1, 0xbf, 0x12, 0xdc, 0xa5, 0x72, 0xdd, 0x2e, 0x40, 0x27, 0xca, 0x5a, 0x7e, 0x6f, 0xb4, 0x24, 0x96, 0xe6, 0xfb, 0x69, 0x65, 0x08, 0xc4, 0x2c, 0xf1, 0xfd, 0x89, 0xda, 0xdb, 0xe6, 0x22, 0x37, 0x82, 0x0b, 0x4e, 0xa3, 0x54, 0x73, 0x2b, 0xd5, 0x8e, 0x60, 0x75, 0xfc, 0x82, 0xd2, 0x71, 0xbd, 0x26, 0x46, 0x60, 0xd7, 0x54, 0x2c, 0x16, 0xb3, 0x9c, 0x1b, 0xb7, 0xe4, 0x6d, 0x8b, 0xf9, 0x1c, 0x78, 0x78, 0xc3, 0x03, 0xdd, 0x9f, 0x88, 0xdb, 0x27, 0x3e, 0x71, 0xd3, 0x34, 0x91, 0x43, 0xd6, 0x43, 0x10, 0xa9, 0x07, 0x1c, 0xbc, 0x78, 0x9b, 0x6b, 0x37, 0xf0, 0x7a, 0x9a, 0xb5, 0xb9, 0xac, 0xfe, 0x6b, 0x09, 0xec, 0xdb, 0x26, 0x64, 0x08, 0x7b, 0x1b, 0xf7, 0x20, 0x45, 0xae, 0x25, 0x48, 0x59, 0x6e, 0xa7, 0x04, 0xef, 0xa5, 0x97, 0xdc, 0xca, 0x26, 0x7f, 0x15, 0x84, 0x8d, 0x89, 0xd8, 0x1a, 0xf0, 0xb7, 0xbc, 0x9c, 0x78, 0xab, 0x13, 0xa2, 0xf2, 0xc9, 0xf9, 0xfd, 0x12, 0x7f, 0x19, 0x1b, 0x93, 0x3d, 0xbe, 0xe7, 0x1f, 0x52, 0x2a, 0x2f, 0x71, 0xdf, 0xe0, 0xa0, 0x71, 0x8f, 0x4a, 0x57, 0x50, 0xd9, 0xca, 0x8a, 0x57, 0xb0, 0x21, 0x6f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x4f, 0x09, 0xc3, 0x0b, 0xed, 0x35, 0xc2, 0xcd, 0x17, 0xe2, 0xc6, 0x7b, 0x75, 0xf6, 0x70, 0xc4, 0x0b, 0xf6, 0x94, 0xdc, 0x55, 0x66, 0xc2, 0xe4, 0xb2, 0xa1, 0x37, 0xe5, 0xd4, 0xed, 0xd4, 0xff, 0x02, 0xff, 0x61, 0xff, 0x76, \ No newline at end of file +0x78, 0xda, 0xed, 0x3c, 0x4b, 0x73, 0x1b, 0xc9, 0x79, 0xb3, 0xd6, 0x3a, 0x5b, 0x44, 0x7a, 0x77, 0xc3, 0x3d, 0xa7, 0xca, 0xb3, 0xd8, 0x43, 0x00, 0x12, 0x04, 0x49, 0x80, 0x52, 0x6d, 0x22, 0xa2, 0x5c, 0x5c, 0x12, 0x12, 0x59, 0x16, 0x49, 0x15, 0x49, 0xad, 0xec, 0x72, 0xb9, 0x18, 0x10, 0x1c, 0x90, 0x88, 0x41, 0x80, 0x35, 0x00, 0x05, 0x72, 0x37, 0xaa, 0xca, 0x51, 0x87, 0x1c, 0x72, 0xf5, 0x9e, 0x36, 0xc9, 0x25, 0x66, 0xe9, 0x90, 0xc7, 0x1f, 0x68, 0x49, 0x89, 0x1d, 0x3b, 0x6d, 0xac, 0x37, 0x76, 0xde, 0xa6, 0x68, 0xe7, 0xfd, 0x80, 0x10, 0x6e, 0x9c, 0x77, 0xb6, 0x4a, 0xf9, 0xbe, 0x7e, 0xcc, 0xf4, 0xcc, 0xf4, 0x0c, 0xa5, 0xb5, 0x6c, 0x6f, 0x18, 0xf6, 0xb0, 0xd5, 0xd3, 0xfd, 0xf5, 0xf7, 0xf5, 0xf7, 0x9e, 0x9e, 0x1e, 0x94, 0x86, 0x2d, 0xcb, 0x7a, 0xee, 0xdd, 0x4f, 0x59, 0x3d, 0x06, 0xe5, 0xce, 0x9d, 0x3b, 0x77, 0x0f, 0x0f, 0x0f, 0xef, 0x62, 0x0b, 0xdd, 0xbb, 0x8c, 0x7a, 0x95, 0xb1, 0xfe, 0xe0, 0xce, 0x1d, 0x36, 0x38, 0x3c, 0xa4, 0x83, 0x3b, 0xbf, 0x41, 0x07, 0xec, 0x2e, 0x65, 0xf4, 0x2e, 0xa5, 0xaa, 0x72, 0xfc, 0xe1, 0xe1, 0xe1, 0x5c, 0x3a, 0x9d, 0xce, 0x61, 0x0b, 0xdd, 0x1c, 0xe0, 0xa9, 0x8a, 0xf8, 0xc3, 0xc3, 0x6c, 0x90, 0x4e, 0xd3, 0xc1, 0xf0, 0xab, 0x80, 0x9f, 0xa3, 0x03, 0x2a, 0x6a, 0x9f, 0xe6, 0x2c, 0xc6, 0xf1, 0x01, 0x77, 0xba, 0x58, 0x2c, 0x4e, 0x63, 0x0b, 0xdd, 0x69, 0x02, 0x15, 0x70, 0xa7, 0x25, 0x7e, 0x3a, 0xcd, 0x06, 0xc5, 0x22, 0x1d, 0xa4, 0x0b, 0x80, 0x3f, 0x4d, 0x07, 0x04, 0x2a, 0x9d, 0x06, 0xfc, 0x69, 0x89, 0xdf, 0xed, 0x76, 0x1b, 0xb5, 0x5a, 0xad, 0x81, 0x2d, 0x74, 0x79, 0x25, 0x16, 0xc1, 0x16, 0xf1, 0xbb, 0x5d, 0x36, 0xa8, 0xd5, 0xe8, 0xa0, 0xbb, 0x05, 0xf8, 0x0d, 0xa0, 0xd9, 0xa0, 0xd4, 0x82, 0x8a, 0xed, 0x37, 0x8f, 0x8e, 0x5e, 0x3c, 0xc2, 0xf2, 0xe8, 0xe1, 0xd1, 0xd1, 0x60, 0x70, 0xf4, 0x68, 0x30, 0x78, 0x88, 0x5d, 0xf8, 0xe7, 0xd1, 0x77, 0x07, 0x83, 0x97, 0x14, 0x9c, 0x8f, 0x03, 0x9c, 0xcf, 0x8b, 0xc0, 0x1f, 0x4a, 0x7c, 0xd9, 0x42, 0x3f, 0x00, 0x7f, 0x24, 0xe9, 0x3f, 0x92, 0xf8, 0x8f, 0x7c, 0xfc, 0x9f, 0xaf, 0xd5, 0x7e, 0xa2, 0x76, 0x6b, 0xab, 0x56, 0xdb, 0xba, 0x25, 0x6a, 0xb7, 0xcb, 0x5b, 0x18, 0xb9, 0xb5, 0xdb, 0xed, 0xbe, 0x60, 0xa7, 0xd3, 0x9f, 0x48, 0x0f, 0xbf, 0x9a, 0x4e, 0xbf, 0xfa, 0x4a, 0x5a, 0x6f, 0xe1, 0xee, 0x95, 0x9f, 0x1a, 0x1e, 0x7e, 0xee, 0xdd, 0xc3, 0xc3, 0xd4, 0xe1, 0x97, 0xdf, 0x39, 0xe4, 0xf5, 0x9d, 0x2f, 0x1f, 0xaa, 0x7b, 0xb8, 0x7b, 0xe7, 0x57, 0xbe, 0xf4, 0xa5, 0xa1, 0x89, 0x62, 0xf1, 0x42, 0xb1, 0xf0, 0x5a, 0x91, 0xd7, 0xd7, 0xd2, 0xa0, 0x65, 0x6c, 0x0b, 0xc5, 0x02, 0xfc, 0x8b, 0xb4, 0xb9, 0xbd, 0xd1, 0xf6, 0xfc, 0xfa, 0x3a, 0xbf, 0xff, 0x65, 0xf0, 0x03, 0x66, 0x51, 0xd4, 0x6d, 0x8f, 0xdd, 0xb5, 0x18, 0xd8, 0xbe, 0x7f, 0x17, 0xec, 0x7f, 0x28, 0x2b, 0xfa, 0x83, 0x45, 0xfb, 0x03, 0xc6, 0x06, 0x03, 0x6e, 0x6f, 0xb4, 0x7d, 0xfa, 0x3e, 0xb4, 0x78, 0xa5, 0xd3, 0x3f, 0x0d, 0x7e, 0xe0, 0xe1, 0xe7, 0x28, 0x05, 0xdb, 0xf3, 0x9a, 0x4b, 0x53, 0xc6, 0xfd, 0x60, 0xd8, 0xc7, 0xe7, 0xf6, 0x46, 0xdb, 0x3f, 0x78, 0xf0, 0x60, 0xba, 0x38, 0x3d, 0x8d, 0xf7, 0x48, 0xc3, 0xc3, 0x9f, 0xa6, 0x14, 0x6c, 0x4f, 0x1f, 0x40, 0x9d, 0x2e, 0x52, 0xc6, 0xfd, 0x20, 0xed, 0xe3, 0x73, 0x5b, 0xa3, 0xed, 0x6b, 0xd8, 0x7e, 0x85, 0xdf, 0xff, 0x22, 0xf8, 0x81, 0x87, 0xdf, 0xb0, 0x18, 0xd8, 0xbe, 0xdf, 0x00, 0xfb, 0xd7, 0x64, 0x45, 0x7f, 0x50, 0xf8, 0x10, 0x06, 0x56, 0x9c, 0x0f, 0xe0, 0xb8, 0x0e, 0x0f, 0xfb, 0x40, 0x10, 0x1e, 0xf5, 0x81, 0x00, 0xdc, 0xe0, 0x03, 0x0a, 0x1e, 0xe7, 0x03, 0x38, 0x8e, 0xf0, 0x38, 0x1f, 0xc0, 0x71, 0x84, 0xc7, 0xf9, 0x00, 0x8e, 0x23, 0x3c, 0xce, 0x07, 0x70, 0xdc, 0x18, 0xbf, 0xbc, 0xa4, 0x73, 0x39, 0x76, 0xdf, 0x14, 0xbf, 0x00, 0x07, 0x7b, 0x42, 0xbd, 0x0f, 0xd5, 0x7a, 0x06, 0x65, 0xeb, 0x86, 0xf3, 0x82, 0xf5, 0x43, 0x2a, 0xe8, 0x5c, 0x91, 0xca, 0x08, 0xaf, 0xa0, 0xfe, 0x22, 0x96, 0x08, 0xfc, 0x3b, 0x2f, 0x7a, 0x73, 0x8a, 0x17, 0x2c, 0x8b, 0xd7, 0xef, 0x3f, 0x7e, 0xcc, 0xdb, 0x6f, 0xbd, 0x78, 0x54, 0xd4, 0x8b, 0x82, 0xeb, 0xf3, 0xb4, 0x62, 0x7d, 0xcc, 0x8b, 0x1f, 0xbf, 0xd8, 0xde, 0x67, 0xd1, 0xf8, 0xb5, 0x30, 0x66, 0xfb, 0x10, 0xbb, 0xdc, 0x07, 0xc2, 0xf1, 0xfb, 0x2c, 0x78, 0x38, 0x79, 0xfc, 0xd8, 0x3a, 0x2f, 0xe7, 0xe5, 0xbc, 0xfc, 0x98, 0x0a, 0x21, 0xa2, 0x42, 0x36, 0xa7, 0x84, 0xf1, 0xaa, 0x17, 0xca, 0x08, 0x80, 0xa0, 0x52, 0xcc, 0x0a, 0x38, 0x89, 0x85, 0x92, 0x2c, 0xc2, 0xe1, 0x62, 0x02, 0x17, 0xdb, 0x20, 0x01, 0xa0, 0xcd, 0x2c, 0x31, 0xce, 0x64, 0x3f, 0x80, 0x2f, 0xc6, 0x38, 0x5c, 0xce, 0x0d, 0xae, 0xcf, 0x04, 0x7d, 0xb5, 0x06, 0x23, 0x91, 0xf5, 0x91, 0x7f, 0x81, 0x6f, 0x89, 0xaa, 0x40, 0x90, 0xc4, 0xe3, 0xaa, 0xcf, 0x9e, 0x46, 0x1f, 0x2f, 0x62, 0x90, 0x8f, 0xaa, 0xb5, 0x19, 0xbf, 0x0f, 0x8a, 0xe7, 0xeb, 0xcc, 0xa4, 0x3f, 0x21, 0x13, 0x15, 0xba, 0xe3, 0xfa, 0x0b, 0xf3, 0x0f, 0xf3, 0x09, 0xe5, 0xd5, 0x88, 0xcf, 0x08, 0xa8, 0x9e, 0x79, 0x15, 0xfb, 0x01, 0xf3, 0x51, 0x82, 0x2c, 0x11, 0x68, 0x09, 0xb6, 0x94, 0x06, 0xe1, 0x1e, 0xdf, 0xca, 0x3e, 0x16, 0x35, 0xd8, 0x97, 0x89, 0xca, 0x6d, 0xc4, 0x0c, 0x4e, 0x42, 0xfd, 0x1a, 0xb1, 0xaf, 0x94, 0x91, 0x4a, 0xfb, 0x85, 0x77, 0x05, 0x12, 0x86, 0xfe, 0x63, 0x29, 0x1b, 0x9b, 0xfc, 0x87, 0xd3, 0x36, 0xe1, 0x87, 0xfc, 0x83, 0x46, 0xfd, 0xc3, 0xd4, 0x6a, 0x13, 0x40, 0x49, 0xa8, 0x5d, 0xfc, 0x43, 0x47, 0x66, 0x51, 0xff, 0x52, 0xf6, 0x95, 0x6d, 0x44, 0x7a, 0xae, 0x17, 0x03, 0x6f, 0x3a, 0x8f, 0x8c, 0x18, 0x71, 0x71, 0x71, 0xa9, 0x37, 0xc2, 0x63, 0xc8, 0x0a, 0xca, 0xaf, 0xfc, 0x49, 0xd9, 0x85, 0x46, 0xb6, 0x55, 0xb8, 0x2e, 0x15, 0x3e, 0x6e, 0x70, 0x1f, 0x0f, 0x9f, 0xc6, 0xe0, 0xeb, 0xfe, 0xab, 0x74, 0x1c, 0xa1, 0x4f, 0xa4, 0x7c, 0x44, 0xf2, 0x1b, 0x62, 0x9f, 0xc9, 0x38, 0x63, 0x51, 0xb0, 0xa7, 0x77, 0x69, 0x63, 0x6a, 0xd0, 0xaf, 0xe2, 0x4b, 0xd5, 0x88, 0xee, 0x64, 0x7e, 0x11, 0xbc, 0x58, 0x11, 0xff, 0xb4, 0x7c, 0x0f, 0x89, 0xfa, 0x1f, 0xf1, 0x69, 0xf0, 0x36, 0xa2, 0x1f, 0xac, 0x32, 0x7f, 0x51, 0xa1, 0xc3, 0xd8, 0xf8, 0x60, 0xc1, 0xfc, 0x45, 0x45, 0x0e, 0x51, 0x03, 0xc4, 0xbb, 0xa7, 0xda, 0x78, 0x8c, 0xda, 0x74, 0xf7, 0x53, 0x35, 0xce, 0x75, 0x68, 0x9c, 0x6b, 0x69, 0x7e, 0xa5, 0xe7, 0x2c, 0x3d, 0xbf, 0x25, 0xfa, 0x26, 0xb5, 0x64, 0xee, 0x95, 0xa1, 0xc7, 0x54, 0xbe, 0x35, 0x98, 0x96, 0x45, 0x4d, 0x0c, 0x99, 0x92, 0x40, 0xd6, 0x21, 0x4c, 0xbf, 0x64, 0x5f, 0xcf, 0xaf, 0xd0, 0xc5, 0xec, 0x65, 0x61, 0x1b, 0xc8, 0xaf, 0x32, 0xb6, 0x31, 0x43, 0x11, 0xe8, 0x10, 0xcf, 0x86, 0xc4, 0xd3, 0x3d, 0x97, 0x41, 0xf3, 0x8d, 0x60, 0x0c, 0x12, 0xc5, 0x3c, 0x97, 0x13, 0x97, 0x25, 0xba, 0x0b, 0x33, 0xe2, 0xc7, 0x9d, 0x7a, 0x8e, 0x11, 0x5f, 0x17, 0x84, 0x10, 0x22, 0xa9, 0x04, 0x5b, 0x39, 0xae, 0x3b, 0x0f, 0x15, 0x8c, 0x83, 0x20, 0x8c, 0xa7, 0x89, 0xf3, 0x72, 0x5e, 0xce, 0x7a, 0xe1, 0x47, 0x64, 0x83, 0xc1, 0xa0, 0x8f, 0x6f, 0xfa, 0x58, 0x78, 0xdb, 0xeb, 0xc9, 0x76, 0x20, 0xc1, 0x3d, 0x1d, 0xdc, 0xeb, 0x89, 0xe9, 0x03, 0xd1, 0xfa, 0xc5, 0x40, 0x27, 0x04, 0x8e, 0xd0, 0x39, 0xb7, 0xc0, 0x8f, 0xb7, 0xf4, 0x7b, 0x68, 0x48, 0xb0, 0x1b, 0x54, 0x34, 0x10, 0x8b, 0x96, 0x81, 0x56, 0x7a, 0x61, 0xa0, 0xf2, 0x13, 0xa4, 0x13, 0x83, 0xaf, 0xfc, 0xc4, 0x88, 0x7f, 0x6e, 0x81, 0x8f, 0x51, 0xfc, 0x1b, 0x2a, 0xf3, 0xcd, 0xda, 0x8b, 0xa9, 0x26, 0x7c, 0x0c, 0x70, 0x18, 0xeb, 0x0f, 0x4c, 0xf8, 0x78, 0xae, 0x34, 0xc0, 0xda, 0x8b, 0xc3, 0xef, 0x0f, 0x44, 0x65, 0x46, 0x7c, 0xc4, 0xe3, 0xf5, 0xd4, 0xf5, 0xa3, 0xf8, 0x83, 0x50, 0x35, 0xe0, 0x0f, 0xf4, 0x9a, 0xc8, 0xbf, 0x19, 0xdf, 0x93, 0xbd, 0x2f, 0x55, 0xa8, 0xe3, 0xeb, 0xb2, 0xe3, 0xfd, 0xe9, 0xf1, 0x07, 0xc1, 0x05, 0x71, 0x23, 0x2b, 0x63, 0x31, 0x01, 0xca, 0x9e, 0xb0, 0xe8, 0xc1, 0xcc, 0xc2, 0xf6, 0x36, 0xf3, 0xa2, 0xd9, 0x3a, 0xca, 0x8b, 0x94, 0x33, 0x16, 0x5f, 0xda, 0x38, 0x01, 0x9f, 0xf5, 0x93, 0xf0, 0x7b, 0xec, 0x07, 0xc3, 0xd7, 0xec, 0x14, 0x87, 0xaf, 0x6c, 0xfd, 0x83, 0xac, 0xdf, 0x4f, 0xc2, 0xef, 0x25, 0xe0, 0x87, 0x4b, 0x4f, 0xf0, 0xcc, 0x6b, 0xff, 0x09, 0x6a, 0x42, 0x5c, 0xfa, 0xf1, 0xf9, 0x14, 0xce, 0x61, 0x8a, 0x7f, 0x96, 0x9c, 0x07, 0x92, 0xf0, 0xfb, 0x49, 0xf8, 0xbd, 0x53, 0xf1, 0xfb, 0x83, 0x24, 0x7c, 0x2f, 0x7f, 0x7c, 0x84, 0xf5, 0x03, 0xf1, 0x6b, 0xc6, 0xf7, 0xe2, 0xff, 0x23, 0xf2, 0xdf, 0x4f, 0xc2, 0x57, 0x79, 0x40, 0xf7, 0xdd, 0x98, 0xe7, 0xa7, 0xee, 0x3b, 0xa7, 0xc6, 0xf6, 0xd3, 0xe4, 0x01, 0x16, 0xe7, 0x57, 0x41, 0x5e, 0x0c, 0x3e, 0xd5, 0x0f, 0xc5, 0x8f, 0x97, 0xaf, 0x23, 0xf8, 0x03, 0x2d, 0x5f, 0x9b, 0xf1, 0xfb, 0x2a, 0xfe, 0xfa, 0x46, 0x7c, 0x99, 0xe7, 0x7b, 0x89, 0xeb, 0x27, 0xe0, 0x47, 0xf3, 0x7d, 0x1c, 0x7e, 0x20, 0x0f, 0x84, 0xf1, 0xe3, 0xd7, 0xef, 0x0f, 0xb4, 0x1c, 0xd0, 0x37, 0xf1, 0xaf, 0x72, 0x40, 0xef, 0x29, 0x6c, 0xd9, 0x93, 0xb2, 0x7c, 0xe2, 0x6b, 0x9f, 0xb2, 0xf0, 0xeb, 0xc8, 0x7b, 0x2f, 0x43, 0xfd, 0x10, 0x2a, 0x7b, 0x19, 0xea, 0x87, 0xa2, 0x85, 0x81, 0x93, 0x13, 0x18, 0x3c, 0x51, 0x13, 0x1e, 0x5b, 0x27, 0x00, 0x78, 0x0f, 0x26, 0x9c, 0x30, 0x39, 0xe9, 0xe4, 0x31, 0xfe, 0x89, 0x5b, 0x9c, 0xaa, 0x55, 0x09, 0x3e, 0x2f, 0xe7, 0xe5, 0xbc, 0xfc, 0x9f, 0xde, 0xc4, 0x6b, 0xd5, 0xb2, 0xa2, 0xdf, 0x4f, 0xa8, 0x65, 0x25, 0x7d, 0xa9, 0xa7, 0xe2, 0x68, 0x3a, 0xd0, 0x86, 0xcf, 0x5f, 0x89, 0x3c, 0x86, 0xc3, 0x9b, 0xe8, 0xf1, 0xab, 0x7f, 0xee, 0x4a, 0x55, 0x3f, 0x74, 0x04, 0xc9, 0xf1, 0x89, 0x38, 0xbb, 0xa3, 0x24, 0x7a, 0xbe, 0x4c, 0x93, 0xe4, 0x53, 0x67, 0xba, 0x44, 0x3f, 0xae, 0x8b, 0x1c, 0x1f, 0x7b, 0x95, 0x1a, 0x8e, 0xdf, 0x09, 0x11, 0xc7, 0xfe, 0xfc, 0xd8, 0x8f, 0x98, 0x8f, 0xe8, 0x29, 0x8b, 0x3f, 0xc3, 0xd5, 0x3f, 0x65, 0xc4, 0xf1, 0x4b, 0x9f, 0xe0, 0x6d, 0x96, 0x92, 0xe8, 0xf9, 0xbd, 0x15, 0xd1, 0x5f, 0x94, 0x2e, 0x93, 0xa7, 0xa7, 0x2c, 0xfa, 0xf9, 0xc2, 0x3b, 0xdf, 0x55, 0x3e, 0x10, 0xfe, 0x3e, 0xc6, 0xbc, 0xef, 0x6b, 0x72, 0x4a, 0x04, 0x4e, 0xbc, 0xef, 0x6e, 0x84, 0xc6, 0xd3, 0x67, 0x54, 0xcd, 0xb5, 0x22, 0xf8, 0x4c, 0x5b, 0xc7, 0xf4, 0xf9, 0x45, 0xc1, 0x4d, 0xfc, 0xeb, 0xeb, 0x1b, 0x3e, 0xff, 0x49, 0x7c, 0x12, 0x68, 0xcd, 0x70, 0x61, 0x1c, 0xca, 0xe2, 0x75, 0x6e, 0xd2, 0x7f, 0x18, 0x1e, 0xb1, 0xaf, 0x66, 0x1b, 0x93, 0xff, 0xe9, 0xb6, 0x37, 0xf9, 0x40, 0x00, 0xcf, 0xf4, 0x79, 0x4b, 0x93, 0xdf, 0x18, 0xbf, 0xd2, 0x6f, 0xf9, 0xd9, 0xb7, 0x61, 0x0d, 0x25, 0x3f, 0xaf, 0x4c, 0xb4, 0x61, 0xfb, 0x0b, 0x98, 0xdf, 0x9a, 0xf1, 0xe3, 0xec, 0xa3, 0xd1, 0x37, 0xe0, 0xeb, 0xf6, 0x8f, 0xf3, 0xaf, 0x00, 0xdc, 0x20, 0x3f, 0x1f, 0xa7, 0x44, 0xb3, 0xa3, 0xee, 0x7e, 0x41, 0xd9, 0xc2, 0xf2, 0x51, 0xf5, 0xd1, 0x22, 0xd6, 0xff, 0x89, 0x67, 0x64, 0x66, 0xf0, 0x6f, 0x4e, 0x53, 0x7e, 0x53, 0xe0, 0x6d, 0x58, 0x7f, 0xe1, 0x1a, 0xa6, 0x4f, 0x25, 0x6f, 0x3c, 0x4f, 0x92, 0x48, 0xfe, 0xe3, 0xf4, 0x89, 0x9c, 0x43, 0x4d, 0xfc, 0x07, 0xf5, 0x9b, 0xa8, 0x7f, 0x16, 0x1f, 0x1f, 0x41, 0x7c, 0x92, 0x80, 0x1f, 0xd5, 0x1f, 0x53, 0xf9, 0x8f, 0x99, 0xfc, 0x83, 0x44, 0x95, 0x60, 0xb2, 0x4f, 0x1c, 0xff, 0x61, 0x18, 0x89, 0x3e, 0x3f, 0x08, 0xf1, 0x75, 0xc8, 0xa8, 0xd9, 0xfe, 0xba, 0x9c, 0xc1, 0xf8, 0x25, 0xa2, 0xea, 0x7c, 0x86, 0xed, 0xaf, 0xe5, 0x96, 0xc8, 0x67, 0x34, 0x16, 0x7a, 0xbe, 0x24, 0x7c, 0x5e, 0xf4, 0x6f, 0xa2, 0xcf, 0x04, 0xef, 0xf9, 0x43, 0x62, 0x3e, 0xdf, 0x3e, 0xe1, 0x37, 0xa5, 0xb0, 0xff, 0x1a, 0x96, 0x34, 0xe2, 0x60, 0xee, 0x16, 0xf9, 0xdb, 0xe0, 0xbf, 0x21, 0x1f, 0x30, 0xe1, 0x33, 0xf5, 0x09, 0x98, 0x45, 0x13, 0x64, 0x12, 0xfd, 0xe0, 0x33, 0xca, 0x90, 0x03, 0x71, 0x4f, 0x41, 0xe4, 0xde, 0xc2, 0xf8, 0xfc, 0x93, 0x39, 0x4e, 0xc6, 0x91, 0x15, 0x8a, 0x51, 0x66, 0xc8, 0x41, 0x11, 0x01, 0xad, 0x78, 0xff, 0x0c, 0x27, 0x7f, 0x62, 0xa2, 0xaf, 0xe7, 0x47, 0x83, 0x7d, 0xf5, 0x6a, 0x19, 0xe4, 0x57, 0xcf, 0x46, 0x1e, 0xff, 0xc4, 0x00, 0x4f, 0xe2, 0x3f, 0x14, 0xc3, 0xa6, 0x67, 0xc8, 0xe9, 0x39, 0x20, 0x64, 0x1f, 0x1a, 0xf3, 0x0c, 0x30, 0xa8, 0x47, 0xb7, 0xbf, 0x31, 0xfe, 0xc3, 0xb6, 0x33, 0xc9, 0x9f, 0x10, 0xff, 0xe1, 0x18, 0x36, 0xf9, 0x72, 0x20, 0x07, 0x50, 0x93, 0x7e, 0x89, 0xf7, 0x0d, 0xdd, 0x04, 0x0f, 0xcb, 0x4e, 0x93, 0x72, 0x40, 0x4c, 0xfc, 0xd3, 0x98, 0xf8, 0xb7, 0x88, 0xa1, 0x9a, 0xe2, 0x9f, 0xc5, 0xc4, 0xbf, 0xf8, 0xe0, 0x6c, 0x3d, 0x9b, 0x5f, 0xcb, 0x9e, 0x97, 0xf3, 0x72, 0x5e, 0xce, 0x4b, 0x70, 0x7f, 0x40, 0xb5, 0xd7, 0x12, 0x1a, 0x4d, 0x3d, 0x16, 0x49, 0xd8, 0x3f, 0x10, 0xe2, 0xfd, 0x84, 0xd2, 0x6b, 0x23, 0xf9, 0x5f, 0x6f, 0x0d, 0xe9, 0x31, 0xf0, 0xee, 0x4a, 0x62, 0x8e, 0x27, 0xd4, 0x4f, 0x73, 0x88, 0x99, 0xff, 0x78, 0x06, 0x43, 0x32, 0x12, 0xf3, 0xfe, 0x8c, 0x5a, 0xe6, 0xf7, 0x67, 0x25, 0xa3, 0x3a, 0x87, 0x88, 0xd3, 0x21, 0x3b, 0xed, 0x1c, 0x22, 0x74, 0x1c, 0x61, 0x45, 0xb7, 0x39, 0x4f, 0x6c, 0x2f, 0x2b, 0xfe, 0x08, 0xc0, 0x78, 0x66, 0xa0, 0xff, 0xb4, 0x89, 0x99, 0x78, 0xd7, 0xe4, 0x37, 0x3d, 0xde, 0x74, 0xfa, 0x49, 0x70, 0xcb, 0x40, 0x9f, 0x68, 0xbe, 0x61, 0x7a, 0xfe, 0x31, 0xa2, 0x3d, 0x36, 0x89, 0x79, 0xfb, 0x45, 0xac, 0xa0, 0x8f, 0x45, 0xf4, 0x46, 0x82, 0xc7, 0x3c, 0x11, 0xfa, 0x24, 0x19, 0x3f, 0x89, 0x3f, 0x2b, 0x21, 0x36, 0x4c, 0xf0, 0x84, 0xe3, 0x99, 0xd8, 0xbd, 0xb8, 0xe2, 0x89, 0x19, 0xf7, 0x36, 0x89, 0x3f, 0x4f, 0x0c, 0xc8, 0x6f, 0xe2, 0x91, 0xea, 0xf2, 0x5b, 0xe6, 0xf8, 0xd1, 0xf5, 0x43, 0x4c, 0xdb, 0x1b, 0x12, 0x6c, 0x4d, 0xf6, 0xf1, 0x8e, 0xd7, 0x62, 0xf0, 0xe3, 0xfc, 0x4f, 0xb7, 0xbf, 0xd1, 0xbf, 0x42, 0x70, 0x12, 0xb7, 0x7e, 0x4c, 0x7e, 0x20, 0xe4, 0x14, 0xf9, 0x42, 0xf9, 0x21, 0xce, 0xbf, 0xac, 0xe0, 0x4f, 0x03, 0xa3, 0xf4, 0x63, 0x72, 0x65, 0x78, 0xeb, 0x67, 0xa2, 0xcf, 0x42, 0x31, 0x9a, 0xa4, 0x3f, 0x12, 0x63, 0x3f, 0x12, 0xc3, 0x5f, 0xc0, 0x7e, 0x26, 0xfd, 0x85, 0x74, 0x14, 0x67, 0x3f, 0xa6, 0xc9, 0x68, 0xd2, 0x7f, 0x5c, 0xfc, 0x87, 0xf5, 0x1b, 0xa7, 0xbf, 0xd3, 0xec, 0x47, 0x4e, 0xd1, 0xbf, 0xc7, 0x63, 0x0c, 0x3e, 0x8d, 0xb3, 0x8f, 0x06, 0x37, 0xf1, 0x17, 0xce, 0x2f, 0xcc, 0x74, 0xfe, 0xa7, 0xcb, 0x77, 0x4a, 0x0c, 0x9b, 0x8e, 0xdf, 0x03, 0xfe, 0x17, 0x63, 0x9f, 0x27, 0x3e, 0xce, 0x27, 0xd6, 0x53, 0xbf, 0xff, 0xb3, 0x50, 0x9e, 0x08, 0xf3, 0xce, 0xac, 0xf8, 0xf8, 0x0d, 0xe7, 0x00, 0x1a, 0xf3, 0xf3, 0xf0, 0x38, 0xfb, 0x06, 0x72, 0x54, 0x1c, 0x7e, 0xc8, 0x8f, 0xac, 0x84, 0x1c, 0x17, 0x3e, 0x23, 0x25, 0x86, 0x18, 0x8a, 0xcb, 0xdd, 0x46, 0xfa, 0x24, 0x18, 0xc8, 0xc4, 0x40, 0x9f, 0x68, 0x47, 0x47, 0xa6, 0xf8, 0x4d, 0xca, 0x2f, 0xa6, 0x1c, 0x60, 0x59, 0xc9, 0x39, 0xc0, 0x4a, 0x88, 0x61, 0x6a, 0x25, 0xe3, 0xb3, 0xb8, 0x1c, 0xaa, 0xdb, 0xc7, 0x10, 0x23, 0x2c, 0xfe, 0xf1, 0xe8, 0x1f, 0x3f, 0xc7, 0xed, 0x2f, 0x48, 0xfc, 0xfe, 0x2b, 0x1c, 0xc3, 0xf4, 0x34, 0xb8, 0x15, 0x0f, 0x37, 0xc5, 0x7f, 0x78, 0xff, 0x46, 0x12, 0xe8, 0xc7, 0x7d, 0x9f, 0x51, 0x79, 0x31, 0x29, 0xfe, 0x59, 0x4c, 0xfc, 0x53, 0x83, 0x8f, 0x19, 0xfd, 0x83, 0x98, 0xe3, 0xdf, 0xd3, 0xef, 0xf3, 0xb9, 0x97, 0x2d, 0x7a, 0xcf, 0x74, 0x7d, 0xf7, 0x7b, 0xa6, 0xeb, 0x2c, 0xbc, 0x9c, 0xb0, 0x6f, 0x98, 0xae, 0xfe, 0x23, 0xd3, 0x75, 0x26, 0x5e, 0xc6, 0xfe, 0x9f, 0xd9, 0xf7, 0x9b, 0xef, 0x87, 0x2f, 0xb4, 0xef, 0xc9, 0x07, 0xe1, 0xeb, 0xdc, 0xbe, 0x67, 0xc5, 0xbe, 0x78, 0x45, 0xed, 0x8b, 0xd7, 0xb9, 0x7d, 0xcf, 0xed, 0xfb, 0x71, 0x2f, 0xc7, 0x06, 0xf3, 0xf6, 0xee, 0x1d, 0x1b, 0xcc, 0x3b, 0x38, 0x13, 0xf6, 0x3d, 0x36, 0x98, 0xf7, 0x3b, 0x0f, 0x8f, 0x0d, 0xe6, 0xfd, 0xf0, 0xe1, 0x59, 0x90, 0xf7, 0xeb, 0x7f, 0x10, 0x35, 0xf0, 0xd1, 0xc3, 0x7f, 0xfc, 0xa7, 0xa8, 0x81, 0x8f, 0xce, 0x84, 0xbc, 0x7f, 0xfe, 0x17, 0xa6, 0xf8, 0xfd, 0xef, 0xff, 0x39, 0xb3, 0xf9, 0xb9, 0x77, 0x8f, 0xff, 0xc9, 0x72, 0xef, 0x98, 0x17, 0x08, 0x56, 0xfe, 0x27, 0xcb, 0xf7, 0xc4, 0xe8, 0x99, 0xc8, 0xcf, 0xef, 0xbd, 0xcf, 0xff, 0x64, 0x79, 0xff, 0xf8, 0xf8, 0xfe, 0x83, 0xe3, 0xe3, 0x93, 0x7f, 0xfe, 0x80, 0xff, 0xc9, 0xf2, 0xc1, 0xf1, 0xf1, 0x5f, 0xfe, 0xd5, 0xd9, 0x90, 0xf7, 0x38, 0x52, 0xfe, 0xf0, 0x5b, 0xc7, 0x86, 0xf2, 0x2f, 0xdf, 0x3f, 0x23, 0xf2, 0xbe, 0xfb, 0xab, 0x01, 0xb9, 0xbe, 0xf2, 0xd5, 0xdf, 0xfd, 0xbd, 0xdf, 0xff, 0xda, 0xf1, 0xaf, 0xfd, 0x7a, 0x60, 0xf4, 0x6f, 0xff, 0xee, 0xaf, 0xff, 0xe6, 0xef, 0xff, 0xe1, 0x4c, 0xc8, 0xfb, 0x9b, 0xbf, 0x15, 0x90, 0xec, 0x8f, 0xff, 0xe4, 0xdb, 0x7f, 0xf4, 0xa7, 0x7f, 0x76, 0xfc, 0xdb, 0xbf, 0x13, 0x18, 0xfd, 0xf7, 0xff, 0xf8, 0xd7, 0x7f, 0xfb, 0xcf, 0xff, 0x1a, 0xba, 0x67, 0x59, 0x9f, 0xe4, 0xd7, 0xcb, 0x43, 0x78, 0xfd, 0x24, 0xbf, 0xf8, 0xbd, 0xf5, 0x24, 0x17, 0xff, 0xdf, 0xb1, 0xac, 0x0b, 0x78, 0x3d, 0x0f, 0xd7, 0x0b, 0x70, 0x91, 0x0b, 0x64, 0xc8, 0x0a, 0x5e, 0x24, 0x74, 0xe9, 0x14, 0x2e, 0x00, 0x89, 0x5f, 0xb2, 0x5e, 0xb2, 0x5e, 0x7a, 0xee, 0xa5, 0xe7, 0x9e, 0x6c, 0xcd, 0xf0, 0xf5, 0xfc, 0x27, 0xbf, 0xf1, 0x8a, 0xb5, 0x36, 0x5f, 0x5e, 0x2c, 0x97, 0x52, 0x6f, 0xa7, 0x86, 0x66, 0x97, 0xe7, 0xca, 0x76, 0x29, 0x35, 0x04, 0xb7, 0x43, 0x6f, 0x5c, 0xb5, 0xb1, 0x94, 0x26, 0x2f, 0xe6, 0xa0, 0x77, 0x45, 0xf5, 0x0a, 0xd8, 0x5b, 0x5d, 0x5b, 0x59, 0x58, 0xba, 0x6a, 0x97, 0xa6, 0xb0, 0xb3, 0x74, 0x63, 0xf1, 0x8d, 0xf2, 0x0a, 0x80, 0x26, 0xb1, 0xf7, 0x99, 0xf2, 0xe7, 0x6e, 0x2e, 0xaf, 0xcc, 0x95, 0x8a, 0xd8, 0x99, 0xb9, 0xbe, 0xc0, 0xb1, 0x38, 0x89, 0xd9, 0xe5, 0xc5, 0xc5, 0xf2, 0xd2, 0x5a, 0x69, 0x92, 0x63, 0xad, 0x2e, 0x5c, 0x5d, 0xe2, 0x04, 0xf9, 0xc4, 0xd5, 0xf2, 0xb5, 0xf2, 0xec, 0x9a, 0x2d, 0x61, 0xb3, 0x37, 0x56, 0x56, 0x97, 0x81, 0xa2, 0x58, 0x6b, 0x7e, 0x66, 0x6e, 0xf9, 0xa6, 0x5d, 0xea, 0xb8, 0x7b, 0x0e, 0xa7, 0x79, 0x6d, 0x6d, 0xfd, 0xca, 0x32, 0xd0, 0xa9, 0x55, 0x1a, 0x6d, 0x3e, 0xb2, 0x38, 0xb3, 0x36, 0x3b, 0xbf, 0x3e, 0x57, 0xbe, 0xb6, 0xb0, 0xb8, 0xb0, 0x56, 0x5e, 0x59, 0x55, 0x53, 0x6f, 0xe7, 0x52, 0xa9, 0xa1, 0xab, 0x33, 0x8b, 0xe5, 0xeb, 0x33, 0x73, 0x52, 0xa8, 0xb5, 0xe5, 0x1b, 0xb3, 0xf3, 0x70, 0xcf, 0x3b, 0x40, 0xea, 0xfa, 0xfc, 0x4c, 0x69, 0xf2, 0xf5, 0x09, 0xa4, 0x72, 0x5b, 0x60, 0xdc, 0x4e, 0xa5, 0x66, 0xe7, 0xcb, 0xb3, 0x9f, 0x59, 0x5f, 0x2a, 0xdf, 0x5c, 0x7f, 0x13, 0xa8, 0x2d, 0x2c, 0x2f, 0x71, 0x82, 0xa9, 0xd5, 0xe5, 0x2b, 0x6b, 0x37, 0x67, 0x56, 0xca, 0xeb, 0x2b, 0xe5, 0xa5, 0xb9, 0x32, 0x2a, 0x40, 0xb0, 0x90, 0xba, 0xb1, 0xb0, 0xbe, 0x3a, 0x3b, 0x73, 0xad, 0x5c, 0x9a, 0x4a, 0x5d, 0x5d, 0xb8, 0xb2, 0x7e, 0xad, 0xbc, 0x74, 0x75, 0x6d, 0xbe, 0x54, 0x98, 0xb0, 0xc7, 0xc6, 0xec, 0x7a, 0xd3, 0x6e, 0x3b, 0xd5, 0x56, 0x73, 0xb3, 0xcd, 0x61, 0x62, 0x5e, 0x31, 0x95, 0x1a, 0x8b, 0x2f, 0xa9, 0xda, 0x5e, 0xb3, 0xda, 0xa9, 0xb7, 0x9a, 0xf6, 0xda, 0xc2, 0x6c, 0x26, 0x9b, 0x1a, 0xaa, 0x36, 0xda, 0xd8, 0x34, 0x5a, 0xd5, 0x4a, 0xc3, 0x6e, 0x54, 0x36, 0x9c, 0x46, 0x29, 0xbd, 0xb6, 0x5d, 0x6f, 0xdb, 0xf0, 0xd7, 0x3e, 0x68, 0x77, 0x9c, 0x1d, 0x1b, 0x56, 0xa8, 0xd5, 0xb7, 0xf6, 0xdc, 0x0a, 0xc7, 0xab, 0x56, 0xdc, 0x8e, 0x5b, 0xdf, 0xdc, 0x72, 0xd2, 0x0a, 0xab, 0x5d, 0x7f, 0xcb, 0x29, 0xed, 0xba, 0xf5, 0x66, 0x27, 0xc3, 0x09, 0xe4, 0x26, 0x72, 0x63, 0x97, 0x80, 0xa6, 0x3e, 0x94, 0x29, 0x4c, 0x4d, 0x8c, 0xe1, 0xc4, 0xec, 0xf8, 0x78, 0x21, 0x97, 0x99, 0x2c, 0x5e, 0x82, 0x29, 0x70, 0x9b, 0x4d, 0x39, 0xcd, 0x4d, 0xd0, 0xca, 0xca, 0xda, 0x3a, 0xda, 0xa2, 0xbc, 0xc2, 0x5d, 0x05, 0x54, 0xb3, 0x56, 0xfe, 0x6c, 0xe9, 0xf3, 0x9f, 0x07, 0xd5, 0xbd, 0x76, 0xcb, 0x71, 0xdb, 0xb8, 0xf0, 0xe4, 0xe4, 0x04, 0x74, 0x2b, 0x1d, 0x58, 0x7d, 0x63, 0xaf, 0xe3, 0xd8, 0xb7, 0x9c, 0x6a, 0xd1, 0xde, 0xda, 0xdd, 0x5b, 0x7f, 0xd3, 0x71, 0x3b, 0xce, 0xfe, 0xe5, 0x30, 0xb0, 0xc0, 0x81, 0x6b, 0xce, 0xfe, 0x6c, 0xab, 0xe5, 0x6e, 0x46, 0xc0, 0x53, 0x1c, 0x3c, 0xdb, 0x6a, 0xb4, 0x5c, 0x84, 0xed, 0x35, 0xeb, 0xb5, 0x96, 0xbb, 0x63, 0xef, 0x54, 0x3a, 0x02, 0xb2, 0xd8, 0xda, 0x74, 0x1a, 0x6f, 0xd6, 0x9d, 0xee, 0x75, 0xb7, 0xf5, 0x0b, 0x0e, 0xd7, 0xd9, 0x62, 0x05, 0xf0, 0xf9, 0x42, 0xb7, 0x2a, 0xee, 0x41, 0xbd, 0xb9, 0x25, 0xe8, 0x54, 0x15, 0x0d, 0x6d, 0xb4, 0x60, 0x77, 0xb4, 0x85, 0x6f, 0xb5, 0xea, 0x9b, 0x40, 0xb9, 0xde, 0xcc, 0xe0, 0x5d, 0x56, 0xb9, 0x08, 0x47, 0xb4, 0x4b, 0x41, 0x46, 0x86, 0x14, 0x22, 0x00, 0x90, 0x50, 0x46, 0x97, 0x22, 0xcb, 0x67, 0x6c, 0x35, 0xd6, 0xaf, 0xb7, 0xda, 0x75, 0x6e, 0x8e, 0x52, 0x32, 0xb3, 0xf6, 0x08, 0xe7, 0x31, 0xe3, 0xeb, 0x29, 0x67, 0x4f, 0xe6, 0x27, 0x38, 0x9d, 0xdb, 0xa9, 0xa1, 0x2f, 0x7c, 0x01, 0x1c, 0xf3, 0xfa, 0xc2, 0x67, 0xcb, 0xd7, 0x8c, 0xca, 0x1e, 0x1f, 0xdf, 0x75, 0x9d, 0x6a, 0x9d, 0x8f, 0x6c, 0xd7, 0xb7, 0xb6, 0x77, 0xed, 0x5a, 0xa3, 0x55, 0xe9, 0x24, 0xca, 0xaa, 0x14, 0xd9, 0xae, 0xec, 0xec, 0x36, 0x1c, 0xb7, 0x30, 0x67, 0xb7, 0x5b, 0x7b, 0x6e, 0xd5, 0xd1, 0x61, 0x9c, 0x8a, 0xdd, 0x71, 0xb7, 0xd6, 0xf7, 0xcd, 0xc3, 0x07, 0xe6, 0xe1, 0xae, 0x79, 0x78, 0x3b, 0x3a, 0xdc, 0xae, 0xba, 0xa6, 0xd9, 0x38, 0x0c, 0xb3, 0xb9, 0x68, 0x76, 0x79, 0x67, 0xaf, 0x51, 0xe9, 0x38, 0x9b, 0x10, 0x47, 0xbb, 0x7b, 0x1d, 0xdb, 0x75, 0xda, 0xad, 0xc6, 0x1e, 0xaa, 0x2e, 0x8f, 0xf2, 0xa1, 0x5c, 0x30, 0x54, 0xe2, 0x36, 0x28, 0x5c, 0xbc, 0x94, 0x9f, 0xc8, 0x4d, 0x4e, 0x4d, 0x71, 0xd5, 0x09, 0xf4, 0xf9, 0x8a, 0xbb, 0xd9, 0x74, 0xda, 0x6d, 0xbb, 0x55, 0x03, 0xba, 0x95, 0x66, 0xa3, 0xde, 0x74, 0xf2, 0x02, 0x64, 0x8f, 0xbd, 0x9e, 0x9f, 0x00, 0xd3, 0xb4, 0x5b, 0xb5, 0x8e, 0x18, 0x19, 0x9b, 0xbc, 0xc4, 0x47, 0x76, 0x9c, 0xcd, 0xfa, 0xde, 0x0e, 0x8c, 0x09, 0x7e, 0xb6, 0x81, 0xc6, 0x2a, 0xe0, 0x96, 0x10, 0xc1, 0x44, 0x78, 0xb7, 0xbe, 0xef, 0x34, 0xda, 0x3c, 0xd2, 0x83, 0x4b, 0x8c, 0x15, 0xc2, 0x2b, 0x4c, 0xf1, 0x01, 0xa4, 0x18, 0x20, 0x7f, 0xbd, 0xbe, 0x5f, 0x1a, 0x2b, 0xfa, 0xd4, 0xe7, 0xea, 0xed, 0xdd, 0x46, 0xe5, 0xc0, 0xee, 0x56, 0xdc, 0x5d, 0x49, 0x6b, 0x82, 0x63, 0x36, 0x5b, 0x4d, 0x47, 0xf4, 0xc1, 0x41, 0xc6, 0x85, 0x00, 0xce, 0x7e, 0xc7, 0x75, 0x76, 0x1c, 0xa5, 0x0f, 0xc4, 0x11, 0x0a, 0xc1, 0x29, 0x97, 0xa6, 0x50, 0x27, 0x70, 0x33, 0xf5, 0x3a, 0xaa, 0xc5, 0x96, 0x0b, 0xcc, 0xec, 0xb4, 0xf6, 0x9a, 0x1d, 0xae, 0x95, 0xed, 0xca, 0x66, 0xab, 0x0b, 0x8e, 0xdf, 0xfe, 0x62, 0xde, 0xe3, 0x09, 0x7b, 0x73, 0x15, 0xf7, 0x8b, 0xa5, 0x89, 0xfc, 0xc5, 0xcb, 0x81, 0xd1, 0x6b, 0xe0, 0x61, 0x9d, 0xd2, 0x24, 0x0e, 0x73, 0x4a, 0x63, 0xcf, 0xa8, 0x48, 0xbe, 0xda, 0x2b, 0x57, 0xdf, 0xb0, 0x3b, 0x2d, 0xfb, 0x1a, 0x28, 0xb1, 0xe2, 0x4a, 0xd1, 0x67, 0xda, 0xed, 0x3d, 0x74, 0xe3, 0xbd, 0x36, 0xfe, 0x2b, 0xa6, 0x1c, 0xec, 0x82, 0x4f, 0x80, 0x4b, 0x77, 0xf6, 0xc0, 0xfe, 0x76, 0x07, 0x93, 0x61, 0x7b, 0xbb, 0xb5, 0xd7, 0xd8, 0x04, 0x15, 0x75, 0xec, 0x0d, 0xc7, 0x6e, 0x3a, 0xce, 0xa6, 0xb3, 0xe9, 0x8b, 0xb4, 0xd6, 0x12, 0x34, 0x27, 0x33, 0xa2, 0x5f, 0xcd, 0xbe, 0xed, 0x3a, 0x80, 0xdd, 0xcc, 0x54, 0xa7, 0x41, 0xcc, 0x89, 0xa9, 0x89, 0xa9, 0x8b, 0xd9, 0x4f, 0x57, 0xc7, 0x27, 0x0b, 0xf9, 0x9f, 0x2d, 0xfc, 0xdc, 0x6e, 0xab, 0x9b, 0xc9, 0x54, 0x47, 0x61, 0xfc, 0xe2, 0xc5, 0xec, 0xf8, 0x24, 0x36, 0xb9, 0x42, 0x7e, 0x2a, 0x7b, 0xf9, 0xb6, 0x50, 0x73, 0xd1, 0xa3, 0x97, 0xe1, 0x3d, 0x8f, 0x1a, 0xcf, 0x78, 0x19, 0x7f, 0xb1, 0x6a, 0xde, 0xcd, 0xe6, 0xf4, 0xee, 0x56, 0xb0, 0xbb, 0x91, 0x45, 0x9a, 0x42, 0x4e, 0x31, 0x8a, 0xe2, 0xa3, 0x8c, 0xcf, 0x56, 0xf8, 0x55, 0x77, 0x6b, 0xc3, 0x24, 0x3a, 0x48, 0x38, 0x51, 0x9c, 0x2c, 0x4e, 0xbc, 0xfe, 0xe9, 0xea, 0x88, 0x10, 0x9d, 0x0b, 0x3b, 0x82, 0x0a, 0xa8, 0xe6, 0x26, 0xf2, 0x53, 0x93, 0x97, 0x2e, 0x5d, 0xca, 0x8e, 0x09, 0x45, 0xe8, 0xd2, 0x23, 0xc1, 0x18, 0xd9, 0xc5, 0x5a, 0x52, 0x72, 0xd5, 0xd9, 0xd2, 0x3b, 0xba, 0xd4, 0x4b, 0x20, 0xb3, 0xd3, 0xee, 0xd8, 0x8e, 0x8a, 0x74, 0x91, 0x94, 0xec, 0xad, 0xfa, 0x2d, 0xa7, 0x29, 0x52, 0x02, 0x4a, 0xbe, 0xdb, 0x82, 0x07, 0x15, 0xfc, 0x2b, 0x53, 0x6a, 0xa5, 0xc9, 0x35, 0xe0, 0x34, 0xc0, 0x87, 0x6b, 0x6d, 0xa7, 0xa3, 0xb4, 0xd5, 0x68, 0xb7, 0xec, 0xb7, 0x1c, 0xb7, 0xf5, 0x33, 0x18, 0x99, 0x18, 0xf3, 0xae, 0xe3, 0xa8, 0x5c, 0x51, 0xb4, 0xaf, 0x38, 0x9d, 0xea, 0x76, 0x86, 0x87, 0x09, 0x50, 0xca, 0xf1, 0x1b, 0x98, 0x96, 0xe5, 0x99, 0x1e, 0x46, 0x4a, 0xa8, 0xa1, 0x96, 0x9b, 0x81, 0xdb, 0x11, 0x60, 0x6a, 0x14, 0x61, 0xa3, 0x3c, 0x96, 0x20, 0x10, 0x40, 0x1b, 0x17, 0xb3, 0xd9, 0x71, 0x18, 0xe7, 0x09, 0x5e, 0xca, 0xec, 0xf9, 0xc1, 0x64, 0xbe, 0x00, 0x89, 0x5c, 0x5a, 0xa5, 0x30, 0x97, 0x11, 0x19, 0x35, 0x07, 0xa4, 0xf2, 0xfb, 0x07, 0x39, 0x9e, 0x5b, 0xb2, 0x79, 0x90, 0xdf, 0x97, 0x1c, 0xa2, 0xbc, 0x53, 0x69, 0x56, 0x1d, 0xcc, 0x1c, 0x9e, 0xf4, 0x32, 0x99, 0x80, 0x13, 0x34, 0xa5, 0x62, 0xb8, 0x98, 0x5e, 0xba, 0x43, 0x24, 0x4f, 0x82, 0xec, 0xdb, 0xc8, 0xb4, 0xe4, 0xf6, 0xb2, 0xe4, 0x68, 0x2c, 0x83, 0xfc, 0x8f, 0x79, 0x92, 0x64, 0xb3, 0x63, 0x4a, 0x84, 0xac, 0x30, 0xe1, 0xd0, 0x90, 0xcc, 0x21, 0x73, 0xf6, 0xd5, 0xca, 0x5e, 0xbb, 0x5d, 0xaf, 0x34, 0x7d, 0x5f, 0xc1, 0x11, 0xe9, 0x28, 0xa8, 0x23, 0x95, 0x93, 0x2b, 0x0d, 0xc7, 0xb3, 0xb3, 0xb3, 0xbf, 0x5b, 0xc8, 0xf0, 0xa1, 0x11, 0x5c, 0x1b, 0xd7, 0xf0, 0x84, 0x2a, 0x8e, 0x75, 0x2a, 0xbb, 0x1e, 0x59, 0xbb, 0x56, 0x6f, 0x74, 0x1c, 0xd7, 0xae, 0x34, 0x5a, 0x60, 0xc3, 0xed, 0x96, 0xfb, 0x96, 0xad, 0xf2, 0x23, 0x37, 0xc8, 0x3c, 0x8c, 0x14, 0x7d, 0x83, 0x88, 0xc5, 0x3c, 0x8b, 0xf0, 0x29, 0x1b, 0x25, 0x61, 0x35, 0x65, 0xb0, 0xcc, 0x18, 0x78, 0x68, 0x0e, 0xe7, 0x88, 0x07, 0xad, 0xf0, 0xc1, 0xf0, 0x24, 0xcc, 0x97, 0xe1, 0x49, 0x9b, 0x91, 0x49, 0x41, 0x4a, 0x62, 0xf5, 0xcd, 0x76, 0xa7, 0xc4, 0x95, 0x8c, 0x62, 0xe5, 0xf9, 0xb3, 0x0f, 0xe5, 0x9a, 0x6d, 0x35, 0xe1, 0xb9, 0x0b, 0x60, 0x65, 0x34, 0xb0, 0x50, 0xd7, 0xc1, 0x6c, 0x98, 0xf7, 0x71, 0xb9, 0x4e, 0x4a, 0x32, 0xa3, 0x6b, 0x34, 0xbb, 0x1b, 0x25, 0xae, 0x56, 0xa0, 0xcd, 0xb9, 0x17, 0xea, 0xd4, 0x27, 0x54, 0xbd, 0x09, 0x98, 0x74, 0x0c, 0x13, 0x36, 0xfd, 0x09, 0x21, 0x0a, 0xc0, 0xdc, 0x8a, 0xb0, 0x8b, 0x50, 0xb6, 0x17, 0x42, 0x79, 0xcd, 0x4d, 0x33, 0x1b, 0x23, 0xdd, 0x8d, 0xd1, 0xea, 0x48, 0xb7, 0x3a, 0xba, 0x39, 0xd2, 0xdd, 0xcc, 0x8e, 0x67, 0xa0, 0x0b, 0x1d, 0xb8, 0xf5, 0x4c, 0x77, 0xf1, 0xa9, 0x4d, 0x77, 0x31, 0xd9, 0x74, 0x95, 0x88, 0xe9, 0x0a, 0x51, 0xab, 0xfc, 0xe8, 0xec, 0xcb, 0x27, 0x39, 0x91, 0x49, 0x85, 0x1f, 0x95, 0x13, 0x54, 0x7c, 0x27, 0x28, 0x18, 0x6d, 0xfc, 0xc3, 0xf4, 0x12, 0x39, 0xc1, 0xf1, 0x27, 0x14, 0x3e, 0x8a, 0x1b, 0x55, 0x46, 0xba, 0x95, 0xd1, 0xa0, 0x2f, 0x8d, 0x3a, 0x23, 0x5d, 0x07, 0x1d, 0xaa, 0x32, 0xaa, 0x7c, 0x6a, 0x14, 0x06, 0x3c, 0xb7, 0x92, 0x54, 0xd5, 0xde, 0x48, 0x53, 0x98, 0xe0, 0x09, 0xf7, 0x56, 0xb1, 0x7e, 0x64, 0x32, 0xc7, 0x81, 0x9e, 0x7f, 0x3d, 0x71, 0x00, 0x25, 0xa7, 0xb6, 0x6a, 0xfe, 0xe2, 0x33, 0x8d, 0x06, 0xec, 0x6e, 0xbc, 0x54, 0xba, 0x0d, 0x8f, 0x03, 0xee, 0xc6, 0x3c, 0xc3, 0x3a, 0xb5, 0x1a, 0xec, 0xc3, 0x45, 0xca, 0xf5, 0xfc, 0x7a, 0xcd, 0xad, 0x6b, 0xf9, 0x55, 0xf3, 0x65, 0x91, 0xab, 0x90, 0xc7, 0x31, 0xb5, 0x3b, 0x57, 0x1e, 0x2c, 0x62, 0x01, 0x41, 0xe8, 0x97, 0x01, 0xbf, 0xf5, 0xb1, 0xbc, 0x3d, 0xbd, 0xef, 0x0f, 0x5c, 0xf4, 0x20, 0x45, 0xcf, 0x15, 0x3c, 0x98, 0x4f, 0xd2, 0xf3, 0x02, 0x1f, 0xe6, 0xe1, 0x49, 0x75, 0x04, 0xed, 0x13, 0x78, 0xd4, 0xb4, 0x5c, 0xfe, 0xe4, 0xd4, 0x76, 0xc2, 0x80, 0x8f, 0xcf, 0x51, 0x78, 0xbb, 0x13, 0xa3, 0xf8, 0xac, 0x84, 0x78, 0xdf, 0xdd, 0xae, 0x78, 0x8f, 0x9b, 0x9b, 0xb0, 0x9b, 0x0c, 0xa9, 0x43, 0x3d, 0x72, 0xc0, 0x7f, 0x90, 0xed, 0xcb, 0xf8, 0x82, 0x2f, 0xc7, 0x47, 0xbc, 0x8d, 0xe7, 0x28, 0xb2, 0x97, 0x3f, 0x18, 0xe1, 0xff, 0x66, 0x47, 0xf8, 0x46, 0x76, 0x3f, 0xe7, 0x01, 0xf6, 0x39, 0x60, 0x5f, 0x02, 0x0e, 0x02, 0x22, 0x20, 0x1d, 0x78, 0x56, 0x8d, 0xe2, 0xde, 0x53, 0xf1, 0xbf, 0x1a, 0xdc, 0xa5, 0x72, 0xdd, 0x2e, 0x42, 0x27, 0xca, 0x5a, 0x7e, 0x7f, 0xb4, 0x24, 0x96, 0xe6, 0xfb, 0x69, 0x65, 0x08, 0xc4, 0x2c, 0xf1, 0xfd, 0x89, 0xda, 0xdb, 0xe6, 0x22, 0x37, 0x82, 0x0b, 0x4e, 0xa3, 0x54, 0x73, 0x2b, 0xd5, 0x8e, 0x60, 0x75, 0xfc, 0x92, 0xd2, 0x71, 0xbd, 0x26, 0x46, 0x60, 0xd7, 0x54, 0x2c, 0x16, 0xb3, 0x9c, 0x1b, 0xb7, 0xe4, 0x6d, 0x8b, 0xf9, 0x1c, 0x78, 0x78, 0xc3, 0x03, 0xdd, 0x9f, 0x88, 0xdb, 0x27, 0x3e, 0x71, 0xcb, 0x34, 0x91, 0x43, 0x36, 0x42, 0x10, 0xa9, 0x07, 0x1c, 0xbc, 0x7c, 0x9b, 0x6b, 0x37, 0xf0, 0x7a, 0x9a, 0xb5, 0xb9, 0xac, 0xfe, 0x6b, 0x09, 0xec, 0xdb, 0x26, 0x64, 0x08, 0x7b, 0x1b, 0xf7, 0x20, 0x45, 0xae, 0x25, 0x48, 0x59, 0x6e, 0xa7, 0x04, 0xef, 0xa5, 0x57, 0xdc, 0xca, 0x16, 0x7f, 0x15, 0x84, 0x8d, 0x89, 0xd8, 0x1a, 0xf0, 0xb7, 0xbc, 0x9c, 0x78, 0xab, 0x13, 0xa2, 0xf2, 0xc9, 0xf9, 0x83, 0x12, 0x7f, 0x19, 0x1b, 0x93, 0x3d, 0xbe, 0xe7, 0x1f, 0x52, 0x2a, 0x2f, 0x71, 0xdf, 0xe0, 0xa0, 0x71, 0x8f, 0x4a, 0x57, 0x50, 0xd9, 0xce, 0x8a, 0x57, 0xb0, 0x21, 0x6f, 0x39, 0x78, 0x73, 0xc6, 0xdd, 0x4f, 0x09, 0xc3, 0x0b, 0xed, 0x35, 0xc2, 0xcd, 0x17, 0xe2, 0xc6, 0x7b, 0x75, 0xf6, 0x70, 0xc4, 0x0b, 0xf6, 0x94, 0xdc, 0x55, 0x66, 0xc2, 0xe4, 0xb2, 0xa1, 0x37, 0xe5, 0xd4, 0xed, 0xd4, 0xff, 0x02, 0xdc, 0x73, 0xf3, 0x71, \ No newline at end of file diff --git a/config.lua b/config.lua index ce88cb8b3..f3e87ae34 100644 --- a/config.lua +++ b/config.lua @@ -27,13 +27,10 @@ THEME= } CHECK_NEW_VERSION=true -GIF_LENGTH=20 -- in seconds SOFTWARE_RENDERING=false -VSYNC=true -CRT_MONITOR=false -GIF_SCALE=3 UI_SCALE=4 -VOLUME=12 +GIF_LENGTH=20 -- in seconds +GIF_SCALE=3 --------------------------- function TIC() diff --git a/src/studio/config.c b/src/studio/config.c index 49d752f59..2d75b53b5 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -192,11 +192,9 @@ static void readConfig(Config* config) readGlobalInteger(lua, "GIF_SCALE", &config->data.gifScale); readGlobalBool(lua, "CHECK_NEW_VERSION", &config->data.checkNewVersion); readGlobalInteger(lua, "UI_SCALE", &config->data.uiScale); - readGlobalInteger(lua, "VOLUME", &config->data.volume); - readGlobalBool(lua, "VSYNC", &config->data.vsync); readGlobalBool(lua, "SOFTWARE_RENDERING", &config->data.soft); + #if defined(CRT_SHADER_SUPPORT) - readGlobalBool(lua, "CRT_MONITOR", &config->data.crt); readConfigCrtShader(config, lua); #endif readTheme(config, lua); @@ -214,7 +212,6 @@ static void readConfig(Config* config) .uiScale = 4, .cart = config->cart, .theme.cursor = {-1, -1, -1, false}, - .volume = MAX_VOLUME, }; } @@ -230,8 +227,19 @@ static void update(Config* config, const u8* buffer, s32 size) static void setDefault(Config* config) { - memset(&config->data, 0, sizeof(StudioConfig)); - config->data.cart = config->cart; + config->data = (StudioConfig) + { + .cart = config->cart, + .menu = + { + .volume = MAX_VOLUME, + .vsync = true, + .fullscreen = false, +#if defined(CRT_SHADER_SUPPORT) + .crt = false, +#endif + }, + }; { static const u8 ConfigZip[] = @@ -277,6 +285,8 @@ static void save(Config* config) studioConfigChanged(); } +static const char MenuDatPath[] = TIC_LOCAL_VERSION "menu.dat"; + void initConfig(Config* config, tic_mem* tic, tic_fs* fs) { { @@ -289,22 +299,46 @@ void initConfig(Config* config, tic_mem* tic, tic_fs* fs) setDefault(config); - s32 size = 0; - u8* data = (u8*)tic_fs_loadroot(fs, CONFIG_TIC_PATH, &size); + // read config.tic + { + s32 size = 0; + u8* data = (u8*)tic_fs_loadroot(fs, CONFIG_TIC_PATH, &size); - if(data) + if(data) + { + update(config, data, size); + + free(data); + } + else saveConfig(config, false); + } + + // read menu.dat { - update(config, data, size); + s32 size = 0; + u8* data = (u8*)tic_fs_loadroot(fs, MenuDatPath, &size); + + if(data) + { + enum{Size = sizeof config->data.menu}; + if(size == Size) + memcpy(&config->data.menu, data, Size); - free(data); + free(data); + } } - else saveConfig(config, false); tic_api_reset(tic); } void freeConfig(Config* config) { + // save menu.dat + { + enum{Size = sizeof config->data.menu}; + tic_fs_saveroot(config->fs, MenuDatPath, &config->data.menu, Size, true); + } + free(config->cart); #if defined(CRT_SHADER_SUPPORT) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index a33b85829..ed493b4b8 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -207,8 +207,18 @@ static void drawBottomBar(Menu* menu, s32 x, s32 y) tic_api_rect(tic, x, y, TIC80_WIDTH, ItemHeight, tic_color_grey); tic_api_rect(tic, x, y - 1, TIC80_WIDTH, 1, tic_color_black); - static const char Text[] = TIC_COPYRIGHT; - printShadow(tic, Text, (TIC80_WIDTH - STRLEN(Text) * TIC_FONT_WIDTH) / 2, y + TextMargin, tic_color_white); + const char* help = menu->items[menu->pos].help; + if(help) + { + if(menu->ticks % TIC80_FRAMERATE < TIC80_FRAMERATE / 2) + printShadow(tic, help, x + (TIC80_WIDTH - strlen(help) * TIC_FONT_WIDTH) / 2 + menu->anim.offset, + y + TextMargin, tic_color_white); + } + else + { + static const char Text[] = TIC_COPYRIGHT; + printShadow(tic, Text, (TIC80_WIDTH - STRLEN(Text) * TIC_FONT_WIDTH) / 2, y + TextMargin, tic_color_white); + } } static void updateOption(MenuOption* option, s32 val) diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index a63ebe340..1603c35cc 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -45,6 +45,7 @@ typedef struct void(*handler)(void*); MenuOption* option; + const char* help; } MenuItem; void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 backPos, void(*back)(void*), void* data); diff --git a/src/studio/studio.c b/src/studio/studio.c index f0d7a10c9..3625ab710 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1148,7 +1148,7 @@ static s32 optionFullscreenGet() static void optionFullscreenSet(s32 pos) { - tic_sys_fullscreen_set(pos == 1); + tic_sys_fullscreen_set(impl.config->data.menu.fullscreen = (pos == 1)); } static const char OffValue[] = " "; @@ -1164,12 +1164,12 @@ static MenuOption FullscreenOption = #if defined(CRT_SHADER_SUPPORT) static s32 optionCrtMonitorGet() { - return impl.config->data.crt ? 1 : 0; + return impl.config->data.menu.crt ? 1 : 0; } static void optionCrtMonitorSet(s32 pos) { - impl.config->data.crt = pos == 1; + impl.config->data.menu.crt = pos == 1; } static MenuOption CrtMonitorOption = @@ -1183,13 +1183,12 @@ static MenuOption CrtMonitorOption = static s32 optionVSyncGet() { - // !TODO: not impelemnted - return 0; + return getConfig()->menu.vsync ? 1 : 0; } static void optionVSyncSet(s32 pos) { - // !TODO: not impelemnted + impl.config->data.menu.vsync = pos == 1; } static MenuOption VSyncOption = @@ -1201,12 +1200,12 @@ static MenuOption VSyncOption = static s32 optionVolumeGet() { - return impl.config->data.volume; + return impl.config->data.menu.volume; } static void optionVolumeSet(s32 pos) { - impl.config->data.volume = pos; + impl.config->data.menu.volume = pos; } static MenuOption VolumeOption = @@ -1269,7 +1268,7 @@ static const MenuItem OptionMenu[] = #if defined(CRT_SHADER_SUPPORT) {"CRT MONITOR ", NULL, &CrtMonitorOption}, #endif - {"VSYNC ", NULL, &VSyncOption}, + {"VSYNC ", NULL, &VSyncOption, "VSYNC needs restart!"}, {"FULLSCREEN ", NULL, &FullscreenOption}, {"VOLUME ", NULL, &VolumeOption}, {"KEYBOARD ", NULL, &KeyboardOption}, @@ -1715,7 +1714,7 @@ static inline bool keyWasPressedOnce(s32 key) #if defined(CRT_SHADER_SUPPORT) static void switchCrtMonitor() { - impl.config->data.crt = !impl.config->data.crt; + impl.config->data.menu.crt = !impl.config->data.menu.crt; } #endif @@ -2237,7 +2236,7 @@ static void studioSound() tic_mem* tic = impl.studio.tic; tic_core_synth_sound(tic); - s32 volume = getConfig()->volume; + s32 volume = getConfig()->menu.volume; if(volume != MAX_VOLUME) { @@ -2403,16 +2402,16 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.uiScale = args.scale; if(args.volume >= 0) - impl.config->data.volume = args.volume & 0x0f; + impl.config->data.menu.volume = args.volume & 0x0f; #if defined(CRT_SHADER_SUPPORT) - impl.config->data.crt |= args.crt; + impl.config->data.menu.crt |= args.crt; #endif - impl.config->data.goFullscreen |= args.fullscreen; - impl.config->data.soft |= args.soft; - impl.config->data.vsync |= args.vsync; - impl.config->data.cli |= args.cli; + impl.config->data.menu.fullscreen |= args.fullscreen; + impl.config->data.menu.vsync |= args.vsync; + impl.config->data.soft |= args.soft; + impl.config->data.cli |= args.cli; impl.studio.tick = studioTick; impl.studio.sound = studioSound; diff --git a/src/studio/system.h b/src/studio/system.h index 3dbd1800b..284bd8398 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -108,21 +108,27 @@ typedef struct bool soft; #if defined(CRT_SHADER_SUPPORT) - bool crt; struct { const char* vertex; const char* pixel; } shader; #endif - - bool goFullscreen; - bool vsync; + + struct + { + #if defined(CRT_SHADER_SUPPORT) + bool crt; + #endif + + bool fullscreen; + bool vsync; + s32 volume; + } menu; const tic_cartridge* cart; s32 uiScale; - s32 volume; } StudioConfig; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 7f3a5605f..4e11a936e 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -495,7 +495,7 @@ static void initTouchGamepad() static void initGPU() { - bool vsync = platform.studio->config()->vsync; + bool vsync = platform.studio->config()->menu.vsync; bool soft = platform.studio->config()->soft; #if defined(CRT_SHADER_SUPPORT) @@ -506,7 +506,8 @@ static void initGPU() GPU_SetInitWindow(SDL_GetWindowID(platform.window)); - platform.screen.renderer.gpu = GPU_Init(w, h, vsync ? GPU_INIT_ENABLE_VSYNC : GPU_INIT_DISABLE_VSYNC); + GPU_SetPreInitFlags(vsync ? GPU_INIT_ENABLE_VSYNC : GPU_INIT_DISABLE_VSYNC); + platform.screen.renderer.gpu = GPU_Init(w, h, GPU_DEFAULT_INIT_FLAGS); GPU_SetWindowResolution(w, h); GPU_SetVirtualResolution(platform.screen.renderer.gpu, w, h); @@ -1357,7 +1358,7 @@ void tic_sys_fullscreen_set(bool value) #if defined(CRT_SHADER_SUPPORT) if(!platform.studio->config()->soft) { - GPU_SetFullscreen(value, true); + GPU_SetFullscreen(value ? GPU_TRUE : GPU_FALSE, true); } else #endif @@ -1497,7 +1498,7 @@ static void gpuTick() #if defined(CRT_SHADER_SUPPORT) - if(!platform.studio->config()->soft && platform.studio->config()->crt) + if(!platform.studio->config()->soft && platform.studio->config()->menu.crt) { if(platform.screen.shader == 0) loadCrtShader(); @@ -1611,8 +1612,8 @@ static s32 start(s32 argc, char **argv, const char* folder) setWindowIcon(); initGPU(); - if(platform.studio->config()->goFullscreen) - tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); + if(platform.studio->config()->menu.fullscreen) + tic_sys_fullscreen_set(true); } SDL_PauseAudioDevice(platform.audio.device, 0); From ffa885972d46d9519a69e2144114fe740a90f2db Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 28 Dec 2021 10:45:35 +0300 Subject: [PATCH 206/379] wasm build fix #1748 --- src/system/sdl/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 4e11a936e..4df2dcc1f 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -1619,7 +1619,7 @@ static s32 start(s32 argc, char **argv, const char* folder) SDL_PauseAudioDevice(platform.audio.device, 0); #if defined(__EMSCRIPTEN__) - emscripten_set_main_loop(emsGpuTick, platform.studio->config()->vsync ? 0 : TIC80_FRAMERATE, 1); + emscripten_set_main_loop(emsGpuTick, platform.studio->config()->menu.vsync ? 0 : TIC80_FRAMERATE, 1); #else { const u64 Delta = SDL_GetPerformanceFrequency() / TIC80_FRAMERATE; From 0607ff0e7d692ddb139898bd61cdc01939784875 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 28 Dec 2021 17:05:47 +0300 Subject: [PATCH 207/379] fixed code selection #1721 --- src/studio/editors/code.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index e2b6056b4..452ef48df 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -1160,19 +1160,18 @@ static void doTab(Code* code, bool shift, bool crtl) // Add a block-ending keyword or symbol, and put the cursor in the line between. static void newLineAutoClose(Code* code) { - newLine(code); - const char* blockEnd = tic_core_script_config(code->tic)->blockEnd; if (blockEnd != NULL) { newLine(code); - for(size_t i = 0; i < strlen(blockEnd); i++) - inputSymbol(code, blockEnd[i]); + + while(*blockEnd) + inputSymbol(code, *blockEnd++); + upLine(code); goEnd(code); + doTab(code, false, true); } - - doTab(code, false, true); } static void setFindMode(Code* code) @@ -1589,11 +1588,6 @@ static void processKeyboard(Code* code) else if(keyWasPressed(tic_key_backspace)) backspaceWord(code); else usedKeybinding = false; } - else if(shift) - { - if(keyWasPressed(tic_key_return)) newLineAutoClose(code); - else usedKeybinding = false; - } else if(alt) { if(keyWasPressed(tic_key_left)) leftWord(code); @@ -1617,6 +1611,15 @@ static void processKeyboard(Code* code) else usedKeybinding = false; } + if(!usedKeybinding) + { + if(shift && keyWasPressed(tic_key_return)) + { + newLineAutoClose(code); + usedKeybinding = true; + } + } + if(usedClipboard || changedSelection || usedKeybinding) updateEditor(code); } From 3e7f3f55aa38bdc6a7f9f9d92d229c637d30f4c6 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 28 Dec 2021 20:40:28 +0300 Subject: [PATCH 208/379] Gamepad mapping added to the RAM #1663 #1748 --- src/core/io.c | 14 ++- src/studio/config.c | 68 +++++++------- src/studio/screens/console.c | 1 + src/studio/screens/menu.c | 19 ++-- src/studio/screens/surf.c | 17 ++-- src/studio/studio.c | 174 +++++++++++++++++------------------ src/studio/studio.h | 7 -- src/studio/system.h | 5 +- src/system/sdl/main.c | 8 +- src/tic.h | 6 ++ 10 files changed, 171 insertions(+), 148 deletions(-) diff --git a/src/core/io.c b/src/core/io.c index 0267f2598..023212679 100644 --- a/src/core/io.c +++ b/src/core/io.c @@ -132,16 +132,22 @@ tic_point tic_api_mouse(tic_mem* memory) : (tic_point){memory->ram.input.mouse.x - TIC80_OFFSET_LEFT, memory->ram.input.mouse.y - TIC80_OFFSET_TOP}; } -void tic_core_tick_io(tic_mem* memory) +void tic_core_tick_io(tic_mem* tic) { - tic_core* core = (tic_core*)memory; + tic_core* core = (tic_core*)tic; + + // process gamepads mapping + u8* keycodes = tic->ram.mapping.data; + for(s32 i = 0; i < sizeof(tic_mapping); ++i) + if(keycodes[i] && tic_api_key(tic, keycodes[i])) + tic->ram.input.gamepads.data |= 1 << i; // process gamepad for (s32 i = 0; i < COUNT_OF(core->state.gamepads.holds); i++) { u32 mask = 1 << i; u32 prevDown = core->state.gamepads.previous.data & mask; - u32 down = memory->ram.input.gamepads.data & mask; + u32 down = tic->ram.input.gamepads.data & mask; u32* hold = &core->state.gamepads.holds[i]; if (prevDown && prevDown == down) (*hold)++; @@ -152,7 +158,7 @@ void tic_core_tick_io(tic_mem* memory) for (s32 i = 0; i < tic_keys_count; i++) { bool prevDown = isKeyPressed(&core->state.keyboard.previous, i); - bool down = isKeyPressed(&memory->ram.input.keyboard, i); + bool down = isKeyPressed(&tic->ram.input.keyboard, i); u32* hold = &core->state.keyboard.holds[i]; diff --git a/src/studio/config.c b/src/studio/config.c index 2d75b53b5..bb83b58cd 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -230,14 +230,26 @@ static void setDefault(Config* config) config->data = (StudioConfig) { .cart = config->cart, - .menu = + .options = { - .volume = MAX_VOLUME, - .vsync = true, - .fullscreen = false, #if defined(CRT_SHADER_SUPPORT) .crt = false, #endif + .volume = MAX_VOLUME, + .vsync = true, + .fullscreen = false, + .mapping = (tic_mapping) + { + tic_key_up, + tic_key_down, + tic_key_left, + tic_key_right, + + tic_key_z, // a + tic_key_x, // b + tic_key_a, // x + tic_key_s, // y + }, }, }; @@ -278,24 +290,35 @@ static void reset(Config* config) static void save(Config* config) { - memcpy(config->cart, &config->tic->cart, sizeof(tic_cartridge)); + *config->cart = config->tic->cart; readConfig(config); saveConfig(config, true); studioConfigChanged(); } -static const char MenuDatPath[] = TIC_LOCAL_VERSION "menu.dat"; +static const char OptionsDatPath[] = TIC_LOCAL_VERSION "options.dat"; + +static void loadConfigData(tic_fs* fs, const char* path, void* dst, s32 size) +{ + s32 dataSize = 0; + u8* data = (u8*)tic_fs_loadroot(fs, path, &dataSize); + + if(data) SCOPE(free(data)) + if(dataSize == size) + memcpy(dst, data, size); +} void initConfig(Config* config, tic_mem* tic, tic_fs* fs) { + *config = (Config) { - config->tic = tic; - config->cart = malloc(sizeof(tic_cartridge)); - config->save = save; - config->reset = reset; - config->fs = fs; - } + .tic = tic, + .cart = realloc(config->cart, sizeof(tic_cartridge)), + .save = save, + .reset = reset, + .fs = fs, + }; setDefault(config); @@ -313,31 +336,14 @@ void initConfig(Config* config, tic_mem* tic, tic_fs* fs) else saveConfig(config, false); } - // read menu.dat - { - s32 size = 0; - u8* data = (u8*)tic_fs_loadroot(fs, MenuDatPath, &size); - - if(data) - { - enum{Size = sizeof config->data.menu}; - if(size == Size) - memcpy(&config->data.menu, data, Size); - - free(data); - } - } + loadConfigData(fs, OptionsDatPath, &config->data.options, sizeof config->data.options); tic_api_reset(tic); } void freeConfig(Config* config) { - // save menu.dat - { - enum{Size = sizeof config->data.menu}; - tic_fs_saveroot(config->fs, MenuDatPath, &config->data.menu, Size, true); - } + tic_fs_saveroot(config->fs, OptionsDatPath, &config->data.options, sizeof config->data.options, true); free(config->cart); diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index ecdc430d2..292eac471 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2731,6 +2731,7 @@ static s32 createRamTable(char* buf) {offsetof(tic_ram, font.regular.params), "FONT PARAMS"}, {offsetof(tic_ram, font.alt), "ALT FONT"}, {offsetof(tic_ram, font.alt.params), "ALT FONT PARAMS"}, + {offsetof(tic_ram, mapping), "BUTTONS MAPPING"}, {offsetof(tic_ram, free), "... (free)"}, {TIC_RAM_SIZE, ""}, }; diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index ed493b4b8..89056323b 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -237,13 +237,15 @@ static void drawMenu(Menu* menu, s32 x, s32 y) if(animIdle(menu)) { - if(tic_api_btnp(menu->tic, Up, Hold, Period)) + if(tic_api_btnp(menu->tic, Up, Hold, Period) + || tic_api_keyp(tic, tic_key_up, Hold, Period)) { playSystemSfx(2); resetMovie(menu, &menu->anim.up); } - if(tic_api_btnp(menu->tic, Down, Hold, Period)) + if(tic_api_btnp(menu->tic, Down, Hold, Period) + || tic_api_keyp(tic, tic_key_down, Hold, Period)) { playSystemSfx(2); resetMovie(menu, &menu->anim.down); @@ -252,20 +254,23 @@ static void drawMenu(Menu* menu, s32 x, s32 y) MenuOption* option = menu->items[menu->pos].option; if(option) { - if(tic_api_btnp(menu->tic, Left, Hold, Period)) + if(tic_api_btnp(menu->tic, Left, Hold, Period) + || tic_api_keyp(tic, tic_key_left, Hold, Period)) { playSystemSfx(2); updateOption(option, -1); } - if(tic_api_btnp(menu->tic, Right, Hold, Period)) + if(tic_api_btnp(menu->tic, Right, Hold, Period) + || tic_api_keyp(tic, tic_key_right, Hold, Period)) { playSystemSfx(2); updateOption(option, +1); } } - if(tic_api_btnp(menu->tic, A, -1, -1) || tic_api_keyp(tic, tic_key_return, -1, -1)) + if(tic_api_btnp(menu->tic, A, -1, -1) + || tic_api_keyp(tic, tic_key_return, Hold, Period)) { if(option) { @@ -279,7 +284,9 @@ static void drawMenu(Menu* menu, s32 x, s32 y) } } - if(tic_api_btnp(menu->tic, B, -1, -1) && menu->back) + if((tic_api_btnp(menu->tic, B, -1, -1) + || tic_api_keyp(tic, tic_key_backspace, Hold, Period)) + && menu->back) { playSystemSfx(2); resetMovie(menu, &menu->anim.back); diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index d8a5fbd48..aa9eaf21c 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -779,29 +779,31 @@ static void processGamepad(Surf* surf) Up, Down, Left, Right, A, B, X, Y }; - if(tic_api_btnp(tic, Up, Hold, Period)) + if(tic_api_btnp(tic, Up, Hold, Period) + || tic_api_keyp(tic, tic_key_up, Hold, Period)) { surf->menu.anim = 1; surf->menu.anim_target = -1; playSystemSfx(2); } - else if(tic_api_btnp(tic, Down, Hold, Period)) + else if(tic_api_btnp(tic, Down, Hold, Period) + || tic_api_keyp(tic, tic_key_down, Hold, Period)) { surf->menu.anim = 1; surf->menu.anim_target = 1; playSystemSfx(2); } - else if( - tic_api_btnp(tic, Left, Hold, Period) + else if(tic_api_btnp(tic, Left, Hold, Period) + || tic_api_keyp(tic, tic_key_left, Hold, Period) || tic_api_keyp(tic, tic_key_pageup, Hold, Period)) { surf->menu.anim = 1; surf->menu.anim_target = -5; } - else if( - tic_api_btnp(tic, Right, Hold, Period) + else if(tic_api_btnp(tic, Right, Hold, Period) + || tic_api_keyp(tic, tic_key_right, Hold, Period) || tic_api_keyp(tic, tic_key_pagedown, Hold, Period)) { surf->menu.anim = 1; @@ -817,7 +819,8 @@ static void processGamepad(Surf* surf) : loadCart(surf); } - if(tic_api_btnp(tic, B, -1, -1)) + if(tic_api_btnp(tic, B, -1, -1) + || tic_api_keyp(tic, tic_key_backspace, -1, -1)) { goBackDir(surf); } diff --git a/src/studio/studio.c b/src/studio/studio.c index 3625ab710..c083dcf7c 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -121,8 +121,6 @@ static struct MouseState state[3]; } mouse; - tic_key keycodes[KEYMAP_COUNT]; - #if defined(BUILD_EDITORS) EditorMode menuMode; @@ -208,18 +206,6 @@ static struct .mode = TIC_START_MODE, .prevMode = TIC_CODE_MODE, - .keycodes = - { - tic_key_up, - tic_key_down, - tic_key_left, - tic_key_right, - - tic_key_z, // a - tic_key_x, // b - tic_key_a, // x - tic_key_s, // y - }, #if defined(BUILD_EDITORS) .cart = { @@ -1148,7 +1134,7 @@ static s32 optionFullscreenGet() static void optionFullscreenSet(s32 pos) { - tic_sys_fullscreen_set(impl.config->data.menu.fullscreen = (pos == 1)); + tic_sys_fullscreen_set(impl.config->data.options.fullscreen = (pos == 1)); } static const char OffValue[] = " "; @@ -1164,12 +1150,12 @@ static MenuOption FullscreenOption = #if defined(CRT_SHADER_SUPPORT) static s32 optionCrtMonitorGet() { - return impl.config->data.menu.crt ? 1 : 0; + return impl.config->data.options.crt ? 1 : 0; } static void optionCrtMonitorSet(s32 pos) { - impl.config->data.menu.crt = pos == 1; + impl.config->data.options.crt = pos == 1; } static MenuOption CrtMonitorOption = @@ -1183,12 +1169,12 @@ static MenuOption CrtMonitorOption = static s32 optionVSyncGet() { - return getConfig()->menu.vsync ? 1 : 0; + return getConfig()->options.vsync ? 1 : 0; } static void optionVSyncSet(s32 pos) { - impl.config->data.menu.vsync = pos == 1; + impl.config->data.options.vsync = pos == 1; } static MenuOption VSyncOption = @@ -1200,34 +1186,22 @@ static MenuOption VSyncOption = static s32 optionVolumeGet() { - return impl.config->data.menu.volume; + return impl.config->data.options.volume; } static void optionVolumeSet(s32 pos) { - impl.config->data.menu.volume = pos; + impl.config->data.options.volume = pos; } static MenuOption VolumeOption = { OPTION_VALUES( { - "<00> ", - "<01> ", - "<02> ", - "<03> ", - "<04> ", - "<05> ", - "<06> ", - "<07> ", - "<08> ", - "<09> ", - "<10> ", - "<11> ", - "<12> ", - "<13> ", - "<14> ", - "<15> ", + "<00> ", "<01> ", "<02> ", "<03> ", + "<04> ", "<05> ", "<06> ", "<07> ", + "<08> ", "<09> ", "<10> ", "<11> ", + "<12> ", "<13> ", "<14> ", "<15> ", }), optionVolumeGet, optionVolumeSet, @@ -1311,25 +1285,80 @@ static void showOptionsMenu() Count, Count - 5, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); } +static const char* KeysList[] = +{ + " ", " ", " ", " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", " ", " ", "

", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "<0> ", "<1> ", "<2> ", "<3> ", "<4> ", "<5> ", "<6> ", "<7> ", "<8> ", "<9> ", "<-> ", "<=> ", "<[> ", "<]> ", - "<\\> ","<;> ", "<'> ", "<`> ", "<,> ", "<.> ", " ", "< > ", + "<\\> ","<;> ", "<'> ", "<`> ", "<,> ", "<.> ", " ", "", " ", " ", "", " ", " ", " ", " ", " ", " ", " ", " ", " ", "", " ", " ", "", " ", " ", " ", " ", " ", " ", " ", " ", @@ -1301,26 +1273,26 @@ static const char* KeysList[] = static tic_mapping GamepadMapping; -#define OPTION_KEY(KEY) \ - \ -enum{KEY ## KeyIndex = __COUNTER__}; \ - \ -static s32 option ## KEY ## KeyGet() \ -{ \ - return GamepadMapping.data[KEY ## KeyIndex] - 1; \ -} \ - \ -static void option ## KEY ## KeySet(s32 pos) \ -{ \ - GamepadMapping.data[KEY ## KeyIndex] = pos + 1; \ -} \ - \ -static MenuOption KEY ## KeyOption = \ -{ \ - .values = KeysList, \ - .count = COUNT_OF(KeysList), \ - option ## KEY ## KeyGet, \ - option ## KEY ## KeySet, \ +#define OPTION_KEY(KEY) \ + \ +enum{KEY ## KeyIndex = __COUNTER__}; \ + \ +static s32 option ## KEY ## KeyGet() \ +{ \ + return GamepadMapping.data[KEY ## KeyIndex]; \ +} \ + \ +static void option ## KEY ## KeySet(s32 pos) \ +{ \ + GamepadMapping.data[KEY ## KeyIndex] = pos; \ +} \ + \ +static MenuOption KEY ## KeyOption = \ +{ \ + .values = KeysList, \ + .count = COUNT_OF(KeysList), \ + option ## KEY ## KeyGet, \ + option ## KEY ## KeySet, \ }; OPTION_KEY(Up) @@ -1332,13 +1304,15 @@ OPTION_KEY(B) OPTION_KEY(X) OPTION_KEY(Y) -static void backGamepadMenu() +static void saveGamepadMenu() { impl.config->data.options.mapping = GamepadMapping; showOptionsMenu(); } -static void showGamepadMenu() +static void resetGamepadMenu(); + +static void initGamepadMenu() { static const MenuItem GamepadMenu[] = { @@ -1351,14 +1325,28 @@ static void showGamepadMenu() {"X ", NULL, &XKeyOption}, {"Y ", NULL, &YKeyOption}, - {"", NULL}, - {"BACK", backGamepadMenu}, + {"", NULL}, + {"SAVE MAPPING", saveGamepadMenu}, + {"RESET TO DEFAULTS", resetGamepadMenu}, + {"BACK", showOptionsMenu}, }; - GamepadMapping = impl.studio.tic->ram.mapping; + GamepadMapping = getConfig()->options.mapping; studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), - 0, COUNT_OF(OptionMenu) - 3, backGamepadMenu, NULL); + 0, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); +} + +static void resetGamepadMenu() +{ + tic_sys_default_mapping(&GamepadMapping); + initGamepadMenu(); +} + +static void showGamepadMenu() +{ + GamepadMapping = getConfig()->options.mapping; + initGamepadMenu(); } static inline bool pointInRect(const tic_point* pt, const tic_rect* rect) diff --git a/src/studio/system.h b/src/studio/system.h index 6f6a2918c..78422c1c3 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -60,6 +60,7 @@ void tic_sys_open_path(const char* path); void tic_sys_preseed(); bool tic_sys_keyboard_text(char* text); void tic_sys_update_config(); +void tic_sys_default_mapping(tic_mapping* mapping); #define CODE_COLORS_LIST(macro) \ macro(BG) \ diff --git a/src/system/baremetalpi/kernel.cpp b/src/system/baremetalpi/kernel.cpp index e21cf9d81..c7c49e80d 100644 --- a/src/system/baremetalpi/kernel.cpp +++ b/src/system/baremetalpi/kernel.cpp @@ -60,58 +60,58 @@ extern "C" { /* unsigned int sleep(unsigned int seconds) { - mTimer.SimpleMsDelay (seconds*1000); + mTimer.SimpleMsDelay (seconds*1000); } */ static struct { - Studio* studio; + Studio* studio; - struct - { - bool state[tic_keys_count]; - } keyboard; + struct + { + bool state[tic_keys_count]; + } keyboard; - char* clipboard; + char* clipboard; } platform; void tic_sys_clipboard_set(const char* text) { - if(platform.clipboard) - { - free(platform.clipboard); - platform.clipboard = NULL; - } + if(platform.clipboard) + { + free(platform.clipboard); + platform.clipboard = NULL; + } - platform.clipboard = strdup(text); + platform.clipboard = strdup(text); } bool tic_sys_clipboard_has() { - return platform.clipboard != NULL; + return platform.clipboard != NULL; } char* tic_sys_clipboard_get() { - return platform.clipboard ? strdup(platform.clipboard) : NULL; + return platform.clipboard ? strdup(platform.clipboard) : NULL; } void tic_sys_clipboard_free(const char* text) { - free((void*)text); + free((void*)text); } u64 tic_sys_counter_get() { - return CTimer::Get()->GetTicks(); + return CTimer::Get()->GetTicks(); } u64 tic_sys_freq_get() { - return HZ; + return HZ; } void tic_sys_fullscreen_set(bool value) @@ -138,11 +138,11 @@ void tic_sys_open_path(const char* path) void tic_sys_preseed() { #if defined(__TIC_MACOSX__) - srandom(time(NULL)); - random(); + srandom(time(NULL)); + random(); #else - srand(time(NULL)); - rand(); + srand(time(NULL)); + rand(); #endif } @@ -151,29 +151,45 @@ void tic_sys_update_config() } +void tic_sys_default_mapping(tic_mapping* mapping) +{ + *mapping = (tic_mapping) + { + tic_key_up, + tic_key_down, + tic_key_left, + tic_key_right, + + tic_key_z, // a + tic_key_x, // b + tic_key_a, // x + tic_key_s, // y + }; +} + bool tic_sys_keyboard_text(char* text) { - return false; + return false; } void screenCopy(CScreenDevice* screen, u32* ts) { - u32 pitch = screen->GetPitch(); - u32* buf = screen->GetBuffer(); - for (int y = 0; y < TIC80_HEIGHT; y++) - { - u32 *line = ts + ((y+TIC80_OFFSET_TOP)*(TIC80_FULLWIDTH) + TIC80_OFFSET_LEFT); - memcpy(buf + (pitch * y), line, TIC80_WIDTH * 4); - } - - // single pixel mouse pointer, disappear after 10 seconds unmoved - if (mouseTime<600) - { - u32 midx = pitch*(mousey)+mousex; - buf[midx]= 0xffffff; - } - - // memcpy(screen->GetBuffer(), tic->screen, TIC80_WIDTH*TIC80_HEIGHT*4); would have been too good + u32 pitch = screen->GetPitch(); + u32* buf = screen->GetBuffer(); + for (int y = 0; y < TIC80_HEIGHT; y++) + { + u32 *line = ts + ((y+TIC80_OFFSET_TOP)*(TIC80_FULLWIDTH) + TIC80_OFFSET_LEFT); + memcpy(buf + (pitch * y), line, TIC80_WIDTH * 4); + } + + // single pixel mouse pointer, disappear after 10 seconds unmoved + if (mouseTime<600) + { + u32 midx = pitch*(mousey)+mousex; + buf[midx]= 0xffffff; + } + + // memcpy(screen->GetBuffer(), tic->screen, TIC80_WIDTH*TIC80_HEIGHT*4); would have been too good } @@ -182,113 +198,113 @@ void screenCopy(CScreenDevice* screen, u32* ts) void mouseEventHandler (TMouseEvent Event, unsigned nButtons, unsigned nPosX, unsigned nPosY, int nWheelMove) { - keyspinlock.Acquire(); - mousex = nPosX/MOUSE_SENS; - mousey = nPosY/MOUSE_SENS; - mousebuttons = nButtons; - keyspinlock.Release(); + keyspinlock.Acquire(); + mousex = nPosX/MOUSE_SENS; + mousey = nPosY/MOUSE_SENS; + mousebuttons = nButtons; + keyspinlock.Release(); } void gamePadStatusHandler (unsigned nDeviceIndex, const TGamePadState *pState) { - keyspinlock.Acquire(); - // Just copy buttons and axes. - gamepad.buttons = pState -> buttons; - gamepad.naxes = pState -> naxes; - for (int i = 0; i< pState->naxes; i++) - { - gamepad.axes[i].value = pState -> axes[i].value; - } - keyspinlock.Release(); + keyspinlock.Acquire(); + // Just copy buttons and axes. + gamepad.buttons = pState -> buttons; + gamepad.naxes = pState -> naxes; + for (int i = 0; i< pState->naxes; i++) + { + gamepad.axes[i].value = pState -> axes[i].value; + } + keyspinlock.Release(); } void inputToTic() { - tic_mem* tic = platform.studio->tic; - - tic80_input* tic_input = &tic->ram.input; - - // mouse - if (mousebuttons & 0x01) tic_input->mouse.left = true; else tic_input->mouse.left = false; - if (mousebuttons & 0x02) tic_input->mouse.right = true; else tic_input->mouse.right = false; - if (mousebuttons & 0x04) tic_input->mouse.middle = true; else tic_input->mouse.middle = false; - tic_input->mouse.x = mousex + TIC80_OFFSET_LEFT; - tic_input->mouse.y = mousey + TIC80_OFFSET_TOP; - - if( (mousex == mousexOld) && (mousey == mouseyOld) && (mousebuttons == mousebuttonsOld)) - { - mouseTime++; - } - else - { - mouseTime = 0; - } - - mousexOld = mousex; - mouseyOld = mousey; - mousebuttonsOld = mousebuttons; - - // keyboard - tic_input->gamepads.first.data = 0; - tic_input->keyboard.data = 0; - - u32 keynum = 0; - - //dbg("MODIF %02x ", keyboardModifiers); - - if(keyboardModifiers & 0x11) tic_input->keyboard.keys[keynum++]= tic_key_ctrl; - if(keyboardModifiers & 0x22) tic_input->keyboard.keys[keynum++]= tic_key_shift; - if(keyboardModifiers & 0x44) tic_input->keyboard.keys[keynum++]= tic_key_alt; - - for (unsigned i = 0; i < 6; i++) - { - if (keyboardRawKeys[i] != 0) - { - // keyboard - if(keynumkeyboard.keys[keynum++]= tkc; - } - // key to gamepad - switch(keyboardRawKeys[i]) - { - case 0x1d: tic_input->gamepads.first.a = true; break; - case 0x1b: tic_input->gamepads.first.b = true; break; - case 0x52: tic_input->gamepads.first.up = true; break; - case 0x51: tic_input->gamepads.first.down = true; break; - case 0x50: tic_input->gamepads.first.left = true; break; - case 0x4F: tic_input->gamepads.first.right = true; break; - } - //dbg(" %02x ", keyboardRawKeys[i]); - - } - } - //dbg("\n"); - - - // gamepads - - if (gamepad.buttons & 0x100) tic_input->gamepads.first.a = true; - if (gamepad.buttons & 0x200) tic_input->gamepads.first.b = true; - if (gamepad.buttons & 0x400) tic_input->gamepads.first.x = true; - if (gamepad.buttons & 0x800) tic_input->gamepads.first.y = true; - // map ESC to a gamepad button to exit the game - if (gamepad.buttons & 0x10) tic_input->keyboard.keys[keynum++]= tic_key_escape; - - // TODO use min and max instead of hardcoded range - if (gamepad.naxes > 0) - { - if (gamepad.axes[0].value < 50) tic_input->gamepads.first.left = true; - if (gamepad.axes[0].value > 200) tic_input->gamepads.first.right = true; - - } - if (gamepad.naxes > 1) - { - if (gamepad.axes[1].value < 50) tic_input->gamepads.first.up = true; - if (gamepad.axes[1].value > 200) tic_input->gamepads.first.down = true; - } + tic_mem* tic = platform.studio->tic; + + tic80_input* tic_input = &tic->ram.input; + + // mouse + if (mousebuttons & 0x01) tic_input->mouse.left = true; else tic_input->mouse.left = false; + if (mousebuttons & 0x02) tic_input->mouse.right = true; else tic_input->mouse.right = false; + if (mousebuttons & 0x04) tic_input->mouse.middle = true; else tic_input->mouse.middle = false; + tic_input->mouse.x = mousex + TIC80_OFFSET_LEFT; + tic_input->mouse.y = mousey + TIC80_OFFSET_TOP; + + if( (mousex == mousexOld) && (mousey == mouseyOld) && (mousebuttons == mousebuttonsOld)) + { + mouseTime++; + } + else + { + mouseTime = 0; + } + + mousexOld = mousex; + mouseyOld = mousey; + mousebuttonsOld = mousebuttons; + + // keyboard + tic_input->gamepads.first.data = 0; + tic_input->keyboard.data = 0; + + u32 keynum = 0; + + //dbg("MODIF %02x ", keyboardModifiers); + + if(keyboardModifiers & 0x11) tic_input->keyboard.keys[keynum++]= tic_key_ctrl; + if(keyboardModifiers & 0x22) tic_input->keyboard.keys[keynum++]= tic_key_shift; + if(keyboardModifiers & 0x44) tic_input->keyboard.keys[keynum++]= tic_key_alt; + + for (unsigned i = 0; i < 6; i++) + { + if (keyboardRawKeys[i] != 0) + { + // keyboard + if(keynumkeyboard.keys[keynum++]= tkc; + } + // key to gamepad + switch(keyboardRawKeys[i]) + { + case 0x1d: tic_input->gamepads.first.a = true; break; + case 0x1b: tic_input->gamepads.first.b = true; break; + case 0x52: tic_input->gamepads.first.up = true; break; + case 0x51: tic_input->gamepads.first.down = true; break; + case 0x50: tic_input->gamepads.first.left = true; break; + case 0x4F: tic_input->gamepads.first.right = true; break; + } + //dbg(" %02x ", keyboardRawKeys[i]); + + } + } + //dbg("\n"); + + + // gamepads + + if (gamepad.buttons & 0x100) tic_input->gamepads.first.a = true; + if (gamepad.buttons & 0x200) tic_input->gamepads.first.b = true; + if (gamepad.buttons & 0x400) tic_input->gamepads.first.x = true; + if (gamepad.buttons & 0x800) tic_input->gamepads.first.y = true; + // map ESC to a gamepad button to exit the game + if (gamepad.buttons & 0x10) tic_input->keyboard.keys[keynum++]= tic_key_escape; + + // TODO use min and max instead of hardcoded range + if (gamepad.naxes > 0) + { + if (gamepad.axes[0].value < 50) tic_input->gamepads.first.left = true; + if (gamepad.axes[0].value > 200) tic_input->gamepads.first.right = true; + + } + if (gamepad.naxes > 1) + { + if (gamepad.axes[1].value < 50) tic_input->gamepads.first.up = true; + if (gamepad.axes[1].value > 200) tic_input->gamepads.first.down = true; + } /* dbg("G:BTN 0x%X", gamepad.buttons); @@ -318,134 +334,134 @@ void inputToTic() } void KeyStatusHandlerRaw (unsigned char ucModifiers, const unsigned char RawKeys[6]) { - // this gets called with whatever key is currently pressed in RawKeys - // (plus modifiers). - keyspinlock.Acquire(); - keyboardModifiers = ucModifiers; - memcpy(keyboardRawKeys, RawKeys, sizeof(unsigned char)*6); - keyspinlock.Release(); + // this gets called with whatever key is currently pressed in RawKeys + // (plus modifiers). + keyspinlock.Acquire(); + keyboardModifiers = ucModifiers; + memcpy(keyboardRawKeys, RawKeys, sizeof(unsigned char)*6); + keyspinlock.Release(); } void testmkdir(const char* name) { - dbg("creating %s : ", name); - FRESULT res = f_mkdir(name); - if(res == FR_OK) - { - dbg("ok\n"); - } - else - { - dbg("KO %d\n", res); - } + dbg("creating %s : ", name); + FRESULT res = f_mkdir(name); + if(res == FR_OK) + { + dbg("ok\n"); + } + else + { + dbg("KO %d\n", res); + } } void teststat(const char* name) { - dbg("K:%s", name); - FILINFO filinfo; - FRESULT res = f_stat (name, &filinfo); - dbg("stat: %d ", res); - dbg("size: %ld ", filinfo.fsize); - dbg("attr: %02x\n", filinfo.fattrib); + dbg("K:%s", name); + FILINFO filinfo; + FRESULT res = f_stat (name, &filinfo); + dbg("stat: %d ", res); + dbg("size: %ld ", filinfo.fsize); + dbg("attr: %02x\n", filinfo.fattrib); } TShutdownMode Run(void) { - initializeCore(); - mLogger.Write (KN, LogNotice, "TIC80 Port"); - - //teststat("circle.txt"); - //teststat("no.txt"); - //teststat("carts"); - - testmkdir("tic80"); - //CTimer::SimpleMsDelay(5000); - - // ok testmkdir("primo"); - // ko testmkdir("secondo/bis"); - // ok testmkdir(".terzo"); - // ko testmkdir(".quarto/"); - // ko testmkdir("quinto/"); - // ok testmkdir("sesto bis"); - - dbg("Calling studio init instance..\n"); - - if (pKeyboard) - { - dbg("With keyboard\n"); - malloc(77); - char arg0[] = "xxkernel"; - char* argv[] = { &arg0[0], NULL }; - int argc = 1; - malloc(88); - platform.studio = studioInit(argc, argv, 44100, "tic80"); - malloc(99); - - } - else - { - // if no keyboard, start in surf mode! - char arg0[] = "xxkernel"; - char arg1[] = "--cmd=surf"; - char* argv[] = { &arg0[0], &arg1[0], NULL }; - int argc = 2; - dbg("Without keyboard\n"); - platform.studio = studioInit(argc, argv, 44100, "tic80"); - } - dbg("studioInit OK\n"); - - if( !platform.studio) - { - Die("Could not init studio"); - } - - // gotoSurf(); - platform.studio->tic->screen_format = TIC80_PIXEL_COLOR_BGRA8888; - dbg("Studio init ok..\n"); - - if (pKeyboard){ - pKeyboard->RegisterKeyStatusHandlerRaw (KeyStatusHandlerRaw); - } - - initGamepads(mDeviceNameService, gamePadStatusHandler); - - if (pMouse) { - pMouse->RegisterEventHandler (mouseEventHandler); - } - - tic_mem* tic = platform.studio->tic; - tic80_input* tic_input = &tic->ram.input; - tic_input->keyboard.data = 0; - - - // sound system - mSound->AllocateQueue(1000); - mSound->SetWriteFormat(SoundFormatSigned16); - - if (!mSound->Start()) - { - Die("Could not start sound."); - } - - // MAIN LOOP - while(true) - { - keyspinlock.Acquire(); - inputToTic(); - keyspinlock.Release(); - - platform.studio->tick(); - platform.studio->sound(); - - mSound->Write(tic->samples.buffer, tic->samples.size); - - mScreen.vsync(); - - screenCopy(&mScreen, platform.studio->tic->screen); - - mScheduler.Yield(); // for sound - } - - return ShutdownHalt; + initializeCore(); + mLogger.Write (KN, LogNotice, "TIC80 Port"); + + //teststat("circle.txt"); + //teststat("no.txt"); + //teststat("carts"); + + testmkdir("tic80"); + //CTimer::SimpleMsDelay(5000); + + // ok testmkdir("primo"); + // ko testmkdir("secondo/bis"); + // ok testmkdir(".terzo"); + // ko testmkdir(".quarto/"); + // ko testmkdir("quinto/"); + // ok testmkdir("sesto bis"); + + dbg("Calling studio init instance..\n"); + + if (pKeyboard) + { + dbg("With keyboard\n"); + malloc(77); + char arg0[] = "xxkernel"; + char* argv[] = { &arg0[0], NULL }; + int argc = 1; + malloc(88); + platform.studio = studioInit(argc, argv, 44100, "tic80"); + malloc(99); + + } + else + { + // if no keyboard, start in surf mode! + char arg0[] = "xxkernel"; + char arg1[] = "--cmd=surf"; + char* argv[] = { &arg0[0], &arg1[0], NULL }; + int argc = 2; + dbg("Without keyboard\n"); + platform.studio = studioInit(argc, argv, 44100, "tic80"); + } + dbg("studioInit OK\n"); + + if( !platform.studio) + { + Die("Could not init studio"); + } + + // gotoSurf(); + platform.studio->tic->screen_format = TIC80_PIXEL_COLOR_BGRA8888; + dbg("Studio init ok..\n"); + + if (pKeyboard){ + pKeyboard->RegisterKeyStatusHandlerRaw (KeyStatusHandlerRaw); + } + + initGamepads(mDeviceNameService, gamePadStatusHandler); + + if (pMouse) { + pMouse->RegisterEventHandler (mouseEventHandler); + } + + tic_mem* tic = platform.studio->tic; + tic80_input* tic_input = &tic->ram.input; + tic_input->keyboard.data = 0; + + + // sound system + mSound->AllocateQueue(1000); + mSound->SetWriteFormat(SoundFormatSigned16); + + if (!mSound->Start()) + { + Die("Could not start sound."); + } + + // MAIN LOOP + while(true) + { + keyspinlock.Acquire(); + inputToTic(); + keyspinlock.Release(); + + platform.studio->tick(); + platform.studio->sound(); + + mSound->Write(tic->samples.buffer, tic->samples.size); + + mScreen.vsync(); + + screenCopy(&mScreen, platform.studio->tic->screen); + + mScheduler.Yield(); // for sound + } + + return ShutdownHalt; } diff --git a/src/system/n3ds/main.c b/src/system/n3ds/main.c index 9aa06ab70..54e7df58c 100644 --- a/src/system/n3ds/main.c +++ b/src/system/n3ds/main.c @@ -221,6 +221,22 @@ void tic_sys_update_config() } +void tic_sys_default_mapping(tic_mapping* mapping) +{ + *mapping = (tic_mapping) + { + tic_key_up, + tic_key_down, + tic_key_left, + tic_key_right, + + tic_key_z, // a + tic_key_x, // b + tic_key_a, // x + tic_key_s, // y + }; +} + bool tic_sys_keyboard_text(char* text) { return false; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 84eddded7..83e40f86b 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -995,13 +995,13 @@ static void processTouchInput() } #endif -static void handleKeydown(SDL_Keycode keycode, bool down, bool* state) +static const u32 KeyboardCodes[tic_keys_count] = { - static const u32 KeyboardCodes[tic_keys_count] = - { - #include "keycodes.inl" - }; + #include "keycodes.inl" +}; +static void handleKeydown(SDL_Keycode keycode, bool down, bool* state) +{ for(tic_key i = 0; i < COUNT_OF(KeyboardCodes); i++) { if(KeyboardCodes[i] == keycode) @@ -1478,6 +1478,35 @@ void tic_sys_update_config() #endif } +void tic_sys_default_mapping(tic_mapping* mapping) +{ + static const SDL_Scancode Scancodes[] = + { + SDL_SCANCODE_UP, + SDL_SCANCODE_DOWN, + SDL_SCANCODE_LEFT, + SDL_SCANCODE_RIGHT, + SDL_SCANCODE_Z, + SDL_SCANCODE_X, + SDL_SCANCODE_A, + SDL_SCANCODE_S, + }; + + for(s32 s = 0; s < COUNT_OF(Scancodes); ++s) + { + SDL_Keycode keycode = SDL_GetKeyFromScancode(Scancodes[s]); + + for(tic_key i = 0; i < COUNT_OF(KeyboardCodes); i++) + { + if(KeyboardCodes[i] == keycode) + { + mapping->data[s] = i; + break; + } + } + } +} + static void gpuTick() { tic_mem* tic = platform.studio->tic; @@ -1576,6 +1605,7 @@ static void emsGpuTick() static s32 start(s32 argc, char **argv, const char* folder) { + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK); platform.studio = studioInit(argc, argv, TIC80_SAMPLERATE, folder); SCOPE(platform.studio->close()) @@ -1587,8 +1617,6 @@ static s32 start(s32 argc, char **argv, const char* folder) } else { - SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK); - initSound(); { diff --git a/src/system/sokol/sokol.c b/src/system/sokol/sokol.c index 2d555fe98..a5250fc78 100644 --- a/src/system/sokol/sokol.c +++ b/src/system/sokol/sokol.c @@ -126,6 +126,22 @@ void tic_sys_update_config() } +void tic_sys_default_mapping(tic_mapping* mapping) +{ + *mapping = (tic_mapping) + { + tic_key_up, + tic_key_down, + tic_key_left, + tic_key_right, + + tic_key_z, // a + tic_key_x, // b + tic_key_a, // x + tic_key_s, // y + }; +} + bool tic_sys_keyboard_text(char* text) { *text = platform.keyboard.text; From a0e0f8623d1d4605d246066a188377a8632fa23f Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 5 Jan 2022 18:52:35 +0300 Subject: [PATCH 213/379] fixed Jxy command #1707 --- src/core/sound.c | 6 ------ src/studio/studio.c | 15 +++++++++++++-- src/system/sdl/main.c | 32 +++++++++++++++++++++++--------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/core/sound.c b/src/core/sound.c index cea195d45..c1b8b3da0 100644 --- a/src/core/sound.c +++ b/src/core/sound.c @@ -260,12 +260,6 @@ static void processMusic(tic_mem* memory) if (row != music_state->music.row && jumpCmd->active) { - if(!music_state->flag.music_loop) - { - stopMusic(memory); - return; - } - music_state->music.frame = jumpCmd->frame; row = jumpCmd->beat * NOTES_PER_BEAT; core->state.music.ticks = row2tick(core, track, row); diff --git a/src/studio/studio.c b/src/studio/studio.c index 834405a3a..914131d5f 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -359,7 +359,10 @@ const char* studioExportMusic(s32 track, const char* filename) tic_api_music(tic, track, -1, -1, false, editor->sustain, -1, -1); - while(state->flag.music_status == tic_music_play) + s32 frame = state->music.frame; + s32 frames = MUSIC_FRAMES * 16; + + while(frames && state->flag.music_status == tic_music_play) { tic_core_tick_start(tic); @@ -371,9 +374,17 @@ const char* studioExportMusic(s32 track, const char* filename) tic_core_synth_sound(tic); wave_write(tic->samples.buffer, tic->samples.size / sizeof(s16)); + + if(frame != state->music.frame) + { + --frames; + frame = state->music.frame; + } } - wave_close(); + tic_api_music(tic, -1, -1, -1, false, false, -1, -1); + + wave_close(); return path; } diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 83e40f86b..850a2d722 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -57,6 +57,8 @@ #define KBD_COLS 22 #define KBD_ROWS 17 +#define LOCK_MUTEX(MUTEX) SDL_LockMutex(MUTEX); SCOPE(SDL_UnlockMutex(MUTEX)) + enum { tic_key_board = tic_keys_count + 1, @@ -163,6 +165,7 @@ static struct struct { + SDL_mutex *mutex; SDL_AudioSpec spec; SDL_AudioDeviceID device; s32 bufferRemaining; @@ -250,22 +253,27 @@ static void renderCopy(Renderer render, Texture tex, SDL_Rect src, SDL_Rect dst) static void audioCallback(void* userdata, u8* stream, s32 len) { - tic_mem* tic = platform.studio->tic; - - while(len--) + LOCK_MUTEX(platform.audio.mutex) { - if (platform.audio.bufferRemaining <= 0) + tic_mem* tic = platform.studio->tic; + + while(len--) { - platform.studio->sound(); - platform.audio.bufferRemaining = tic->samples.size; - } + if (platform.audio.bufferRemaining <= 0) + { + platform.studio->sound(); + platform.audio.bufferRemaining = tic->samples.size; + } - *stream++ = ((u8*)tic->samples.buffer)[tic->samples.size - platform.audio.bufferRemaining--]; + *stream++ = ((u8*)tic->samples.buffer)[tic->samples.size - platform.audio.bufferRemaining--]; + } } } static void initSound() { + platform.audio.mutex = SDL_CreateMutex(); + SDL_AudioSpec want = { .freq = TIC80_SAMPLERATE, @@ -1521,7 +1529,11 @@ static void gpuTick() return; } - platform.studio->tick(); + LOCK_MUTEX(platform.audio.mutex) + { + platform.studio->tick(); + } + renderClear(platform.screen.renderer); updateTextureBytes(platform.screen.texture, tic->screen, TIC80_FULLWIDTH, TIC80_FULLHEIGHT); @@ -1687,6 +1699,8 @@ static s32 start(s32 argc, char **argv, const char* folder) SDL_DestroyWindow(platform.window); SDL_CloseAudioDevice(platform.audio.device); } + + SDL_DestroyMutex(platform.audio.mutex); } } From ee27172ebd4ad77cd24acd055c32752591470da7 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 5 Jan 2022 15:02:51 -0500 Subject: [PATCH 214/379] Typo: Correct variable was not getting updated --- demos/bunny/luamark.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/bunny/luamark.lua b/demos/bunny/luamark.lua index 553d312eb..7ab147142 100644 --- a/demos/bunny/luamark.lua +++ b/demos/bunny/luamark.lua @@ -36,7 +36,7 @@ end function Bunny:update() self.x = self.x + self.speedX - self.y = self.x + self.speedY + self.y = self.y + self.speedY if (self.x + self.width > screenWidth) then self.x = screenWidth - self.width From 0ecea2e5da79fc2fd1c6925e0745d2e86e8ac85e Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 6 Jan 2022 09:51:06 +0300 Subject: [PATCH 215/379] PR #1783 fix --- build/assets/luamark.tic.dat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/assets/luamark.tic.dat b/build/assets/luamark.tic.dat index b535cd057..ac1d9b956 100644 --- a/build/assets/luamark.tic.dat +++ b/build/assets/luamark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x56, 0x41, 0x6f, 0xe3, 0x44, 0x14, 0x76, 0x0f, 0x20, 0xc5, 0x22, 0x52, 0x73, 0x45, 0x1c, 0x9e, 0x16, 0x21, 0xec, 0x36, 0xc9, 0x3a, 0x6d, 0x37, 0xa0, 0x6c, 0x5b, 0x69, 0x17, 0xb4, 0x62, 0x25, 0x0e, 0x88, 0x5d, 0xb6, 0x54, 0xa2, 0x5a, 0x4d, 0xe3, 0x49, 0x63, 0xe1, 0x8c, 0xc3, 0x78, 0xdc, 0x34, 0x5a, 0x95, 0x23, 0xbf, 0x80, 0x1f, 0xc0, 0x09, 0xae, 0x70, 0xe2, 0xce, 0x0d, 0x29, 0x95, 0xfa, 0x03, 0xea, 0x6a, 0xf9, 0x01, 0x64, 0x39, 0x54, 0x70, 0x84, 0x37, 0xe3, 0xb1, 0x33, 0x4e, 0xdb, 0x6d, 0x91, 0x90, 0x00, 0xa9, 0x23, 0x3f, 0x67, 0xfc, 0xe6, 0xbd, 0xf7, 0xbd, 0x79, 0xef, 0xcd, 0x9b, 0xbc, 0xe6, 0x59, 0xd6, 0xeb, 0x6f, 0xd4, 0x77, 0xde, 0xde, 0xf9, 0x61, 0xf3, 0xd1, 0x8b, 0xc3, 0xad, 0x3f, 0x8f, 0x92, 0xef, 0x7e, 0x1b, 0xbe, 0xfb, 0xa3, 0xff, 0xd6, 0x17, 0x63, 0xb7, 0x1d, 0xdd, 0xdd, 0xf9, 0xf9, 0xde, 0xb7, 0xbf, 0xc7, 0x2f, 0xfe, 0x38, 0x3b, 0x3b, 0xfb, 0xfa, 0xfb, 0x9f, 0x9e, 0x84, 0x5f, 0xad, 0xae, 0x6f, 0x2d, 0x7c, 0xf3, 0xaa, 0x75, 0xd5, 0xa8, 0xd5, 0x6a, 0x48, 0x0b, 0x29, 0xd2, 0xd1, 0x1c, 0x49, 0x5e, 0x6a, 0x2d, 0xe2, 0xab, 0x5a, 0x3b, 0x9e, 0xcc, 0xd1, 0x49, 0x6a, 0xa5, 0x72, 0x48, 0x0b, 0x69, 0xba, 0x58, 0x9b, 0x9c, 0x94, 0xe9, 0x08, 0x79, 0x92, 0x7f, 0xd5, 0xb0, 0x6e, 0xc6, 0xbf, 0x3a, 0xf2, 0x3c, 0xe7, 0xb4, 0x60, 0x1d, 0xa7, 0xbf, 0x4c, 0x4f, 0x91, 0xa6, 0x38, 0x7f, 0x7e, 0x5a, 0xc5, 0x1c, 0x57, 0x53, 0x3d, 0xaa, 0xb8, 0x98, 0x4e, 0xd2, 0x8c, 0xb2, 0x71, 0x8c, 0x39, 0x3e, 0xd6, 0xb9, 0xce, 0xa8, 0x6a, 0x15, 0x8b, 0x38, 0x9f, 0xcf, 0xb7, 0xac, 0x88, 0xaa, 0xa6, 0xc5, 0x9b, 0xfc, 0xff, 0x17, 0xf2, 0x3f, 0x7d, 0x19, 0xa5, 0x47, 0x93, 0x49, 0x3a, 0x99, 0x23, 0xc9, 0x2b, 0xc6, 0x62, 0xed, 0x64, 0x8e, 0x52, 0x83, 0x6e, 0xce, 0xff, 0xff, 0x39, 0xff, 0x35, 0x2b, 0xfd, 0x15, 0x1b, 0xc1, 0x74, 0x3a, 0xad, 0xa2, 0xec, 0xa2, 0x3e, 0xb3, 0x39, 0xc9, 0x71, 0x8a, 0x39, 0x9e, 0x22, 0x3d, 0x3f, 0xc5, 0x8b, 0x62, 0x5a, 0xa6, 0x9a, 0x75, 0x65, 0xfa, 0x6b, 0xaf, 0x7c, 0x56, 0xb1, 0x1a, 0x0d, 0x10, 0x81, 0x08, 0x69, 0x07, 0xee, 0x27, 0x8c, 0x8d, 0x07, 0x84, 0x7f, 0x0e, 0x01, 0x83, 0x0f, 0x13, 0x62, 0xe3, 0x12, 0x49, 0x44, 0x3f, 0xe2, 0x1d, 0xf8, 0x98, 0xec, 0x06, 0x04, 0xee, 0x85, 0x7d, 0xd2, 0xeb, 0x11, 0x2e, 0x57, 0x7c, 0x1a, 0x77, 0x51, 0x87, 0xb2, 0x6e, 0x5f, 0xea, 0x04, 0x6c, 0x0f, 0x44, 0x14, 0x85, 0xf8, 0x82, 0x98, 0x52, 0xe8, 0x47, 0x23, 0x18, 0x10, 0x36, 0x86, 0x5d, 0xb4, 0x1a, 0xd0, 0x18, 0xba, 0x84, 0x41, 0x2f, 0x1c, 0x03, 0xe1, 0x51, 0xc2, 0x7c, 0x10, 0x7d, 0x0a, 0x71, 0x97, 0x53, 0xca, 0xea, 0x90, 0xc4, 0x52, 0x1b, 0x11, 0x9b, 0xd2, 0x70, 0xc0, 0x86, 0x89, 0xe8, 0xc0, 0x1e, 0x19, 0xd0, 0x21, 0xf1, 0x25, 0x07, 0xe5, 0x82, 0x21, 0xb2, 0xc2, 0xcc, 0xa7, 0x7d, 0xca, 0xe3, 0x20, 0x62, 0x1d, 0x68, 0x35, 0x5b, 0x4d, 0xcf, 0xb6, 0x33, 0x33, 0x5b, 0x81, 0x2f, 0xfa, 0xb0, 0x01, 0x2b, 0x6b, 0x9e, 0xe6, 0x7c, 0x40, 0x83, 0xbd, 0xbe, 0x40, 0x56, 0x6b, 0xb5, 0x6d, 0x4b, 0xdf, 0x76, 0x09, 0x2f, 0x78, 0xc8, 0xc1, 0x37, 0x6a, 0xf7, 0x12, 0xd6, 0x15, 0x68, 0x0e, 0x38, 0x61, 0x7e, 0x34, 0x78, 0x10, 0x46, 0x44, 0x38, 0x61, 0x34, 0xa2, 0xbc, 0x0e, 0x7b, 0x9c, 0x12, 0x41, 0xb9, 0x6b, 0x57, 0x38, 0x15, 0x09, 0x67, 0xe0, 0x0c, 0x88, 0xe8, 0x37, 0x33, 0x49, 0xc7, 0x85, 0x25, 0x70, 0xb4, 0x08, 0x34, 0x40, 0xe9, 0xb8, 0x2e, 0x2c, 0x67, 0xb3, 0xbb, 0x36, 0x65, 0xbe, 0x6d, 0xab, 0xa0, 0x22, 0xd2, 0xb3, 0x91, 0xf4, 0x6f, 0xc3, 0xab, 0xf7, 0x95, 0x07, 0x38, 0x39, 0x40, 0x1a, 0x23, 0xc5, 0x43, 0x4a, 0xfd, 0x4f, 0xf3, 0xc9, 0xb6, 0x9a, 0xf0, 0x40, 0xd0, 0x0d, 0xef, 0xd0, 0xf0, 0x4e, 0xd9, 0xe9, 0x30, 0x3a, 0x72, 0x22, 0x74, 0x27, 0x42, 0x8b, 0x11, 0x44, 0x1c, 0x9e, 0x1d, 0xda, 0x95, 0x98, 0x8a, 0x01, 0x15, 0x44, 0x90, 0xdd, 0x90, 0x3a, 0x51, 0x1d, 0xc3, 0x1f, 0xf6, 0x5c, 0xc9, 0x0e, 0x7b, 0xcd, 0xa7, 0x4f, 0x03, 0xe6, 0xd3, 0x03, 0x14, 0x97, 0x9f, 0x9a, 0x39, 0xca, 0x43, 0xd5, 0xd6, 0x8c, 0x7e, 0x1e, 0x95, 0xd5, 0x15, 0xcd, 0x91, 0x1a, 0xe6, 0x5e, 0xbd, 0x3a, 0x98, 0x61, 0x6e, 0xc0, 0xcc, 0x50, 0x0e, 0x35, 0xbe, 0x4c, 0x45, 0xc7, 0x5c, 0xeb, 0x64, 0x58, 0xb9, 0x52, 0xb6, 0x79, 0xd4, 0x34, 0xa3, 0xdf, 0x68, 0x79, 0xa8, 0x8c, 0x2f, 0x17, 0x6e, 0x43, 0xdb, 0x33, 0x45, 0xb7, 0xaf, 0x29, 0x2a, 0x03, 0x28, 0x33, 0x5f, 0x64, 0x2e, 0xca, 0xd2, 0x31, 0x17, 0x4f, 0x9f, 0x93, 0x91, 0xe3, 0xda, 0x00, 0xa8, 0xe1, 0x18, 0xaa, 0x59, 0x10, 0x9b, 0x07, 0xfa, 0x77, 0x8c, 0x10, 0xea, 0xf1, 0xd4, 0xb3, 0x86, 0x8f, 0x7b, 0xa1, 0xbd, 0x64, 0xe8, 0x63, 0x35, 0x38, 0xae, 0x11, 0x45, 0x3d, 0x59, 0x06, 0x63, 0xbf, 0x46, 0xc4, 0x2e, 0x58, 0xde, 0xb6, 0xed, 0x4a, 0xd0, 0x03, 0xa7, 0xbc, 0x94, 0x25, 0x6d, 0xd3, 0x4c, 0x83, 0x2b, 0x4f, 0x11, 0xb3, 0x2b, 0x06, 0xd8, 0x25, 0x39, 0xca, 0x65, 0x8a, 0x70, 0x9b, 0x5f, 0x4b, 0xd0, 0xc0, 0x38, 0xc9, 0xed, 0x98, 0xb0, 0xeb, 0xe0, 0x9d, 0xb7, 0xef, 0xfd, 0x6d, 0x43, 0xe3, 0xdc, 0x7f, 0x5d, 0x63, 0x9b, 0xa5, 0xa2, 0x28, 0x23, 0x8c, 0x8b, 0x1d, 0x5c, 0x54, 0x32, 0x25, 0xe8, 0xed, 0x12, 0xf4, 0xf6, 0x25, 0xd0, 0xeb, 0x50, 0x3a, 0xf6, 0xe7, 0xd1, 0x4a, 0xcb, 0xd7, 0x04, 0x50, 0x79, 0x7f, 0xf0, 0xd1, 0x23, 0x79, 0xa8, 0xcd, 0x13, 0x8a, 0xac, 0x7f, 0xe8, 0x7c, 0xee, 0x93, 0x30, 0xa1, 0x59, 0xb4, 0xd5, 0x77, 0x8f, 0x63, 0x2f, 0x8c, 0x0d, 0x46, 0x48, 0x62, 0xf1, 0x38, 0x18, 0x68, 0x19, 0x5d, 0xe1, 0x88, 0x3f, 0x57, 0x93, 0xd2, 0xa3, 0x3d, 0x2a, 0x9e, 0x48, 0x73, 0xb2, 0x26, 0x65, 0x64, 0x04, 0xaa, 0x61, 0xe7, 0xd2, 0x91, 0x2d, 0x0c, 0xad, 0x6f, 0xc8, 0x43, 0x34, 0x97, 0xf1, 0x02, 0xd7, 0xfc, 0x5a, 0x96, 0x87, 0x8a, 0x86, 0x31, 0xcd, 0xa5, 0x72, 0x6f, 0x0d, 0xa1, 0x73, 0x06, 0x8a, 0xba, 0x31, 0x3c, 0xcf, 0x3c, 0xd1, 0x49, 0xd3, 0x7b, 0x98, 0x19, 0xd4, 0x5b, 0x19, 0x4a, 0xed, 0x3c, 0xb2, 0xae, 0x9d, 0x5f, 0x26, 0x2a, 0xf4, 0x2a, 0xa0, 0xcd, 0x80, 0xc5, 0x94, 0x0b, 0x47, 0xaf, 0xd4, 0x8d, 0x46, 0xe9, 0xba, 0x46, 0x2c, 0x1e, 0x3f, 0x7c, 0x4f, 0x82, 0xe1, 0xf5, 0x31, 0xc0, 0xeb, 0xa6, 0xab, 0x82, 0x81, 0x1d, 0x0f, 0x5d, 0xcb, 0xb7, 0xac, 0xf8, 0x8e, 0xe7, 0xce, 0xca, 0x48, 0xad, 0xb7, 0x97, 0xda, 0x6b, 0x4b, 0x2b, 0xcd, 0xd5, 0x77, 0xee, 0x94, 0x05, 0x5b, 0xb9, 0xa0, 0xec, 0x9b, 0x42, 0x85, 0x45, 0x99, 0x7f, 0x28, 0xaf, 0x2f, 0xa5, 0xbe, 0x2b, 0x98, 0x33, 0x8b, 0x68, 0x0f, 0xab, 0x21, 0x90, 0x2d, 0xa9, 0x0e, 0x77, 0xc0, 0x8f, 0x90, 0x53, 0xb9, 0xc6, 0x06, 0x2a, 0x19, 0x46, 0xee, 0x91, 0x34, 0xd9, 0x7a, 0x99, 0x49, 0x94, 0x61, 0xf4, 0xa0, 0xb0, 0xe6, 0xc2, 0x97, 0x1b, 0xc0, 0x82, 0x30, 0xd7, 0xc8, 0x31, 0x39, 0x1d, 0x44, 0xfb, 0x74, 0x86, 0x19, 0xc8, 0x6d, 0x6b, 0xac, 0x19, 0xa2, 0xda, 0xcf, 0x27, 0xaa, 0xa5, 0xd9, 0x19, 0x18, 0x4a, 0x0a, 0x3a, 0x90, 0xff, 0x0f, 0x86, 0x24, 0xe0, 0xf1, 0x0c, 0x46, 0xa1, 0xcb, 0x35, 0xa3, 0x05, 0x16, 0x26, 0xde, 0xc7, 0x2e, 0x6b, 0x57, 0xba, 0x61, 0xec, 0xb4, 0xee, 0xb8, 0xd7, 0xb7, 0xa4, 0x9b, 0xb3, 0xb6, 0xc3, 0x69, 0x57, 0x38, 0x59, 0xff, 0x35, 0xba, 0x5c, 0xbd, 0x7c, 0x84, 0x71, 0x19, 0x15, 0xb0, 0x85, 0x33, 0xe1, 0xdc, 0xba, 0x9f, 0x99, 0xec, 0xc0, 0x2d, 0x68, 0x36, 0xe1, 0xcd, 0x62, 0xb3, 0x59, 0x1f, 0x6f, 0xe1, 0x4f, 0x8f, 0x60, 0x1d, 0x2b, 0x86, 0x9a, 0xcd, 0x54, 0x65, 0xc5, 0x65, 0x6a, 0x58, 0x81, 0xc6, 0x19, 0x2a, 0xdf, 0x82, 0xb7, 0x61, 0xe5, 0x72, 0x53, 0xd2, 0xeb, 0xbf, 0x00, 0x73, 0x44, 0xa7, 0x58, \ No newline at end of file +0x78, 0xda, 0xed, 0x56, 0x4f, 0x6f, 0xe3, 0x44, 0x14, 0x77, 0x0f, 0x20, 0xc5, 0x22, 0x52, 0x73, 0x45, 0x1c, 0x9e, 0x16, 0x21, 0xec, 0x36, 0xc9, 0x3a, 0xfd, 0x13, 0x50, 0xb6, 0xad, 0xb4, 0x0b, 0x5a, 0xb1, 0x12, 0x07, 0xc4, 0x2e, 0x5b, 0x2a, 0x51, 0xad, 0xa6, 0xf1, 0xa4, 0xb1, 0x70, 0xc6, 0x61, 0x3c, 0x6e, 0x1a, 0xad, 0xca, 0x91, 0x4f, 0xc0, 0x07, 0xe0, 0x04, 0x57, 0x38, 0x71, 0xe7, 0x86, 0x94, 0x4a, 0xfd, 0x00, 0x75, 0xb5, 0x7c, 0x00, 0xb2, 0x1c, 0x2a, 0x38, 0xc2, 0x9b, 0xf1, 0xd8, 0x19, 0xa7, 0xdb, 0x6d, 0x91, 0x90, 0x00, 0xa9, 0xa3, 0x3c, 0x77, 0xfc, 0xe6, 0xbd, 0xf7, 0x7b, 0xff, 0xe6, 0xb9, 0xaf, 0x79, 0x96, 0xf5, 0xfa, 0x1b, 0xf5, 0xdd, 0xb7, 0x77, 0x7f, 0xd8, 0x7a, 0xf8, 0xfc, 0x68, 0xfb, 0xcf, 0xe3, 0xe4, 0xbb, 0xdf, 0x86, 0xef, 0xfe, 0xe8, 0xbf, 0xf5, 0xc5, 0xd8, 0x6d, 0x47, 0x77, 0x76, 0x7f, 0xbe, 0xfb, 0xed, 0xef, 0xf1, 0xf3, 0x3f, 0xce, 0xcf, 0xcf, 0xbf, 0xfe, 0xfe, 0xa7, 0xc7, 0xe1, 0x57, 0xab, 0x1b, 0xdb, 0x0b, 0xdf, 0xbc, 0x6a, 0x5d, 0xb5, 0x6a, 0xb5, 0x1a, 0xd2, 0x42, 0x8a, 0x74, 0x3c, 0x47, 0x92, 0x97, 0x5a, 0x8b, 0xf8, 0xa8, 0xd6, 0x4e, 0x26, 0x73, 0x74, 0x9a, 0x5a, 0xa9, 0x5c, 0xd2, 0x42, 0x9a, 0x2e, 0xd6, 0x26, 0xa7, 0x65, 0x3a, 0x46, 0x9e, 0xe4, 0x5f, 0xb5, 0xac, 0x9b, 0xf5, 0xaf, 0xae, 0xbc, 0xce, 0x39, 0x2d, 0x58, 0x27, 0xe9, 0x2f, 0xd3, 0x33, 0xa4, 0x29, 0xee, 0x9f, 0x9d, 0x55, 0xb1, 0xc6, 0xd5, 0x54, 0xaf, 0x2a, 0x1e, 0xa6, 0x93, 0x34, 0xa3, 0x6c, 0x9d, 0x60, 0x8d, 0x4f, 0x74, 0xad, 0x33, 0xaa, 0x5a, 0xc5, 0x21, 0xee, 0xe7, 0xeb, 0x2d, 0x3b, 0xa2, 0xaa, 0x69, 0xf1, 0xa6, 0xfe, 0xff, 0x85, 0xfa, 0x4f, 0x5f, 0x46, 0xe9, 0xf1, 0x64, 0x92, 0x4e, 0xe6, 0x48, 0xf2, 0x8a, 0xb5, 0x58, 0x3b, 0x9d, 0xa3, 0xd4, 0xa0, 0x9b, 0xfb, 0xff, 0x7f, 0xae, 0x7f, 0xcd, 0x4a, 0x7f, 0xc5, 0x41, 0x30, 0x9d, 0x4e, 0xab, 0x28, 0xbb, 0xa8, 0xef, 0x6c, 0x4e, 0x72, 0x9d, 0x61, 0x8d, 0xa7, 0x48, 0xcf, 0xce, 0xf0, 0x43, 0x31, 0x2d, 0x53, 0xcd, 0xba, 0xb2, 0xfc, 0xb5, 0x57, 0x3e, 0xab, 0x58, 0x8d, 0x06, 0x88, 0x40, 0x84, 0xb4, 0x03, 0xf7, 0x12, 0xc6, 0xc6, 0x03, 0xc2, 0x3f, 0x87, 0x80, 0xc1, 0x87, 0x09, 0xb1, 0xf1, 0x88, 0x24, 0xa2, 0x1f, 0xf1, 0x0e, 0x7c, 0x4c, 0xf6, 0x02, 0x02, 0x77, 0xc3, 0x3e, 0xe9, 0xf5, 0x08, 0x97, 0x27, 0x3e, 0x8d, 0xbb, 0xa8, 0x43, 0x59, 0xb7, 0x2f, 0x75, 0x02, 0xb6, 0x0f, 0x22, 0x8a, 0x42, 0x7c, 0x40, 0x4c, 0x29, 0xf4, 0xa3, 0x11, 0x0c, 0x08, 0x1b, 0xc3, 0x1e, 0x5a, 0x0d, 0x68, 0x0c, 0x5d, 0xc2, 0xa0, 0x17, 0x8e, 0x81, 0xf0, 0x28, 0x61, 0x3e, 0x88, 0x3e, 0x85, 0xb8, 0xcb, 0x29, 0x65, 0x75, 0x48, 0x62, 0xa9, 0x8d, 0x88, 0x4d, 0x69, 0x38, 0x60, 0xc3, 0x44, 0x74, 0x60, 0x9f, 0x0c, 0xe8, 0x90, 0xf8, 0x92, 0x83, 0x72, 0xc1, 0x10, 0x59, 0x61, 0xe6, 0xd3, 0x01, 0xe5, 0x71, 0x10, 0xb1, 0x0e, 0xb4, 0x9a, 0xad, 0xa6, 0x67, 0xdb, 0x99, 0x99, 0xed, 0xc0, 0x17, 0x7d, 0xd8, 0x84, 0x95, 0x35, 0x4f, 0x73, 0x3e, 0xa0, 0xc1, 0x7e, 0x5f, 0x20, 0xab, 0xb5, 0xda, 0xb6, 0xa5, 0x6f, 0x7b, 0x84, 0x17, 0x3c, 0xe4, 0xe0, 0x13, 0xb5, 0x7b, 0x09, 0xeb, 0x0a, 0x34, 0x07, 0x9c, 0x30, 0x3f, 0x1a, 0xdc, 0x0f, 0x23, 0x22, 0x9c, 0x30, 0x1a, 0x51, 0x5e, 0x87, 0x7d, 0x4e, 0x89, 0xa0, 0xdc, 0xb5, 0x2b, 0x9c, 0x8a, 0x84, 0x33, 0x70, 0x06, 0x44, 0xf4, 0x9b, 0x99, 0xa4, 0xe3, 0xc2, 0x12, 0x38, 0x5a, 0x04, 0x1a, 0xa0, 0x74, 0x5c, 0x17, 0x96, 0xb3, 0xdd, 0x1d, 0x9b, 0x32, 0xdf, 0xb6, 0x55, 0x52, 0x11, 0xe9, 0xe9, 0x48, 0xfa, 0xb7, 0xe9, 0xd5, 0xfb, 0xca, 0x03, 0xdc, 0x1c, 0x22, 0x8d, 0x91, 0xe2, 0x21, 0xa5, 0xfe, 0xa7, 0xf9, 0x66, 0x47, 0x6d, 0x78, 0x20, 0xe8, 0xa6, 0x77, 0x64, 0x78, 0xa7, 0xec, 0x74, 0x18, 0x1d, 0x39, 0x11, 0xba, 0x13, 0xa1, 0xc5, 0x08, 0x22, 0x0e, 0x4f, 0x8f, 0xec, 0x4a, 0x4c, 0xc5, 0x80, 0x0a, 0x22, 0xc8, 0x5e, 0x48, 0x9d, 0xa8, 0x8e, 0xe9, 0x0f, 0x7b, 0xae, 0x64, 0x87, 0xbd, 0xe6, 0x93, 0x27, 0x01, 0xf3, 0xe9, 0x21, 0x8a, 0xcb, 0x57, 0xcd, 0x1c, 0xe5, 0xa9, 0x6a, 0x6b, 0x46, 0x3f, 0xcf, 0xca, 0xea, 0x8a, 0xe6, 0x48, 0x0d, 0x33, 0x56, 0xaf, 0x0e, 0x66, 0x9a, 0x1b, 0x30, 0x33, 0x94, 0x43, 0x8d, 0x2f, 0x53, 0xd1, 0x39, 0xd7, 0x3a, 0x19, 0x56, 0xae, 0x94, 0x05, 0x8f, 0x9a, 0x66, 0xf6, 0x1b, 0x2d, 0x0f, 0x95, 0xf1, 0xe1, 0xc2, 0x6d, 0x68, 0x7b, 0xa6, 0xe8, 0xce, 0x35, 0x45, 0x65, 0x02, 0x65, 0xe5, 0x8b, 0xca, 0x45, 0x59, 0x39, 0xe6, 0xf2, 0xe9, 0x73, 0x32, 0x72, 0x5c, 0x1b, 0x00, 0x35, 0x1c, 0x43, 0x35, 0x4b, 0x62, 0xf3, 0x50, 0xff, 0x1d, 0x23, 0x84, 0xfa, 0x79, 0xea, 0xb7, 0x86, 0x3f, 0xf7, 0x85, 0xf6, 0x92, 0xa1, 0x8f, 0xdd, 0xe0, 0xb8, 0x46, 0x16, 0xf5, 0x66, 0x19, 0x8c, 0x78, 0x8d, 0x8c, 0xe9, 0x8d, 0x79, 0xbc, 0x63, 0xdb, 0x95, 0xa0, 0x07, 0x4e, 0x59, 0x33, 0x2b, 0xda, 0x96, 0x59, 0x06, 0x57, 0xde, 0x22, 0x66, 0x57, 0x0c, 0xb0, 0x4b, 0x6a, 0x94, 0xcb, 0x14, 0xe9, 0x36, 0xdf, 0x96, 0xa0, 0x81, 0x79, 0x92, 0xe1, 0x98, 0xb0, 0x1b, 0xe0, 0x5d, 0xb4, 0xef, 0xfd, 0x6d, 0x43, 0x45, 0x68, 0xba, 0xc7, 0xb6, 0x4a, 0x4d, 0x51, 0x46, 0x18, 0x17, 0x11, 0xbc, 0xa8, 0x65, 0x4a, 0xd0, 0x3b, 0x25, 0xe8, 0x9d, 0x4b, 0xa0, 0x37, 0xa0, 0x74, 0xed, 0x2f, 0xa2, 0x95, 0x8e, 0xaf, 0x09, 0xa0, 0xea, 0x7e, 0xff, 0xa3, 0x87, 0xf2, 0x52, 0x9b, 0x37, 0x14, 0x59, 0xff, 0xd0, 0xfd, 0x3c, 0x20, 0x61, 0x42, 0xb3, 0x6c, 0xab, 0xf7, 0x1e, 0xc7, 0x59, 0x18, 0x1b, 0x8c, 0x90, 0xc4, 0xe2, 0x51, 0x30, 0xd0, 0x32, 0xba, 0xc3, 0x11, 0x7f, 0xae, 0x27, 0xa5, 0x47, 0xfb, 0x54, 0x3c, 0x96, 0xe6, 0x64, 0x4f, 0xca, 0xcc, 0x08, 0x54, 0xc3, 0xc9, 0xa5, 0x33, 0x5b, 0x18, 0xda, 0xd8, 0x94, 0x97, 0x68, 0xae, 0xe2, 0x05, 0xae, 0xf9, 0xb6, 0x2c, 0x2f, 0x15, 0x0d, 0x63, 0x9a, 0x4b, 0xe5, 0xde, 0x1a, 0x42, 0x17, 0x0c, 0x14, 0x7d, 0x63, 0x78, 0x9e, 0x79, 0xa2, 0x8b, 0xa6, 0x63, 0x98, 0x19, 0xd4, 0xa1, 0x0c, 0xa5, 0x76, 0x9e, 0x59, 0xd7, 0xce, 0x3f, 0x26, 0x2a, 0xf5, 0x2a, 0xa1, 0xcd, 0x80, 0xc5, 0x94, 0x0b, 0x47, 0x9f, 0xd4, 0x8d, 0x41, 0xe9, 0xba, 0x46, 0x2e, 0x1e, 0x3d, 0x78, 0x4f, 0x82, 0xe1, 0xe7, 0x63, 0x80, 0x9f, 0x9b, 0xae, 0x4a, 0x06, 0x4e, 0x3c, 0x74, 0x2d, 0x0f, 0x59, 0xf1, 0x1d, 0xcf, 0x9d, 0xb5, 0x91, 0x3a, 0x6f, 0x2f, 0xb5, 0xd7, 0x96, 0x56, 0x9a, 0xab, 0xef, 0xac, 0x97, 0x05, 0x5b, 0xb9, 0xa0, 0x9c, 0x9b, 0x42, 0xa5, 0x45, 0x99, 0x7f, 0x20, 0x3f, 0x5f, 0x4a, 0x7d, 0x4f, 0x30, 0x67, 0x96, 0xd1, 0x1e, 0x76, 0x43, 0x20, 0x47, 0x52, 0x1d, 0xd6, 0xc1, 0x8f, 0x90, 0x53, 0xb9, 0x46, 0x00, 0x95, 0x0c, 0x23, 0xf7, 0x48, 0x9a, 0x6c, 0xbd, 0xcc, 0x24, 0xca, 0x30, 0x7a, 0x58, 0x58, 0x73, 0xe1, 0xcb, 0x4d, 0x60, 0x41, 0x98, 0x6b, 0xe4, 0x98, 0x9c, 0x0e, 0xa2, 0x03, 0x3a, 0xc3, 0x0c, 0x64, 0xd8, 0x1a, 0x6b, 0x86, 0xa8, 0xe2, 0xf9, 0x44, 0x8d, 0x34, 0x3b, 0x03, 0x43, 0x49, 0x41, 0x07, 0xf2, 0xff, 0x83, 0x21, 0x09, 0x78, 0x3c, 0x83, 0x51, 0xe8, 0xf2, 0xcc, 0x18, 0x81, 0x85, 0x89, 0xf7, 0x71, 0xca, 0xda, 0x95, 0x6e, 0x18, 0x3b, 0xad, 0x75, 0xf7, 0xfa, 0x96, 0xf4, 0x70, 0xd6, 0x76, 0x38, 0xed, 0x0a, 0x27, 0x9b, 0xbf, 0xc6, 0x94, 0xab, 0x97, 0xaf, 0x30, 0x1e, 0xa3, 0x02, 0x8e, 0x70, 0x26, 0x9c, 0x5b, 0xf7, 0x32, 0x93, 0x1d, 0xb8, 0x05, 0xcd, 0x26, 0xbc, 0x59, 0x04, 0x9b, 0xcd, 0xf1, 0x16, 0xfe, 0xe9, 0x11, 0xec, 0x63, 0xc5, 0x50, 0xbb, 0x99, 0xaa, 0xec, 0xb8, 0x4c, 0x0d, 0x3b, 0xd0, 0xb8, 0x43, 0xe5, 0xaf, 0xe0, 0x6d, 0x58, 0xb9, 0xdc, 0x94, 0xf4, 0xfa, 0x2f, 0x79, 0x1c, 0xa7, 0x59, \ No newline at end of file From 11c693490551ba7ec4131e6dd8bc30254290dca7 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 6 Jan 2022 18:40:56 +0300 Subject: [PATCH 216/379] added menu mouse handling #1748 --- src/studio/screens/menu.c | 74 +++++++++++++++++++++++++++++++++------ src/studio/screens/menu.h | 1 + src/studio/studio.c | 12 +++---- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index 89056323b..89061a9a1 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -228,6 +228,12 @@ static void updateOption(MenuOption* option, s32 val) option->pos = option->get(); } +static void onMenuItem(Menu* menu, const MenuItem* item) +{ + playSystemSfx(2); + resetMovie(menu, item->back ? &menu->anim.back : &menu->anim.close); +} + static void drawMenu(Menu* menu, s32 x, s32 y) { if (getStudioMode() != TIC_MENU_MODE) @@ -251,7 +257,8 @@ static void drawMenu(Menu* menu, s32 x, s32 y) resetMovie(menu, &menu->anim.down); } - MenuOption* option = menu->items[menu->pos].option; + MenuItem* item = &menu->items[menu->pos]; + MenuOption* option = item->option; if(option) { if(tic_api_btnp(menu->tic, Left, Hold, Period) @@ -278,10 +285,7 @@ static void drawMenu(Menu* menu, s32 x, s32 y) updateOption(option, +1); } else if(menu->items[menu->pos].handler) - { - playSystemSfx(2); - resetMovie(menu, &menu->anim.close); - } + onMenuItem(menu, item); } if((tic_api_btnp(menu->tic, B, -1, -1) @@ -297,12 +301,41 @@ static void drawMenu(Menu* menu, s32 x, s32 y) char buf[TICNAME_MAX]; for(const MenuItem *it = menu->items, *end = it + menu->count; it != end; ++it, ++i) { - s32 len = it->option + s32 width = (it->option ? sprintf(buf, "%s%s", it->label, it->option->values[it->option->pos]) - : sprintf(buf, "%s", it->label); + : sprintf(buf, "%s", it->label)) * TIC_FONT_WIDTH; + + tic_rect rect = {x + (TIC80_WIDTH - width) / 2 + menu->anim.offset, + y + TextMargin + ItemHeight * (i - menu->pos) - menu->anim.pos, width, TIC_FONT_HEIGHT}; - printShadow(tic, buf, x + (TIC80_WIDTH - len * TIC_FONT_WIDTH) / 2 + menu->anim.offset, - y + TextMargin + ItemHeight * (i - menu->pos) - menu->anim.pos, tic_color_white); + bool down = false; + if(animIdle(menu) && checkMousePos(&rect)) + { + setCursor(tic_cursor_hand); + + if(checkMouseDown(&rect, tic_mouse_left) || checkMouseDown(&rect, tic_mouse_right)) + down = true; + + bool left = checkMouseClick(&rect, tic_mouse_left); + if(left || checkMouseClick(&rect, tic_mouse_right)) + { + if(it->option) + { + playSystemSfx(2); + updateOption(it->option, left ? +1 : -1); + } + else if(it->handler) + { + menu->pos = i; + onMenuItem(menu, it); + } + } + } + + if(down) + tic_api_print(tic, buf, rect.x, rect.y + 1, tic_color_white, true, 1, false); + else + printShadow(tic, buf, rect.x, rect.y, tic_color_white); } } @@ -409,6 +442,27 @@ void studio_menu_tick(Menu* menu) processAnim(menu); + // process scroll + if(animIdle(menu)) + { + tic80_input* input = &tic->ram.input; + + if(input->mouse.scrolly) + { + if(tic_api_key(tic, tic_key_ctrl) || tic_api_key(tic, tic_key_shift)) + { + MenuOption* option = menu->items[menu->pos].option; + if(option) + updateOption(option, input->mouse.scrolly < 0 ? -1 : +1); + } + else + { + s32 pos = menu->pos + (input->mouse.scrolly < 0 ? +1 : -1); + menu->pos = CLAMP(pos, 0, menu->count - 1); + } + } + } + if(getStudioMode() != TIC_MENU_MODE) return; @@ -457,7 +511,7 @@ bool studio_menu_back(Menu* menu) if(menu->back) { playSystemSfx(2); - resetMovie(menu, &menu->anim.back); + resetMovie(menu, &menu->anim.back); } return menu->back != NULL; diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index 1603c35cc..c4fada6a6 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -46,6 +46,7 @@ typedef struct MenuOption* option; const char* help; + bool back; } MenuItem; void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 backPos, void(*back)(void*), void* data); diff --git a/src/studio/studio.c b/src/studio/studio.c index 914131d5f..c682e406a 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1229,8 +1229,8 @@ static const MenuItem OptionMenu[] = {"FULLSCREEN ", NULL, &FullscreenOption}, {"VOLUME ", NULL, &VolumeOption}, {"SETUP GAMEPAD", showGamepadMenu}, - {"", NULL}, - {"BACK", showGameMenu}, + {""}, + {"BACK", showGameMenu, .back = true}, }; static void showOptionsMenu(); @@ -1243,7 +1243,7 @@ static const MenuItem GameMenu[] = {"RESET GAME", resetGame}, {"RESUME GAME", hideGameMenu}, {"OPTIONS", showOptionsMenu}, - {"", NULL}, + {""}, {"QUIT TIC-80", exitStudio}, }; @@ -1264,7 +1264,7 @@ static void showOptionsMenu() { enum{Count = COUNT_OF(OptionMenu)}; studio_menu_init(impl.menu, OptionMenu, - Count, Count - 5, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); + Count, Count - 4, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); } static const char* KeysList[] = @@ -1336,10 +1336,10 @@ static void initGamepadMenu() {"X ", NULL, &XKeyOption}, {"Y ", NULL, &YKeyOption}, - {"", NULL}, + {""}, {"SAVE MAPPING", saveGamepadMenu}, {"RESET TO DEFAULTS", resetGamepadMenu}, - {"BACK", showOptionsMenu}, + {"BACK", showOptionsMenu, .back = true}, }; GamepadMapping = getConfig()->options.mapping; From 59e7578213e0e2ac4b5e12f7e2fb6525a58510a0 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 6 Jan 2022 19:07:47 +0300 Subject: [PATCH 217/379] menu mouse fix for inactive items #1748 --- src/studio/screens/menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index 89061a9a1..76216f104 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -309,7 +309,7 @@ static void drawMenu(Menu* menu, s32 x, s32 y) y + TextMargin + ItemHeight * (i - menu->pos) - menu->anim.pos, width, TIC_FONT_HEIGHT}; bool down = false; - if(animIdle(menu) && checkMousePos(&rect)) + if(animIdle(menu) && checkMousePos(&rect) && (it->handler || it->option)) { setCursor(tic_cursor_hand); From e115c12fa2113b132364fc9a6f7baff004fbd94c Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Thu, 6 Jan 2022 12:46:30 -0500 Subject: [PATCH 218/379] Create SECURITY.md I went to see what our security policy was, and we didn't have one, so this is a beginning. I just used the default template and filled in the very basics. Not sure if you'd prefer a nicer email like `security@tic80.com`? Also is there any reason someone should still be running 0.80 or 0.70? Could we mark anything below 0.90 as obsolete? This also has wiki implications as we don't need to mention "added in version 0.2" if someone isn't using version 0.1 anymore, etc... --- SECURITY.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..fea99c816 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,23 @@ +# Security Policy + +## Supported Versions + +Only the latest releases are supported and may receive security updates. +If you aren't using the latest stable version, please upgrade. + +| Version | Status | Supported | +| ---------- | -------- | ------------------ | +| 1.0.x-dev | Alpha | :white_check_mark: | +| 0.90.x | Stable | :white_check_mark: | +| 0.80.x | | :x: | +| 0.70.x | Obsolete | :x: | +| < 0.70 | Obsolete | :x: | + +## Reporting a Vulnerability + +Please open a [new GitHub issue](https://github.com/nesbox/TIC-80/issues/new) to report a vulnerability. + +If you feel your vulnerability is serious and should not +be publically disclosed you may reach out via email: + +grigoruk@gmail.com From b6dcb63b60e0741b911973716ee45e9c636fb41e Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Thu, 6 Jan 2022 18:06:10 -0500 Subject: [PATCH 219/379] fix: prevent cartridges hijacking keyboard events Resolves #1785. This fix captures the current (`input.ram.keyboard`) state in `tick_start` and immediately restores it in `tick_end`. This prevents cartridges from injecting corrupt "previous" states into the keyboard state engine that could be used to hijack keyboard input. When we trust `input.ram.keyboard` after user code has run we open ourselves up to a cartridge: - repeating keyboard events by fake "lifting" a key (which is still held by the user, then registering as separate repeating keypress/releases until the user finally releases the key) - preventing key up events by fake "holding" a key (this prevents the state engine from ever seeing the key release). --- src/core/core.c | 25 +++++++++++++++++++++++-- src/core/core.h | 1 + src/studio/studio.c | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index 3a2c50743..862cda293 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -294,7 +294,18 @@ void tic_api_reset(tic_mem* memory) { tic_core* core = (tic_core*)memory; + // keyboard state is critical and must be preserved across API resets. + // Often `tic_api_reset` is called to effect transitions between modes + // yet we still need to know when the key WAS pressed after the + // transition - to prevent it from counting as a second keypress. + // + // So why presev `now` not `previous`? this is most often called in + // the middle of a tick... so we preserve now, which during `tick_end` + // is copied to previous. This duplicates the prior behavior of + // `ram.input.keyboard` (which existing outside `state`). + u32 kb_now = core->state.keyboard.now.data; ZEROMEM(core->state); + core->state.keyboard.now.data = kb_now; tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); resetVbank(memory); @@ -495,10 +506,17 @@ void tic_core_close(tic_mem* memory) void tic_core_tick_start(tic_mem* memory) { + tic_core* core = (tic_core*)memory; tic_core_sound_tick_start(memory); tic_core_tick_io(memory); - tic_core* core = (tic_core*)memory; + // SECURITY: preserve the system keyboard input state (and restore it + // post-tick, see below) to prevent user cartridges from being able to + // corrupt and take control of the keyboard in nefarious ways. + // + // Related: https://github.com/nesbox/TIC-80/issues/1785 + core->state.keyboard.now.data = core->memory.ram.input.keyboard.data; + core->state.synced = 0; } @@ -508,7 +526,10 @@ void tic_core_tick_end(tic_mem* memory) tic80_input* input = &core->memory.ram.input; core->state.gamepads.previous.data = input->gamepads.data; - core->state.keyboard.previous.data = input->keyboard.data; + // SECURITY: we do not use `memory.ram.input` here because it is + // untrustworthy since the cartridge could have modified it to + // inject artificial keyboard events. + core->state.keyboard.previous.data = core->state.keyboard.now.data; tic_core_sound_tick_end(memory); } diff --git a/src/core/core.h b/src/core/core.h index f2281f37b..18d7cc90c 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -108,6 +108,7 @@ typedef struct struct { tic80_keyboard previous; + tic80_keyboard now; u32 holds[tic_keys_count]; } keyboard; diff --git a/src/studio/studio.c b/src/studio/studio.c index c083dcf7c..e7d57290e 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1991,6 +1991,9 @@ static void renderStudio() tic_core_tick_start(tic); } + // SECURITY: It's important that this comes before `tick` and not after + // to prevent misbehaving cartridges from having an opportunity to + // tamper with the keyboard input. processShortcuts(); // clear screen for all the modes except the Run mode From c5458402bf512a7acb594ca0519fed592909eb83 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 7 Jan 2022 13:37:34 -0500 Subject: [PATCH 220/379] Console: `cd` with no args returns home Resolves #1742. --- src/studio/screens/console.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 292eac471..adf08a1c7 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -1271,8 +1271,9 @@ static void onChangeDirectory(Console* console) tic_fs_isdir_async(console->fs, param, onChangeDirectoryDone, MOVE(data)); return; } + } else { + tic_fs_homedir(console->fs); } - else printBack(console, "\ninvalid dir name"); commandDone(console); } From e88082bc19036958ab25de8b84464ad975dd454e Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 7 Jan 2022 13:50:52 -0500 Subject: [PATCH 221/379] add license, version, site tags --- demos/luademo.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/demos/luademo.lua b/demos/luademo.lua index b4418b954..7c9bf3704 100644 --- a/demos/luademo.lua +++ b/demos/luademo.lua @@ -1,7 +1,10 @@ --- title: game title --- author: game developer --- desc: short description --- script: lua +-- title: game title +-- author: game developer, email, etc. +-- desc: short description +-- site: website link +-- license: MIT License (change this to your license of choice) +-- version: 0.1 +-- script: lua t=0 x=96 From 7d42db35ccdd25fe00173fbe7cff205565ffe8fd Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 7 Jan 2022 14:30:33 -0500 Subject: [PATCH 222/379] support CTRL-A, CTRL-E console editing keystrokes --- src/studio/screens/console.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 292eac471..30fc0ef10 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -3553,11 +3553,15 @@ static void processKeyboard(Console* console) tic_keycode clearKey = tic_key_k; # endif - if(tic_api_key(tic, tic_key_ctrl) - && keyWasPressed(clearKey)) - { - onClsCommand(console); - return; + bool modifier_CTRL = tic_api_key(tic, tic_key_ctrl); + + if (modifier_CTRL) { + if (keyWasPressed(tic_key_a)) processConsoleHome(console); + else if (keyWasPressed(tic_key_e)) processConsoleEnd(console); + else if (keyWasPressed(clearKey)) { + onClsCommand(console); + return; + } } } From 4b20f33b03bd77755c51989663bcb9c048a3235b Mon Sep 17 00:00:00 2001 From: nesbox Date: Sat, 8 Jan 2022 12:34:22 +0300 Subject: [PATCH 223/379] fix for the #1790 --- build/assets/luademo.tic.dat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/assets/luademo.tic.dat b/build/assets/luademo.tic.dat index 1afa0887c..891e2c9ae 100644 --- a/build/assets/luademo.tic.dat +++ b/build/assets/luademo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x91, 0xcd, 0x4a, 0xc3, 0x40, 0x10, 0xc7, 0xb7, 0x7e, 0x1c, 0xb2, 0x37, 0xdf, 0x60, 0x2d, 0x08, 0xa9, 0x4d, 0x69, 0x3e, 0x8a, 0x68, 0x20, 0x5e, 0x54, 0x50, 0x28, 0x14, 0x44, 0xf0, 0x5c, 0xdb, 0xad, 0x0d, 0xc4, 0x34, 0x24, 0x5b, 0x49, 0xde, 0x20, 0x07, 0x1f, 0xc2, 0xa3, 0x84, 0x7d, 0x88, 0x3d, 0xcb, 0xd0, 0x27, 0x29, 0xfb, 0x0c, 0x6e, 0xd2, 0xda, 0xaa, 0x88, 0x1e, 0x7a, 0xf0, 0xe2, 0xec, 0x0e, 0xbb, 0x33, 0xbf, 0xf9, 0x2f, 0x0b, 0xff, 0x3d, 0x84, 0x50, 0xed, 0x79, 0x0b, 0xfd, 0x16, 0x33, 0x50, 0x91, 0xe7, 0x39, 0x2f, 0x8a, 0x82, 0x97, 0xa7, 0x2a, 0x39, 0x88, 0x55, 0x02, 0xcc, 0x65, 0x9e, 0x83, 0x2c, 0x0a, 0x21, 0xf3, 0x17, 0x21, 0x81, 0x0b, 0x10, 0x5c, 0x88, 0xf7, 0xfc, 0x5e, 0x0f, 0x3f, 0xea, 0xe1, 0x83, 0x1e, 0xfd, 0xc7, 0x9f, 0x46, 0xe5, 0x55, 0xe9, 0x5d, 0xb5, 0x5e, 0xab, 0xfb, 0x93, 0xf2, 0x11, 0x90, 0x00, 0xe5, 0xed, 0x0c, 0x38, 0x02, 0xe5, 0xdd, 0x9c, 0x2b, 0xff, 0x8a, 0x65, 0x96, 0x7e, 0x22, 0x31, 0x97, 0x00, 0x52, 0x6e, 0xaa, 0xd7, 0x4e, 0x37, 0xfb, 0xff, 0xf6, 0xce, 0xae, 0x5b, 0x43, 0xad, 0x16, 0x61, 0x3e, 0x0b, 0xa8, 0x4b, 0xc8, 0x7d, 0xff, 0x81, 0x2e, 0x0a, 0xac, 0xba, 0xfd, 0x29, 0x1b, 0x4f, 0x62, 0x77, 0xd1, 0x1d, 0xd2, 0x47, 0x1a, 0x4c, 0x22, 0x1a, 0x97, 0x64, 0x48, 0x93, 0x81, 0x1a, 0x27, 0x89, 0xe2, 0xac, 0xaa, 0x62, 0x3f, 0x62, 0xfe, 0x24, 0x2c, 0xe1, 0xa2, 0x70, 0x49, 0x30, 0xed, 0x63, 0xcc, 0x3c, 0x13, 0xa7, 0xde, 0xc9, 0x11, 0xce, 0x3c, 0xbb, 0x83, 0xf1, 0x68, 0x1a, 0x0e, 0xca, 0x39, 0x72, 0x73, 0x75, 0xa6, 0x37, 0x30, 0xd6, 0xfc, 0x11, 0xb9, 0x63, 0xa1, 0x6e, 0x36, 0x08, 0x1b, 0xd3, 0x90, 0x64, 0x5e, 0xd6, 0xb2, 0x08, 0x0d, 0x87, 0x2b, 0x62, 0xad, 0x49, 0xf3, 0x33, 0xb1, 0x97, 0x24, 0xf5, 0xd2, 0x2f, 0x1a, 0x67, 0x4d, 0x96, 0x1a, 0xac, 0x0d, 0x82, 0x44, 0xb7, 0x9c, 0x06, 0xd6, 0x92, 0x28, 0xd6, 0xad, 0x26, 0x3b, 0x38, 0x32, 0xdb, 0x6d, 0xc7, 0x3c, 0xb4, 0x8d, 0xd4, 0xc8, 0x0c, 0xab, 0x63, 0x38, 0x86, 0xa9, 0x96, 0x6d, 0xd8, 0x6a, 0x26, 0x8a, 0xfd, 0x90, 0xe9, 0xf5, 0xcb, 0x8b, 0x6e, 0xb7, 0x47, 0x6e, 0x7b, 0xd7, 0xdd, 0xf3, 0xfd, 0xba, 0x71, 0xdc, 0x51, 0x5b, 0x41, 0xe6, 0xb1, 0xa6, 0x85, 0xcb, 0x57, 0xdf, 0x00, 0xdf, 0x13, 0x10, 0xf2, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xc1, 0x4e, 0xdb, 0x40, 0x10, 0xdd, 0x94, 0xf6, 0x90, 0xbd, 0xf1, 0x07, 0x53, 0xa4, 0x4a, 0x0e, 0x71, 0x88, 0xed, 0x44, 0xa8, 0x8d, 0xe4, 0x5e, 0xa0, 0x12, 0x48, 0x41, 0x48, 0x08, 0x89, 0xb3, 0xe3, 0x6c, 0xc8, 0xaa, 0x66, 0x1d, 0xd9, 0x1b, 0x1a, 0xff, 0x81, 0x0f, 0x7c, 0x04, 0x47, 0x64, 0xf9, 0xd8, 0x0f, 0xd8, 0x33, 0x5a, 0xf1, 0x25, 0x91, 0xbf, 0x81, 0x59, 0x13, 0x08, 0x54, 0x15, 0x1c, 0x38, 0xf4, 0xd2, 0xd9, 0x1d, 0xed, 0xce, 0xbe, 0x79, 0xfb, 0x46, 0x7a, 0x9b, 0x84, 0x90, 0xc6, 0xf5, 0x07, 0xf2, 0x56, 0xdc, 0x69, 0x8c, 0x3c, 0xcf, 0xcb, 0xa2, 0x28, 0x4a, 0x73, 0x62, 0x59, 0x6a, 0xf5, 0x94, 0x5a, 0x2f, 0xab, 0x3c, 0xd7, 0x55, 0x51, 0xa8, 0x2a, 0xbf, 0x51, 0x95, 0x2e, 0x95, 0x56, 0xa5, 0x52, 0x8f, 0xf9, 0x77, 0xbe, 0x7e, 0x95, 0xaf, 0x9f, 0xf1, 0xc9, 0xff, 0xf8, 0xa7, 0x51, 0x7b, 0x65, 0xbc, 0xab, 0xd7, 0x6d, 0x7d, 0xbf, 0x42, 0x1f, 0x35, 0x51, 0x1a, 0xbd, 0xbd, 0xd3, 0x25, 0xd1, 0xe8, 0xdd, 0xb2, 0x44, 0xff, 0x8a, 0x55, 0x1a, 0x3f, 0x89, 0x5a, 0x56, 0x5a, 0x57, 0xd5, 0x7b, 0xf9, 0xcd, 0xef, 0xef, 0x9b, 0x7f, 0xe3, 0xe3, 0xa7, 0xdf, 0x0d, 0xd2, 0xe9, 0x80, 0xe4, 0x32, 0x62, 0x03, 0x00, 0x38, 0x0f, 0x2e, 0xd8, 0x43, 0x45, 0xf1, 0x39, 0x98, 0xcb, 0x69, 0x9c, 0x0c, 0x56, 0xcf, 0x63, 0x76, 0xc9, 0xa2, 0x78, 0xc6, 0x12, 0x1b, 0xd8, 0x45, 0xc0, 0x23, 0x3c, 0x64, 0xb8, 0x63, 0xfa, 0xc6, 0x2c, 0x0d, 0x0d, 0x1b, 0x52, 0x6c, 0x97, 0x75, 0x99, 0xf0, 0x99, 0xe4, 0xb1, 0x30, 0x68, 0xca, 0x65, 0xfd, 0x37, 0xfc, 0x62, 0x23, 0x73, 0x87, 0x88, 0x8b, 0x9f, 0x06, 0x88, 0x78, 0xc8, 0x44, 0x8a, 0xd8, 0xd1, 0xe1, 0x29, 0x0c, 0x1f, 0x0a, 0xb0, 0xc2, 0x69, 0x20, 0xce, 0x71, 0x88, 0x29, 0x4f, 0x41, 0xc6, 0x90, 0xc5, 0xf3, 0xe4, 0xb1, 0x13, 0xe2, 0x09, 0x84, 0xd3, 0x18, 0x8b, 0x96, 0xe1, 0x5f, 0xb2, 0x24, 0x45, 0x8d, 0x01, 0x38, 0x3b, 0x6e, 0x2d, 0x54, 0xab, 0xa2, 0x54, 0x34, 0x0f, 0x28, 0x95, 0xbe, 0x43, 0x17, 0xfe, 0xb7, 0x5d, 0x9a, 0xf9, 0x5e, 0x9f, 0xd2, 0xc9, 0x5c, 0x84, 0x66, 0x22, 0x38, 0x3d, 0xdc, 0xb3, 0x5a, 0x94, 0x36, 0xf9, 0x04, 0x46, 0x52, 0x58, 0x4e, 0x0b, 0xa5, 0x98, 0x80, 0xcc, 0xcf, 0x3a, 0x2e, 0x30, 0x31, 0x7e, 0x42, 0xdc, 0x35, 0xd2, 0x7e, 0x89, 0x78, 0x2b, 0x64, 0xe1, 0x2f, 0xfe, 0xe0, 0xf4, 0xd6, 0xc8, 0x8a, 0x43, 0x9b, 0x61, 0x94, 0x5a, 0x6e, 0xaf, 0x45, 0x9b, 0xe9, 0x2c, 0xb1, 0xdc, 0xb6, 0xfc, 0xb2, 0xeb, 0x74, 0xbb, 0x3d, 0x67, 0xdb, 0xb3, 0x17, 0x76, 0x66, 0xbb, 0x7d, 0xbb, 0x67, 0x3b, 0xb8, 0x3c, 0xdb, 0xc3, 0x9e, 0x59, 0xc2, 0x85, 0xb4, 0xb6, 0x0e, 0x7e, 0x0c, 0x87, 0xc7, 0x70, 0x76, 0x7c, 0x32, 0xdc, 0xff, 0xbc, 0x65, 0x7f, 0xed, 0xe3, 0x46, 0x50, 0xfa, 0xb2, 0xed, 0x52, 0xf3, 0xeb, 0x3d, 0x22, 0xa5, 0x37, 0xcf, \ No newline at end of file From 3e8c377f187400f2226fddfb5bf0975d417a8e7d Mon Sep 17 00:00:00 2001 From: Jeremiasz Nelz Date: Sat, 8 Jan 2022 14:01:18 +0100 Subject: [PATCH 224/379] Do not default to first language for new carts Do not default to the first available language for new carts. --- src/studio/screens/console.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 352427415..f12792b57 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -1115,8 +1115,8 @@ static void onNewCommandConfirmed(Console* console) } else { - loadDemo(console, 0); - done = true; + printError(console, "\nerror: choose a language for the new cart."); + printUsage(console, console->desc->command); } if(done) printBack(console, "\nnew cart has been created"); @@ -2549,7 +2549,7 @@ static const char HelpUsage[] = "help [" macro("new", \ NULL, \ "creates a new `Hello World` cartridge.", \ - "new [$LANG_NAMES_PIPE$]", \ + "new <$LANG_NAMES_PIPE$>", \ onNewCommand) \ \ macro("load", \ From 6171e0d0644ec68908e3478926a1b90b04cec3c1 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 8 Jan 2022 10:41:25 -0500 Subject: [PATCH 225/379] bring all demo headers into sync --- demos/bunny/jsmark.js | 1 + demos/bunny/luamark.lua | 1 + demos/bunny/moonmark.moon | 1 + demos/bunny/rubymark.rb | 1 + demos/bunny/squirrelmark.nut | 1 + demos/bunny/wrenmark.wren | 1 + demos/fenneldemo.fnl | 13 ++++++++----- demos/jsdemo.js | 11 +++++++---- demos/moondemo.moon | 12 ++++++++---- demos/rubydemo.rb | 12 ++++++++---- demos/squirreldemo.nut | 12 ++++++++---- demos/wrendemo.wren | 12 ++++++++---- 12 files changed, 53 insertions(+), 25 deletions(-) diff --git a/demos/bunny/jsmark.js b/demos/bunny/jsmark.js index eea7ad059..4735271d6 100644 --- a/demos/bunny/jsmark.js +++ b/demos/bunny/jsmark.js @@ -1,6 +1,7 @@ // title: Bunnymark in JavaScript // author: Rob Loach // desc: Benchmarking tool to see how many bunnies can fly around the screen, using JavaScript. +// license: MIT License // input: gamepad // script: js // version: 1.1.0 diff --git a/demos/bunny/luamark.lua b/demos/bunny/luamark.lua index 7ab147142..215e4a468 100644 --- a/demos/bunny/luamark.lua +++ b/demos/bunny/luamark.lua @@ -1,6 +1,7 @@ -- title: Bunnymark in Lua -- author: Rabia Alhaffar -- desc: Benchmarking tool to see how many bunnies can fly around the screen, using Lua. +-- license: MIT License -- input: gamepad -- script: lua -- version: 1.1.0 diff --git a/demos/bunny/moonmark.moon b/demos/bunny/moonmark.moon index acb177eb6..b90f338f6 100644 --- a/demos/bunny/moonmark.moon +++ b/demos/bunny/moonmark.moon @@ -1,6 +1,7 @@ -- title: Bunnymark in MoonScript -- author: Rob Loach -- desc: Benchmarking tool to see how many bunnies can fly around the screen, using MoonScript. +-- license: MIT License -- input: gamepad -- script: moon -- version: 1.1.0 diff --git a/demos/bunny/rubymark.rb b/demos/bunny/rubymark.rb index a6219a9f8..664cd01b8 100644 --- a/demos/bunny/rubymark.rb +++ b/demos/bunny/rubymark.rb @@ -1,6 +1,7 @@ # title: Bunnymark in Ruby # author: Jeremiasz Nelz; based on the original work of Rob Loach # desc: Benchmarking tool to see how many bunnies can fly around the screen, using Ruby. +# license: MIT License # input: gamepad # script: ruby # version: 0.1.0 diff --git a/demos/bunny/squirrelmark.nut b/demos/bunny/squirrelmark.nut index 6f454b8b5..53df47802 100644 --- a/demos/bunny/squirrelmark.nut +++ b/demos/bunny/squirrelmark.nut @@ -1,6 +1,7 @@ // title: Bunnymark in Squirrel // author: Rob Loach // desc: Benchmarking tool to see how many bunnies can fly around the screen, using Squirrel. +// license: MIT License // input: gamepad // script: squirrel // version: 1.1.0 diff --git a/demos/bunny/wrenmark.wren b/demos/bunny/wrenmark.wren index e5c1fab98..923473e6c 100644 --- a/demos/bunny/wrenmark.wren +++ b/demos/bunny/wrenmark.wren @@ -1,6 +1,7 @@ // title: Bunnymark in Wren // author: Rob Loach // desc: Benchmarking tool to see how many bunnies can fly around the screen, using Wren. +// license: MIT License // input: gamepad // script: wren // version: 1.1.0 diff --git a/demos/fenneldemo.fnl b/demos/fenneldemo.fnl index aa73f312d..befb31103 100644 --- a/demos/fenneldemo.fnl +++ b/demos/fenneldemo.fnl @@ -1,8 +1,11 @@ -;; title: game title -;; author: game developer -;; desc: short description -;; script: fennel -;; strict: true +;; title: game title +;; author: game developer, email, etc. +;; desc: short description +;; site: website link +;; license: MIT License (change this to your license of choice) +;; version: 0.1 +;; script: fennel +;; strict: true (var t 0) (var x 96) diff --git a/demos/jsdemo.js b/demos/jsdemo.js index f36bec0a6..76017b8f7 100644 --- a/demos/jsdemo.js +++ b/demos/jsdemo.js @@ -1,7 +1,10 @@ -// title: game title -// author: game developer -// desc: short description -// script: js +// title: game title +// author: game developer, email, etc. +// desc: short description +// site: website link +// license: MIT License (change this to your license of choice) +// version: 0.1 +// script: js var t=0 var x=96 diff --git a/demos/moondemo.moon b/demos/moondemo.moon index 03969f6b2..e68cfbc22 100644 --- a/demos/moondemo.moon +++ b/demos/moondemo.moon @@ -1,7 +1,11 @@ --- title: game title --- author: game developer --- desc: short description --- script: moon +-- title: game title +-- author: game developer, email, etc. +-- desc: short description +-- site: website link +-- license: MIT License (change this to your license of choice) +-- version: 0.1 +-- script: moon + t=0 x=96 diff --git a/demos/rubydemo.rb b/demos/rubydemo.rb index 8483bf08c..d29e64d8e 100644 --- a/demos/rubydemo.rb +++ b/demos/rubydemo.rb @@ -1,7 +1,11 @@ -# title: game title -# author: game developer -# desc: short description -# script: ruby +# title: game title +# author: game developer, email, etc. +# desc: short description +# site: website link +# license: MIT License (change this to your license of choice) +# version: 0.1 +# script: ruby + $t=0 $x=96 diff --git a/demos/squirreldemo.nut b/demos/squirreldemo.nut index 1aa9e3eee..421bf453e 100644 --- a/demos/squirreldemo.nut +++ b/demos/squirreldemo.nut @@ -1,7 +1,11 @@ -// title: game title -// author: game developer -// desc: short description -// script: squirrel +// title: game title +// author: game developer, email, etc. +// desc: short description +// site: website link +// license: MIT License (change this to your license of choice) +// version: 0.1 +// script: squirrel + t<-0 x<-96 diff --git a/demos/wrendemo.wren b/demos/wrendemo.wren index 1b0478061..1ba0b5735 100644 --- a/demos/wrendemo.wren +++ b/demos/wrendemo.wren @@ -1,7 +1,11 @@ -// title: game title -// author: game developer -// desc: short description -// script: wren +// title: game title +// author: game developer, email, etc. +// desc: short description +// site: website link +// license: MIT License (change this to your license of choice) +// version: 0.1 +// script: wren + class Game is TIC{ From a8570896b5d06fb5e0c94c64355e867982f9c76a Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 8 Jan 2022 10:43:20 -0500 Subject: [PATCH 226/379] Update demos/moondemo.moon --- demos/moondemo.moon | 1 - 1 file changed, 1 deletion(-) diff --git a/demos/moondemo.moon b/demos/moondemo.moon index e68cfbc22..7a434071b 100644 --- a/demos/moondemo.moon +++ b/demos/moondemo.moon @@ -6,7 +6,6 @@ -- version: 0.1 -- script: moon - t=0 x=96 y=24 From aa43bfbda0d2fad4f63c0acdb9e2d80e9cc40373 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 8 Jan 2022 10:43:41 -0500 Subject: [PATCH 227/379] Update demos/rubydemo.rb --- demos/rubydemo.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/demos/rubydemo.rb b/demos/rubydemo.rb index d29e64d8e..a28b412c8 100644 --- a/demos/rubydemo.rb +++ b/demos/rubydemo.rb @@ -6,7 +6,6 @@ # version: 0.1 # script: ruby - $t=0 $x=96 $y=24 From 6b9582a7f655eb76c4a2f0c28d3932c4fd97c4ca Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 8 Jan 2022 10:44:09 -0500 Subject: [PATCH 228/379] remove extra CR --- demos/squirreldemo.nut | 1 - demos/wrendemo.wren | 1 - 2 files changed, 2 deletions(-) diff --git a/demos/squirreldemo.nut b/demos/squirreldemo.nut index 421bf453e..1b7d87821 100644 --- a/demos/squirreldemo.nut +++ b/demos/squirreldemo.nut @@ -6,7 +6,6 @@ // version: 0.1 // script: squirrel - t<-0 x<-96 y<-24 diff --git a/demos/wrendemo.wren b/demos/wrendemo.wren index 1ba0b5735..d992459a8 100644 --- a/demos/wrendemo.wren +++ b/demos/wrendemo.wren @@ -6,7 +6,6 @@ // version: 0.1 // script: wren - class Game is TIC{ construct new(){ From 5fc39727906d272c8eadd797938c9af2c711e2f9 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sat, 8 Jan 2022 18:24:24 +0300 Subject: [PATCH 229/379] menu options mouse handling #1748 --- src/studio/screens/menu.c | 88 +++++++++++++++++++++++++++++++-------- src/studio/screens/menu.h | 7 ++-- src/studio/studio.c | 58 +++++++++++++------------- 3 files changed, 103 insertions(+), 50 deletions(-) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index 76216f104..ab8828c91 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -86,6 +86,12 @@ struct Menu ANIM_STATES(ANIM_MOVIE) } anim; + + struct + { + s32 item; + s32 option; + } maxwidth; }; #define BG_ANIM_COLOR tic_color_dark_grey @@ -234,6 +240,35 @@ static void onMenuItem(Menu* menu, const MenuItem* item) resetMovie(menu, item->back ? &menu->anim.back : &menu->anim.close); } +static void drawOptionArrow(Menu* menu, MenuOption* option, s32 x, s32 y, s32 icon, s32 delta) +{ + tic_rect left = {x - 1, y, TIC_FONT_WIDTH, TIC_FONT_HEIGHT}; + bool down = false; + bool over = false; + if(checkMousePos(&left)) + { + over = true; + setCursor(tic_cursor_hand); + down = checkMouseDown(&left, tic_mouse_left); + + if(checkMouseClick(&left, tic_mouse_left)) + { + playSystemSfx(2); + updateOption(option, delta); + } + } + + if(down) + { + drawBitIcon(icon, left.x, left.y, tic_color_white); + } + else + { + drawBitIcon(icon, left.x, left.y, tic_color_black); + drawBitIcon(icon, left.x, left.y - 1, over ? tic_color_white : tic_color_light_grey); + } +} + static void drawMenu(Menu* menu, s32 x, s32 y) { if (getStudioMode() != TIC_MENU_MODE) @@ -298,33 +333,24 @@ static void drawMenu(Menu* menu, s32 x, s32 y) } s32 i = 0; - char buf[TICNAME_MAX]; for(const MenuItem *it = menu->items, *end = it + menu->count; it != end; ++it, ++i) { - s32 width = (it->option - ? sprintf(buf, "%s%s", it->label, it->option->values[it->option->pos]) - : sprintf(buf, "%s", it->label)) * TIC_FONT_WIDTH; + s32 width = it->option ? menu->maxwidth.item + menu->maxwidth.option + 3 * TIC_FONT_WIDTH : it->width; tic_rect rect = {x + (TIC80_WIDTH - width) / 2 + menu->anim.offset, - y + TextMargin + ItemHeight * (i - menu->pos) - menu->anim.pos, width, TIC_FONT_HEIGHT}; + y + TextMargin + ItemHeight * (i - menu->pos) - menu->anim.pos, it->width, TIC_FONT_HEIGHT}; bool down = false; - if(animIdle(menu) && checkMousePos(&rect) && (it->handler || it->option)) + if(animIdle(menu) && checkMousePos(&rect) && it->handler) { setCursor(tic_cursor_hand); - if(checkMouseDown(&rect, tic_mouse_left) || checkMouseDown(&rect, tic_mouse_right)) + if(checkMouseDown(&rect, tic_mouse_left)) down = true; - bool left = checkMouseClick(&rect, tic_mouse_left); - if(left || checkMouseClick(&rect, tic_mouse_right)) + if(checkMouseClick(&rect, tic_mouse_left)) { - if(it->option) - { - playSystemSfx(2); - updateOption(it->option, left ? +1 : -1); - } - else if(it->handler) + if(it->handler) { menu->pos = i; onMenuItem(menu, it); @@ -333,9 +359,19 @@ static void drawMenu(Menu* menu, s32 x, s32 y) } if(down) - tic_api_print(tic, buf, rect.x, rect.y + 1, tic_color_white, true, 1, false); + tic_api_print(tic, it->label, rect.x, rect.y + 1, tic_color_white, true, 1, false); else - printShadow(tic, buf, rect.x, rect.y, tic_color_white); + printShadow(tic, it->label, rect.x, rect.y, tic_color_white); + + if(it->option) + { + drawOptionArrow(menu, it->option, rect.x + menu->maxwidth.item + TIC_FONT_WIDTH, rect.y, tic_icon_left, -1); + drawOptionArrow(menu, it->option, + rect.x + menu->maxwidth.item + menu->maxwidth.option + 2 * TIC_FONT_WIDTH, rect.y, tic_icon_right, +1); + + printShadow(tic, it->option->values[it->option->pos], + rect.x + menu->maxwidth.item + 2 * TIC_FONT_WIDTH, rect.y, tic_color_yellow); + } } } @@ -470,7 +506,7 @@ void studio_menu_tick(Menu* menu) VBANK(tic, 1) { - tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_yellow); + tic_api_cls(tic, tic->ram.vram.vars.clear = tic_color_blue); memcpy(tic->ram.vram.palette.data, getConfig()->cart->bank0.palette.vbank0.data, sizeof(tic_palette)); drawCursor(menu, 0, (TIC80_HEIGHT - ItemHeight) / 2); @@ -500,8 +536,24 @@ void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 memcpy(menu->items, items, size); for(MenuItem *it = menu->items, *end = it + menu->count; it != end; ++it) + { + it->width = strlen(it->label) * TIC_FONT_WIDTH; + if(it->option) + { + if(menu->maxwidth.item < it->width) + menu->maxwidth.item = it->width; + + for(const char **opt = it->option->values, **end = opt + it->option->count; opt != end; ++opt) + { + s32 len = strlen(*opt) * TIC_FONT_WIDTH; + if(menu->maxwidth.option < len) + menu->maxwidth.option = len; + } + it->option->pos = it->option->get(); + } + } resetMovie(menu, &menu->anim.start); } diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index c4fada6a6..8001d2996 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -32,11 +32,11 @@ void studio_menu_tick(Menu* menu); typedef struct { - const char** values; - s32 count; + const char** values; + s32 count; s32(*get)(); void(*set)(s32); - s32 pos; + s32 pos; } MenuOption; typedef struct @@ -47,6 +47,7 @@ typedef struct MenuOption* option; const char* help; bool back; + s32 width; } MenuItem; void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 backPos, void(*back)(void*), void* data); diff --git a/src/studio/studio.c b/src/studio/studio.c index c682e406a..5a11f2e06 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1148,8 +1148,8 @@ static void optionFullscreenSet(s32 pos) tic_sys_fullscreen_set(impl.config->data.options.fullscreen = (pos == 1)); } -static const char OffValue[] = ""; -static const char OnValue[] = " "; +static const char OffValue[] = "OFF"; +static const char OnValue[] = "ON"; static MenuOption FullscreenOption = { @@ -1209,10 +1209,10 @@ static MenuOption VolumeOption = { OPTION_VALUES( { - "<00> ", "<01> ", "<02> ", "<03> ", - "<04> ", "<05> ", "<06> ", "<07> ", - "<08> ", "<09> ", "<10> ", "<11> ", - "<12> ", "<13> ", "<14> ", "<15> ", + "00", "01", "02", "03", + "04", "05", "06", "07", + "08", "09", "10", "11", + "12", "13", "14", "15", }), optionVolumeGet, optionVolumeSet, @@ -1223,11 +1223,11 @@ static void showGamepadMenu(); static const MenuItem OptionMenu[] = { #if defined(CRT_SHADER_SUPPORT) - {"CRT MONITOR ", NULL, &CrtMonitorOption}, + {"CRT MONITOR", NULL, &CrtMonitorOption}, #endif - {"VSYNC ", NULL, &VSyncOption, "VSYNC needs restart!"}, - {"FULLSCREEN ", NULL, &FullscreenOption}, - {"VOLUME ", NULL, &VolumeOption}, + {"VSYNC", NULL, &VSyncOption, "VSYNC needs restart!"}, + {"FULLSCREEN", NULL, &FullscreenOption}, + {"VOLUME", NULL, &VolumeOption}, {"SETUP GAMEPAD", showGamepadMenu}, {""}, {"BACK", showGameMenu, .back = true}, @@ -1269,17 +1269,17 @@ static void showOptionsMenu() static const char* KeysList[] = { - "<...> ", - " ", " ", " ", " ", " ", " ", " ", " ", - " ", " ", " ", " ", " ", " ", " ", "

", - " ", " ", " ", " ", " ", " ", " ", " ", - " ", " ", "<0> ", "<1> ", "<2> ", "<3> ", "<4> ", "<5> ", - "<6> ", "<7> ", "<8> ", "<9> ", "<-> ", "<=> ", "<[> ", "<]> ", - "<\\> ","<;> ", "<'> ", "<`> ", "<,> ", "<.> ", " ", "", - " ", " ", "", " ", " ", " ", " ", " ", - " ", " ", " ", " ", "", " ", " ", "", - " ", " ", " ", " ", " ", " ", " ", " ", - " ", " ", " ", " ", " ", " ", + "...", + "A", "B", "C", "D", "E", "F", "G", "H", + "I", "J", "K", "L", "M", "N", "O", "P", + "Q", "R", "S", "T", "U", "V", "W", "X", + "Y", "Z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "-", "=", "[", "]", + "\\", ";", "'", "`", ",", ".", "/", "SPACE", + "TAB", "RET", "BACKS","DEL", "INS", "PGUP", "PGDN", "HOME", + "END", "UP", "DOWN", "LEFT", "RIGHT","CAPS", "CTRL", "SHIFT", + "ALT", "ESC", "F1", "F2", "F3", "F4", "F5", "F6", + "F7", "F8", "F9", "F10", "F11", "F12", }; static tic_mapping GamepadMapping; @@ -1327,14 +1327,14 @@ static void initGamepadMenu() { static const MenuItem GamepadMenu[] = { - {"UP ", NULL, &UpKeyOption}, - {"DOWN ", NULL, &DownKeyOption}, - {"LEFT ", NULL, &LeftKeyOption}, - {"RIGHT ", NULL, &RightKeyOption}, - {"A ", NULL, &AKeyOption}, - {"B ", NULL, &BKeyOption}, - {"X ", NULL, &XKeyOption}, - {"Y ", NULL, &YKeyOption}, + {"UP", NULL, &UpKeyOption}, + {"DOWN", NULL, &DownKeyOption}, + {"LEFT", NULL, &LeftKeyOption}, + {"RIGHT", NULL, &RightKeyOption}, + {"A", NULL, &AKeyOption}, + {"B", NULL, &BKeyOption}, + {"X", NULL, &XKeyOption}, + {"Y", NULL, &YKeyOption}, {""}, {"SAVE MAPPING", saveGamepadMenu}, From 500d21ea04f45803b96d4ea84ad0041e8f8367f0 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 8 Jan 2022 11:23:35 -0500 Subject: [PATCH 230/379] apply same protection to gamepad data --- src/core/core.c | 11 +++++++---- src/core/core.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/core/core.c b/src/core/core.c index 862cda293..9096e0d3c 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -510,12 +510,14 @@ void tic_core_tick_start(tic_mem* memory) tic_core_sound_tick_start(memory); tic_core_tick_io(memory); - // SECURITY: preserve the system keyboard input state (and restore it - // post-tick, see below) to prevent user cartridges from being able to - // corrupt and take control of the keyboard in nefarious ways. + // SECURITY: preserve the system keyboard/game controller input state + // (and restore it post-tick, see below) to prevent user cartridges + // from being able to corrupt and take control of the inputs in + // nefarious ways. // // Related: https://github.com/nesbox/TIC-80/issues/1785 core->state.keyboard.now.data = core->memory.ram.input.keyboard.data; + core->state.gamepads.now.data = core->memory.ram.input.gamepads.data; core->state.synced = 0; } @@ -528,8 +530,9 @@ void tic_core_tick_end(tic_mem* memory) core->state.gamepads.previous.data = input->gamepads.data; // SECURITY: we do not use `memory.ram.input` here because it is // untrustworthy since the cartridge could have modified it to - // inject artificial keyboard events. + // inject artificial keyboard/gamepad events. core->state.keyboard.previous.data = core->state.keyboard.now.data; + core->state.gamepads.previous.data = core->state.gamepads.now.data; tic_core_sound_tick_end(memory); } diff --git a/src/core/core.h b/src/core/core.h index 18d7cc90c..27dae14e2 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -101,6 +101,7 @@ typedef struct struct { tic80_gamepads previous; + tic80_gamepads now; u32 holds[sizeof(tic80_gamepads) * BITS_IN_BYTE]; } gamepads; From 26ac3c48a0cfaff3359bbf8fbdeb443895ef1b53 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sat, 8 Jan 2022 19:43:59 +0300 Subject: [PATCH 231/379] fix for the #1793 --- build/assets/fenneldemo.tic.dat | 2 +- build/assets/jsdemo.tic.dat | 2 +- build/assets/jsmark.tic.dat | 2 +- build/assets/luamark.tic.dat | 2 +- build/assets/moondemo.tic.dat | 2 +- build/assets/moonmark.tic.dat | 2 +- build/assets/rubydemo.tic.dat | 2 +- build/assets/rubymark.tic.dat | 2 +- build/assets/squirreldemo.tic.dat | 2 +- build/assets/squirrelmark.tic.dat | 2 +- build/assets/wrendemo.tic.dat | 2 +- build/assets/wrenmark.tic.dat | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build/assets/fenneldemo.tic.dat b/build/assets/fenneldemo.tic.dat index 9f5e68dc7..59b47b944 100644 --- a/build/assets/fenneldemo.tic.dat +++ b/build/assets/fenneldemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0x3b, 0x4b, 0xc3, 0x50, 0x14, 0x4e, 0x05, 0x97, 0xe2, 0x2f, 0x10, 0x87, 0xa3, 0x50, 0x4c, 0x7c, 0xf6, 0x45, 0xd1, 0x56, 0x04, 0x51, 0x51, 0xa1, 0x20, 0xa8, 0xd8, 0x41, 0x8a, 0xd4, 0xf6, 0xaa, 0x81, 0x98, 0xc6, 0xe4, 0x56, 0xeb, 0xe0, 0x2a, 0x19, 0x1c, 0x1d, 0x1d, 0x9c, 0x54, 0x42, 0x06, 0x9d, 0x5c, 0x2f, 0x6e, 0xca, 0xb5, 0xbf, 0xa4, 0xa4, 0x0e, 0x45, 0x47, 0x3d, 0x37, 0xa9, 0x2f, 0x28, 0x3a, 0x38, 0xb8, 0x78, 0x6e, 0x4e, 0x72, 0x1e, 0xdf, 0x77, 0xce, 0x0d, 0x5f, 0x57, 0x54, 0x92, 0xba, 0x7b, 0x86, 0xf2, 0xfd, 0xf9, 0xeb, 0xc9, 0xe5, 0xc6, 0x61, 0xee, 0xe5, 0xa1, 0x72, 0xf1, 0x68, 0x8c, 0xdd, 0x94, 0x22, 0xbb, 0x07, 0x4a, 0xaa, 0x9c, 0xc9, 0xdf, 0x4d, 0x9d, 0x3f, 0x59, 0x8d, 0xe7, 0x66, 0xb3, 0x79, 0x72, 0x75, 0xbb, 0xaa, 0x1d, 0x25, 0x26, 0x72, 0xa1, 0xb3, 0x0e, 0xe9, 0x27, 0xab, 0x71, 0x34, 0xdb, 0xb6, 0x5d, 0xc7, 0x71, 0x5c, 0xf1, 0xc5, 0xd4, 0xe5, 0xec, 0xdd, 0x39, 0xaf, 0x7b, 0xb6, 0xcd, 0x3d, 0xc7, 0x61, 0x9e, 0x7d, 0xc9, 0x3c, 0xee, 0x32, 0xce, 0x5c, 0xc6, 0xde, 0xbc, 0x3d, 0x9f, 0x7f, 0xcb, 0xe7, 0x9f, 0xf8, 0xd2, 0xbf, 0xfd, 0xa9, 0xf9, 0x5a, 0x09, 0xed, 0xfc, 0x73, 0xef, 0xc7, 0xc7, 0xa8, 0x23, 0x97, 0x18, 0x47, 0x6d, 0x6b, 0xdc, 0x95, 0x38, 0x6a, 0x57, 0x77, 0x51, 0x3f, 0xa7, 0xe5, 0x42, 0x4f, 0x89, 0xd5, 0x3d, 0xce, 0x3d, 0xef, 0xb7, 0xfc, 0xce, 0xd3, 0x90, 0x94, 0xc9, 0x00, 0x55, 0xa9, 0x46, 0xd2, 0x00, 0x5b, 0x85, 0x1d, 0x12, 0x24, 0x61, 0xac, 0x16, 0x2a, 0x74, 0xbb, 0x6c, 0xa6, 0x83, 0x6a, 0x89, 0xec, 0x11, 0xad, 0x6c, 0x10, 0x53, 0x74, 0x4a, 0xc4, 0x2a, 0x22, 0x1c, 0x2c, 0xec, 0x53, 0x3f, 0x33, 0x55, 0x83, 0xaa, 0x65, 0x5d, 0x34, 0x83, 0x24, 0x0d, 0x9b, 0x44, 0xd7, 0x89, 0xe6, 0x57, 0xa8, 0xa9, 0x16, 0xb1, 0x42, 0xcd, 0x0a, 0x09, 0x87, 0xe5, 0xbd, 0x82, 0x09, 0x14, 0xa2, 0x4a, 0x10, 0x55, 0x61, 0x3c, 0xd5, 0x0a, 0x0f, 0x20, 0x9e, 0x54, 0x10, 0xb0, 0xa9, 0xc3, 0xfa, 0xdc, 0xc8, 0xca, 0xc2, 0x34, 0xac, 0xe5, 0xc3, 0x00, 0xf2, 0xfe, 0x36, 0xd1, 0x41, 0xde, 0xa0, 0x3a, 0x92, 0x40, 0xb6, 0x08, 0x45, 0xa4, 0x3c, 0x8c, 0xaf, 0x98, 0xa2, 0x28, 0x5f, 0x01, 0xb1, 0x0f, 0xc0, 0x60, 0x5b, 0x40, 0xbc, 0x05, 0xa8, 0x8a, 0x09, 0xd5, 0x36, 0x80, 0xc4, 0x07, 0x60, 0xf0, 0x13, 0xa0, 0xa8, 0x59, 0xe2, 0xca, 0x18, 0x59, 0x86, 0x29, 0x5a, 0x31, 0x90, 0x07, 0x40, 0x1e, 0x1d, 0x05, 0x39, 0x82, 0x7f, 0x93, 0xc2, 0x9b, 0x25, 0xd0, 0xe3, 0x3e, 0xda, 0xb7, 0xaa, 0xd8, 0x9f, 0x84, 0x04, 0x44, 0xf1, 0xc4, 0xb1, 0x23, 0xc8, 0x86, 0xa9, 0xea, 0x14, 0xfa, 0xe6, 0x67, 0xb3, 0xd9, 0x45, 0xc8, 0x2d, 0x2e, 0x65, 0x67, 0x7a, 0xfb, 0x60, 0x2c, 0x89, 0x4f, 0x30, 0x1b, 0x17, 0x53, 0x31, 0x9d, 0x06, 0x8b, 0x5f, 0x01, 0x32, 0x49, 0x3b, 0x34, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xbf, 0x6f, 0xd3, 0x40, 0x14, 0x36, 0x95, 0x58, 0x22, 0x76, 0x24, 0xc4, 0xf0, 0xa8, 0x54, 0x61, 0xd3, 0x92, 0xe6, 0x97, 0xa2, 0x92, 0x20, 0x24, 0x04, 0x08, 0x2a, 0x05, 0x55, 0x82, 0x8a, 0x0c, 0x28, 0x42, 0xae, 0x73, 0xa9, 0x4f, 0xb8, 0x67, 0x73, 0x77, 0x49, 0x93, 0x81, 0x15, 0x79, 0x60, 0xe4, 0x0f, 0x60, 0x02, 0x64, 0x79, 0x80, 0x89, 0xd5, 0x62, 0x03, 0x1d, 0xfd, 0x4b, 0x22, 0x97, 0x21, 0x82, 0x11, 0xde, 0x9d, 0x53, 0x5a, 0xa4, 0x08, 0x06, 0x06, 0x16, 0xde, 0xf9, 0xd9, 0xef, 0xc7, 0xf7, 0xbd, 0xef, 0xac, 0x77, 0xa6, 0x62, 0x59, 0xe7, 0xce, 0xaf, 0xf5, 0x2e, 0xf6, 0xde, 0x5d, 0xbb, 0x7f, 0xf8, 0xb4, 0xfb, 0xfd, 0xf3, 0xf0, 0xf5, 0x97, 0x68, 0xe3, 0x7d, 0x7f, 0xe5, 0xc9, 0xc4, 0x69, 0x86, 0xed, 0xde, 0xc7, 0xeb, 0xaf, 0xbe, 0x8a, 0xc3, 0x6f, 0xb3, 0xd9, 0xec, 0xc5, 0xdb, 0x0f, 0x0f, 0x82, 0x67, 0xf5, 0xab, 0xdd, 0x53, 0x2f, 0x97, 0xac, 0x3f, 0xd9, 0x81, 0x42, 0x8b, 0xe3, 0x38, 0x4d, 0x92, 0x24, 0xd5, 0x5f, 0x4c, 0x53, 0x95, 0xfd, 0x74, 0xa5, 0xa6, 0x79, 0x1c, 0xab, 0x3c, 0x49, 0xb2, 0x3c, 0x7e, 0x93, 0xe5, 0x2a, 0xcd, 0x54, 0x96, 0x66, 0xd9, 0x91, 0x2f, 0xe6, 0xab, 0xdf, 0xf2, 0xd5, 0x09, 0xbe, 0xf5, 0xdf, 0xfe, 0xa9, 0x99, 0x5d, 0xe9, 0xdd, 0x99, 0xf3, 0xc9, 0xc4, 0xcf, 0x71, 0x8f, 0xca, 0xca, 0x14, 0xee, 0xf6, 0x40, 0xa5, 0x96, 0xc2, 0xdd, 0x4d, 0x53, 0xdc, 0x5f, 0x32, 0x77, 0xbd, 0x4f, 0x2b, 0x9b, 0xe6, 0x4a, 0xe5, 0xf9, 0xdf, 0xf2, 0x4f, 0x9f, 0x5d, 0xb2, 0xda, 0x6d, 0x90, 0x54, 0x06, 0xa4, 0x05, 0x00, 0xbb, 0xee, 0x1e, 0x29, 0xb2, 0x12, 0x96, 0xdd, 0xa1, 0xf4, 0x43, 0xde, 0x9a, 0x97, 0xfb, 0x64, 0x44, 0x82, 0x30, 0x22, 0x7c, 0x0d, 0xc8, 0x9e, 0x4b, 0x03, 0xfc, 0x48, 0xaf, 0xac, 0x71, 0x7d, 0x22, 0x3c, 0xcd, 0x06, 0x81, 0x70, 0x69, 0x52, 0x4e, 0x23, 0x49, 0x43, 0xa6, 0xbb, 0x82, 0x4a, 0x33, 0x1b, 0xf6, 0xc9, 0x8e, 0x8e, 0x21, 0xa0, 0xec, 0xb1, 0x6e, 0x04, 0xd4, 0x23, 0x4c, 0x60, 0xef, 0xee, 0xe6, 0x36, 0x74, 0x8a, 0x04, 0x6c, 0xcf, 0x77, 0xd9, 0x2e, 0x5e, 0xc2, 0xa7, 0x02, 0x64, 0x08, 0x93, 0x70, 0xc8, 0x8f, 0x90, 0x10, 0x0e, 0xc0, 0xf3, 0x43, 0x4c, 0x1c, 0xcd, 0x1f, 0x11, 0x2e, 0x50, 0xa3, 0x05, 0x95, 0x72, 0xd5, 0x08, 0x19, 0x55, 0x94, 0x1a, 0x10, 0xc6, 0x48, 0x60, 0x4a, 0x92, 0x53, 0x4f, 0x97, 0x24, 0x1f, 0x92, 0x52, 0xc9, 0x1e, 0xb9, 0x1c, 0x24, 0x54, 0x9c, 0x22, 0x1a, 0xc3, 0x95, 0xe6, 0x3c, 0x9c, 0x40, 0xad, 0xe1, 0x20, 0x60, 0xc0, 0xe0, 0xd1, 0xed, 0xf2, 0xf6, 0xe6, 0x0d, 0x78, 0xd8, 0x2b, 0x01, 0xd8, 0xfb, 0x3e, 0x61, 0x60, 0xef, 0x48, 0x86, 0x24, 0xb0, 0x05, 0x91, 0x88, 0xb4, 0x2f, 0xe3, 0xab, 0xea, 0x38, 0xce, 0xaf, 0x80, 0xea, 0x31, 0x60, 0x75, 0x21, 0xa0, 0x36, 0x07, 0x8c, 0xf5, 0x84, 0xf1, 0x02, 0x40, 0xfd, 0x18, 0xb0, 0x7a, 0x02, 0xe0, 0x05, 0x42, 0x5f, 0x19, 0x23, 0x11, 0x71, 0xdd, 0xaa, 0x82, 0x7d, 0x09, 0xec, 0xf5, 0x75, 0xb0, 0x57, 0xf0, 0x6f, 0x9a, 0x78, 0xb3, 0x3a, 0x7a, 0xcd, 0xa0, 0x8d, 0x8d, 0xb5, 0x7e, 0x03, 0xea, 0x50, 0xc1, 0x53, 0xc3, 0x8e, 0x26, 0x47, 0x9c, 0x32, 0x09, 0xcb, 0x77, 0x6e, 0x75, 0x3a, 0x5b, 0xd0, 0xdd, 0xba, 0xd7, 0xb9, 0x79, 0x61, 0x19, 0x36, 0x1a, 0xf8, 0x14, 0xb3, 0x51, 0x58, 0xea, 0xe9, 0xb2, 0x10, 0xfe, 0x01, 0xde, 0x0d, 0x61, 0x87, \ No newline at end of file diff --git a/build/assets/jsdemo.tic.dat b/build/assets/jsdemo.tic.dat index f73a522fd..ea5731b06 100644 --- a/build/assets/jsdemo.tic.dat +++ b/build/assets/jsdemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0x4d, 0x4b, 0xc3, 0x40, 0x10, 0xdd, 0xfa, 0x71, 0xc8, 0xde, 0x3c, 0x7b, 0x59, 0x0b, 0xc2, 0xae, 0x4d, 0x69, 0x3e, 0x4a, 0xd1, 0x42, 0xbd, 0xa8, 0xa0, 0x50, 0x28, 0x88, 0xe0, 0xb9, 0xb6, 0xa9, 0x46, 0x6a, 0x1a, 0x92, 0x6d, 0x69, 0x51, 0xef, 0x39, 0xf8, 0x23, 0x3c, 0x4a, 0xc8, 0x8f, 0xd8, 0xb3, 0x0c, 0xfd, 0x25, 0x25, 0xbf, 0xc1, 0x49, 0xaa, 0xa1, 0x07, 0xd1, 0x43, 0x0f, 0x5e, 0x9c, 0xd9, 0x61, 0xf6, 0xcd, 0x9b, 0xb7, 0x2c, 0xbc, 0x1d, 0x42, 0x48, 0xe9, 0x75, 0x83, 0xfc, 0x16, 0x73, 0xc0, 0x88, 0xa2, 0x28, 0x89, 0xe3, 0x38, 0xc9, 0x3a, 0xc2, 0x04, 0x54, 0x51, 0x00, 0x8b, 0x34, 0x8a, 0x20, 0x8d, 0x63, 0x95, 0x46, 0x6f, 0x2a, 0x85, 0x44, 0x81, 0x4a, 0x94, 0xfa, 0xaa, 0xef, 0xf5, 0xf0, 0xa3, 0x1e, 0x56, 0xf4, 0xe4, 0x3f, 0xfe, 0x34, 0x72, 0xaf, 0x32, 0xef, 0xf2, 0x7c, 0xcf, 0xef, 0x2f, 0xe8, 0x23, 0x10, 0x05, 0xe8, 0xed, 0x1c, 0x12, 0x02, 0xe8, 0xdd, 0x22, 0x41, 0xff, 0xe2, 0xcf, 0xca, 0xfc, 0x24, 0x6a, 0x91, 0x02, 0xa4, 0xe9, 0xba, 0x7a, 0xed, 0x78, 0xbd, 0xff, 0x6f, 0x6e, 0x6d, 0xef, 0x96, 0x48, 0xad, 0xc6, 0xa4, 0x2b, 0x87, 0x4e, 0x93, 0xb1, 0xdb, 0xee, 0x83, 0xb3, 0x04, 0x14, 0xa7, 0xdd, 0xb1, 0xbc, 0x1b, 0x05, 0xcd, 0xe5, 0xb4, 0xef, 0x4c, 0x9c, 0xe1, 0xc8, 0x77, 0x82, 0x8c, 0xe9, 0x3b, 0x61, 0x0f, 0xd7, 0x59, 0x88, 0xbc, 0xcc, 0x51, 0xe0, 0xfa, 0xd2, 0x1d, 0x79, 0x19, 0xb9, 0x04, 0x4d, 0x76, 0x1f, 0x52, 0x3a, 0xe9, 0x06, 0x4c, 0xb6, 0x8c, 0xbc, 0x4f, 0x5b, 0x47, 0x8d, 0xfc, 0x32, 0x6b, 0x59, 0x75, 0x4a, 0x07, 0x63, 0xaf, 0x97, 0x49, 0xd8, 0xd5, 0xc5, 0x09, 0x17, 0xf4, 0x91, 0x6a, 0xee, 0x80, 0xdf, 0x48, 0x8f, 0x1b, 0x42, 0xcc, 0xaa, 0xd5, 0x02, 0x9a, 0x08, 0x2b, 0x95, 0x02, 0x5a, 0x42, 0x4c, 0x57, 0x58, 0x1b, 0x21, 0xb2, 0x54, 0xeb, 0x0d, 0x43, 0x6e, 0xda, 0x82, 0x6a, 0xa1, 0x1f, 0x70, 0xb3, 0xc2, 0xb9, 0xdc, 0x6f, 0x18, 0xa2, 0x66, 0x1b, 0x4f, 0x86, 0x38, 0xb0, 0xf4, 0xa9, 0x3e, 0xd3, 0xcd, 0xba, 0x6e, 0xeb, 0x06, 0xa6, 0xa5, 0x5b, 0xb8, 0xe8, 0x07, 0xae, 0x27, 0x79, 0xf9, 0xfc, 0xac, 0xdd, 0xee, 0xb0, 0xeb, 0xce, 0x65, 0xfb, 0x74, 0xaf, 0xac, 0x1f, 0xd6, 0xf1, 0x20, 0x29, 0xf1, 0xd1, 0x67, 0xfa, 0x01, 0x24, 0x0d, 0x05, 0xa4, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xcd, 0x6a, 0x1b, 0x31, 0x10, 0x56, 0xfa, 0x73, 0xb0, 0x6e, 0x7d, 0x83, 0x69, 0xa0, 0x20, 0xd5, 0x9b, 0x78, 0x77, 0x6d, 0x42, 0x6b, 0x70, 0x2f, 0x6d, 0x21, 0x01, 0x97, 0x40, 0x09, 0xf4, 0xbc, 0xd9, 0xc8, 0xb1, 0xda, 0xcd, 0xae, 0x59, 0xc9, 0x8e, 0x4d, 0xdb, 0xfb, 0x1e, 0x72, 0xcd, 0x3d, 0xc7, 0xb2, 0xec, 0x43, 0xe8, 0x5c, 0x44, 0x9e, 0xc4, 0xec, 0x33, 0x74, 0xa4, 0x24, 0x26, 0x87, 0xd2, 0x1e, 0x72, 0xe8, 0xa5, 0x23, 0x0d, 0x33, 0x9f, 0xbe, 0x19, 0xcd, 0xc0, 0xf7, 0x8c, 0x10, 0xb2, 0x75, 0xf5, 0x88, 0xfc, 0xcd, 0xae, 0x2d, 0x5a, 0x55, 0x55, 0x4d, 0x5d, 0xd7, 0x8d, 0x8b, 0x08, 0x1b, 0x6b, 0x36, 0x6e, 0xed, 0xba, 0xad, 0x2a, 0xdb, 0xd6, 0xb5, 0x69, 0xab, 0x1f, 0xa6, 0xb5, 0x8d, 0xb1, 0xa6, 0x31, 0xe6, 0xce, 0x7f, 0xdf, 0x6f, 0xff, 0xd8, 0x6f, 0xef, 0xf5, 0x93, 0xff, 0xf6, 0x4f, 0xcd, 0x6b, 0xe5, 0xb4, 0xf3, 0xe7, 0xa7, 0xcf, 0x2f, 0x50, 0x47, 0x4b, 0x8c, 0x45, 0x6d, 0xaf, 0x6d, 0x43, 0x2c, 0x6a, 0xb7, 0x6e, 0x50, 0xbf, 0xfa, 0xd6, 0x9d, 0x9e, 0xc4, 0xac, 0x5b, 0x6b, 0xdb, 0xf6, 0xa1, 0xfd, 0x9d, 0x37, 0x0f, 0xdb, 0xff, 0xf1, 0x93, 0xa7, 0x97, 0x5b, 0xa4, 0xd7, 0x03, 0x2d, 0x75, 0x26, 0x86, 0x00, 0x70, 0x9a, 0x9c, 0x89, 0x1b, 0x44, 0xf1, 0x39, 0x99, 0xeb, 0x69, 0x51, 0x0e, 0x6f, 0x9f, 0x4f, 0xc4, 0x42, 0x64, 0xc5, 0x4c, 0x94, 0x01, 0x88, 0xb3, 0x44, 0x66, 0x18, 0x74, 0xba, 0xeb, 0xea, 0x4e, 0x84, 0x4a, 0x5d, 0x37, 0x28, 0x2c, 0xd7, 0x1e, 0x96, 0x72, 0xa6, 0x65, 0x91, 0x3b, 0x56, 0x49, 0xed, 0xff, 0x86, 0x73, 0x71, 0xec, 0x72, 0xc8, 0x64, 0xfe, 0xc5, 0x11, 0x99, 0x4c, 0x45, 0xae, 0x90, 0xfb, 0x70, 0x70, 0x04, 0xe3, 0x1b, 0x00, 0x2c, 0x9d, 0x26, 0xf9, 0x29, 0x2e, 0x31, 0x95, 0x0a, 0x74, 0x01, 0xab, 0x62, 0x5e, 0xde, 0x55, 0x42, 0x31, 0x81, 0x74, 0x5a, 0x20, 0xe0, 0xae, 0x7f, 0x21, 0x4a, 0x85, 0x33, 0x86, 0x10, 0xee, 0x46, 0x7e, 0x90, 0x9f, 0x8a, 0xa3, 0x3e, 0x2b, 0x4a, 0x17, 0x49, 0x09, 0x7a, 0x14, 0xfa, 0xb8, 0x1c, 0xbd, 0xde, 0xf3, 0xc9, 0x6a, 0x14, 0x0f, 0x28, 0x9d, 0xcc, 0xf3, 0xd4, 0x2d, 0x07, 0x47, 0x07, 0x6f, 0x19, 0xa7, 0x5f, 0x69, 0x47, 0x4e, 0xd8, 0xb1, 0xce, 0x59, 0xc8, 0xf9, 0x6a, 0x67, 0x67, 0x03, 0x23, 0x84, 0xdd, 0xee, 0x06, 0xc6, 0x9c, 0x2f, 0xef, 0xb1, 0x7d, 0x84, 0xc8, 0xd2, 0x4e, 0x9a, 0x29, 0x16, 0xf5, 0x39, 0xed, 0xa8, 0x59, 0xc9, 0xa2, 0x2e, 0x63, 0xfa, 0xc5, 0x5e, 0xc8, 0x7b, 0xfd, 0xf0, 0x5b, 0xc8, 0x5f, 0xc6, 0xc1, 0x32, 0x58, 0x05, 0xd1, 0x20, 0xe8, 0x07, 0x21, 0x9e, 0x38, 0x88, 0xb1, 0x70, 0x56, 0xca, 0x5c, 0xb3, 0xed, 0xfd, 0xf7, 0xe3, 0xf1, 0x21, 0x7c, 0x3a, 0xfc, 0x38, 0x7e, 0xf7, 0x7c, 0x3b, 0x78, 0x35, 0xc0, 0x8b, 0xa4, 0xc6, 0x4f, 0xbf, 0xd3, 0x5f, 0xb6, 0x0a, 0x2c, 0x8d, \ No newline at end of file diff --git a/build/assets/jsmark.tic.dat b/build/assets/jsmark.tic.dat index d459577b4..5cd41b5e6 100644 --- a/build/assets/jsmark.tic.dat +++ b/build/assets/jsmark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xe3, 0x44, 0x14, 0x77, 0x0f, 0xac, 0xa8, 0x45, 0xa4, 0xe4, 0x8a, 0x38, 0x3c, 0xad, 0x84, 0xb0, 0x9b, 0x3f, 0x75, 0xfa, 0x27, 0xa0, 0x6c, 0xb2, 0xd2, 0xfe, 0x11, 0xb0, 0x88, 0x95, 0xd0, 0x76, 0x69, 0xa9, 0x56, 0x39, 0x4c, 0x9d, 0x49, 0x6c, 0x48, 0xec, 0x60, 0x8f, 0xdb, 0x8d, 0x56, 0xb9, 0xf2, 0x09, 0xf8, 0x00, 0x9c, 0xe0, 0x0a, 0x27, 0xee, 0xdc, 0x90, 0x52, 0xa9, 0x1f, 0xa0, 0xae, 0x96, 0x0f, 0x40, 0x96, 0x43, 0x05, 0x47, 0x78, 0xe3, 0x19, 0x3b, 0x63, 0x2f, 0xdd, 0x96, 0x13, 0x20, 0x75, 0xe4, 0xe7, 0xf1, 0xbc, 0x79, 0xef, 0xf7, 0xde, 0xbc, 0xf7, 0xe6, 0xf9, 0x0d, 0x4b, 0xd3, 0xde, 0x7c, 0xab, 0xd6, 0x7b, 0xa7, 0xf7, 0xc3, 0xed, 0x9d, 0x17, 0xb3, 0xbd, 0x3f, 0x8f, 0xa3, 0xef, 0x7e, 0x9b, 0xbc, 0xf7, 0x63, 0xff, 0xed, 0x2f, 0xa7, 0x66, 0xcb, 0xbf, 0xd5, 0xfb, 0xf9, 0xce, 0xb7, 0xbf, 0x87, 0x2f, 0xfe, 0x38, 0x3f, 0x3f, 0xff, 0xfa, 0xfb, 0x9f, 0x76, 0x47, 0x5f, 0x6d, 0x76, 0xf6, 0x56, 0xbe, 0xb9, 0xa1, 0x5d, 0x36, 0x2a, 0x95, 0x0a, 0xd2, 0x4a, 0x8c, 0x74, 0x5c, 0x20, 0xce, 0x8b, 0xb5, 0x32, 0xbe, 0x4a, 0x95, 0x93, 0x79, 0x81, 0x4e, 0x63, 0x2d, 0xe6, 0x83, 0x23, 0xc4, 0x71, 0xb9, 0x32, 0x3f, 0xcd, 0xd3, 0x31, 0xf2, 0x38, 0xff, 0xb2, 0xa1, 0x5d, 0x8f, 0x7f, 0x75, 0xa4, 0x79, 0x4e, 0x69, 0x45, 0x3b, 0x89, 0x7f, 0x59, 0x9c, 0x21, 0x2d, 0xf0, 0xfb, 0xf9, 0x59, 0x09, 0x73, 0x5c, 0x8a, 0xe5, 0x28, 0xe1, 0x66, 0x3c, 0x8f, 0x05, 0x89, 0x71, 0x82, 0x39, 0x3e, 0x91, 0xb9, 0x16, 0x54, 0xd2, 0xb2, 0x4d, 0xfc, 0x2e, 0xe6, 0x9b, 0x57, 0x44, 0x49, 0x52, 0xf9, 0x3a, 0xff, 0xff, 0x85, 0xfc, 0x2f, 0x5e, 0x45, 0xf1, 0xf1, 0x7c, 0x1e, 0xcf, 0x0b, 0xc4, 0x79, 0xd9, 0x28, 0x57, 0x4e, 0x0b, 0x14, 0x2b, 0x74, 0x7d, 0xff, 0xff, 0xcf, 0xf9, 0xaf, 0x68, 0xf1, 0xaf, 0xd8, 0x08, 0x16, 0x8b, 0x45, 0x09, 0x65, 0xcb, 0xf2, 0xce, 0xa6, 0xc4, 0xc7, 0x19, 0xe6, 0x78, 0x81, 0xf4, 0xfc, 0x0c, 0x7f, 0x14, 0x8b, 0x3c, 0x55, 0xb4, 0x4b, 0xd3, 0x5f, 0x79, 0xed, 0xfe, 0xeb, 0xda, 0xfa, 0x3a, 0x30, 0x97, 0x8d, 0x68, 0x1b, 0xee, 0x46, 0x9e, 0x37, 0x1d, 0x93, 0xe0, 0x0b, 0x70, 0x3d, 0xf8, 0x88, 0x1c, 0x92, 0x1d, 0x3b, 0x70, 0x27, 0x4c, 0x47, 0x09, 0x12, 0x31, 0xc7, 0x0f, 0xda, 0xf0, 0xc8, 0x3f, 0x80, 0x8f, 0x7d, 0x62, 0x3b, 0x9c, 0xd9, 0xa7, 0xa1, 0x8d, 0x5a, 0xd4, 0xb3, 0x1d, 0xae, 0xe5, 0x7a, 0x43, 0x60, 0xbe, 0x3f, 0xc2, 0x17, 0x84, 0x94, 0x82, 0xe3, 0x1f, 0xc1, 0x98, 0x78, 0x53, 0x38, 0x40, 0x5c, 0x97, 0x86, 0x60, 0x13, 0x0f, 0x06, 0xa3, 0x29, 0x90, 0xc0, 0x8f, 0xbc, 0x3e, 0x30, 0x87, 0x42, 0x68, 0x07, 0x94, 0x7a, 0x35, 0x88, 0x42, 0xae, 0xbd, 0xb4, 0xd9, 0xe0, 0xf8, 0xae, 0x37, 0x89, 0x58, 0x1b, 0x86, 0x64, 0x4c, 0x27, 0xa4, 0xcf, 0x39, 0x61, 0xb2, 0xd9, 0x86, 0xcf, 0x43, 0xbe, 0x3a, 0xa4, 0x41, 0xe8, 0xfa, 0x5e, 0x1b, 0x9a, 0x8d, 0x66, 0xc3, 0xd2, 0x75, 0xdb, 0xf7, 0x42, 0x26, 0x21, 0xf7, 0xdc, 0x3e, 0x73, 0xa0, 0x0b, 0x1b, 0x5b, 0x56, 0x8e, 0xff, 0x21, 0x75, 0x87, 0x0e, 0xc3, 0x8d, 0xe6, 0x66, 0x4b, 0x6e, 0x70, 0x9f, 0x0f, 0x48, 0x90, 0xed, 0xb4, 0xf4, 0x43, 0x12, 0x00, 0xff, 0x42, 0xcc, 0x41, 0xe4, 0xd9, 0x0c, 0x8d, 0xc0, 0x07, 0x94, 0x3d, 0x22, 0x5e, 0xdf, 0x1f, 0xef, 0x92, 0x51, 0x44, 0x8d, 0xb1, 0x8b, 0x5e, 0x8f, 0xc9, 0x53, 0x13, 0x9e, 0xe9, 0x00, 0x01, 0x65, 0x51, 0xe0, 0xc1, 0x43, 0xc2, 0x9c, 0x46, 0x90, 0x48, 0x19, 0x26, 0xac, 0x81, 0x81, 0x02, 0x50, 0x07, 0x94, 0x35, 0xa1, 0xca, 0x27, 0x7d, 0xa6, 0x20, 0x26, 0xe1, 0x36, 0x38, 0xc0, 0x2a, 0x73, 0xdc, 0xb0, 0xf1, 0x14, 0x2d, 0x16, 0xac, 0x58, 0xb5, 0xdc, 0x71, 0xea, 0x42, 0xa7, 0x71, 0xc4, 0x57, 0xa6, 0x54, 0x9b, 0xbe, 0x42, 0x4d, 0x9e, 0x29, 0xd5, 0x73, 0x92, 0x65, 0xaa, 0x18, 0x4e, 0x28, 0xed, 0x7f, 0xf6, 0xb2, 0x76, 0xbd, 0x69, 0x21, 0x00, 0xbe, 0x4c, 0x58, 0x87, 0x96, 0xa5, 0x4a, 0xef, 0x5f, 0x5d, 0x3a, 0x70, 0x19, 0xe5, 0x61, 0xd6, 0x25, 0xa7, 0x1f, 0x90, 0x23, 0x5c, 0xa7, 0xa7, 0x17, 0xe7, 0x5e, 0x45, 0x39, 0x43, 0x51, 0xa8, 0x81, 0x88, 0x84, 0x9c, 0xa7, 0x08, 0x9c, 0x3c, 0x56, 0xf2, 0x6c, 0xe1, 0x83, 0xce, 0xcf, 0x52, 0xc8, 0x68, 0xd2, 0x27, 0x89, 0x91, 0x02, 0xa8, 0x8c, 0x66, 0xb5, 0x0b, 0xca, 0x39, 0x53, 0xfe, 0x34, 0xcf, 0xdf, 0x47, 0xb0, 0x55, 0x77, 0x00, 0x46, 0xaa, 0xa4, 0x86, 0x18, 0x6e, 0xab, 0xe1, 0x17, 0xe0, 0xcb, 0x5c, 0x5d, 0x98, 0x99, 0x4c, 0x4a, 0x46, 0x78, 0xad, 0x0b, 0xf5, 0x26, 0x32, 0x67, 0x79, 0x53, 0x1d, 0xb0, 0x8a, 0x90, 0xd6, 0x95, 0x54, 0xa7, 0x99, 0x97, 0x22, 0xa1, 0x99, 0x9b, 0x22, 0xdd, 0x2a, 0xe8, 0x34, 0xf3, 0xf3, 0x6f, 0x4b, 0x21, 0x6f, 0x6e, 0x5f, 0x31, 0x97, 0xb7, 0xd7, 0xc9, 0x5f, 0x92, 0xa2, 0x85, 0xdc, 0xe6, 0xc5, 0x98, 0xf8, 0x20, 0xb0, 0x1a, 0x5f, 0xbc, 0x9f, 0x2d, 0x3d, 0x77, 0x94, 0x2e, 0x6c, 0x6e, 0x28, 0x77, 0xe4, 0xfd, 0x4f, 0x76, 0x94, 0x1b, 0x72, 0xc8, 0x2b, 0x4e, 0x84, 0x29, 0x59, 0x0f, 0x02, 0x6c, 0x0d, 0xa1, 0xc2, 0x18, 0x91, 0x90, 0x3d, 0x76, 0xc7, 0x5c, 0x86, 0xd7, 0x65, 0xca, 0x1e, 0x52, 0xb6, 0x2b, 0x55, 0x0b, 0xa5, 0x92, 0x9c, 0x11, 0x15, 0x70, 0x59, 0x87, 0x3c, 0x44, 0xa7, 0xcb, 0xab, 0x3a, 0x97, 0xa2, 0xcc, 0x9e, 0xba, 0xaa, 0x42, 0x9a, 0x20, 0x3a, 0x0a, 0xa9, 0x22, 0x9d, 0x7a, 0xab, 0x08, 0xbf, 0x8c, 0xb4, 0xcc, 0xb8, 0xe2, 0xbb, 0xf0, 0x48, 0xa2, 0xca, 0xde, 0xb2, 0x84, 0x94, 0x71, 0x14, 0xcd, 0x6b, 0x30, 0xe1, 0x28, 0x1e, 0x3d, 0x12, 0xa1, 0x92, 0xdc, 0xb4, 0xe3, 0x76, 0xe1, 0x49, 0x4f, 0x97, 0x8b, 0xc6, 0x24, 0x0a, 0x1d, 0x83, 0x4b, 0xca, 0xc6, 0x63, 0x2a, 0x71, 0x7e, 0xfc, 0xe0, 0x9e, 0x21, 0x5a, 0x19, 0xf6, 0xd5, 0x87, 0xd8, 0x8d, 0x6d, 0x5d, 0xc4, 0xa6, 0xdb, 0x15, 0x11, 0x00, 0x18, 0x73, 0xae, 0x61, 0x25, 0x17, 0x50, 0xec, 0x41, 0x17, 0x9b, 0xe5, 0x5a, 0x6b, 0x6b, 0x6d, 0xa3, 0xb1, 0xf9, 0xee, 0x76, 0x4e, 0xac, 0x29, 0xc4, 0x58, 0xb5, 0x8a, 0x95, 0x84, 0x90, 0x0f, 0x78, 0x2b, 0x17, 0x6a, 0x07, 0xcc, 0x43, 0x14, 0x11, 0xd6, 0x81, 0x1f, 0x80, 0xc1, 0xbb, 0xad, 0xcb, 0x43, 0x71, 0x0b, 0xa7, 0x0e, 0x6c, 0xe3, 0x54, 0xad, 0xca, 0xb0, 0x5f, 0xec, 0xbb, 0x2c, 0x28, 0x11, 0xf4, 0x14, 0xb7, 0xf9, 0x8f, 0x71, 0xfd, 0x89, 0x91, 0x61, 0x25, 0x9e, 0x7e, 0x9a, 0x34, 0x15, 0x5d, 0x85, 0xc0, 0xbf, 0xa1, 0x94, 0x17, 0xda, 0x72, 0xf1, 0xc4, 0xed, 0xc9, 0x16, 0x64, 0x98, 0x99, 0xfa, 0x7d, 0x6c, 0x73, 0xfa, 0xaa, 0x3d, 0x0a, 0x8d, 0xe6, 0xb6, 0x79, 0x55, 0x14, 0xde, 0x1b, 0x05, 0x06, 0x66, 0xdb, 0x66, 0x86, 0x68, 0x77, 0x4a, 0x7f, 0xa9, 0xe5, 0xaf, 0x18, 0x6e, 0xa3, 0x34, 0x76, 0x4c, 0x8f, 0x19, 0x37, 0xef, 0x0a, 0x9c, 0x36, 0xdc, 0xc4, 0x52, 0x4c, 0xcf, 0x35, 0xa2, 0xde, 0x90, 0xab, 0x89, 0xde, 0xd9, 0xc4, 0x69, 0x40, 0x30, 0x50, 0x09, 0x23, 0xf9, 0x5a, 0xea, 0x63, 0xdd, 0x08, 0x5d, 0x2c, 0xa5, 0xec, 0xa6, 0x18, 0x66, 0xfe, 0xcf, 0xb3, 0x0e, 0x1b, 0x17, 0x23, 0xcd, 0xf4, 0xbf, 0x00, 0xd7, 0x25, 0x3f, 0xfe, \ No newline at end of file +0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xe3, 0x44, 0x14, 0x77, 0x0f, 0x20, 0x6a, 0x11, 0x29, 0xb9, 0x22, 0x0e, 0x4f, 0x2b, 0xad, 0xb0, 0x9b, 0x3f, 0x75, 0xfa, 0x27, 0xa0, 0x6c, 0xb2, 0x12, 0x0b, 0x02, 0x8a, 0xb6, 0x12, 0xda, 0x96, 0x96, 0x6a, 0x95, 0xc3, 0xd4, 0x99, 0xd4, 0x86, 0x64, 0x1c, 0xec, 0x71, 0xbb, 0x11, 0xca, 0x95, 0x4f, 0xc0, 0x07, 0xe0, 0x04, 0x57, 0x38, 0x71, 0xe7, 0x86, 0x94, 0x4a, 0xfd, 0x00, 0x75, 0xb5, 0x7c, 0x00, 0xb2, 0x1c, 0x2a, 0x38, 0xc2, 0x1b, 0xcf, 0xd8, 0xb1, 0xbd, 0x74, 0x5b, 0x4e, 0xb0, 0x52, 0x47, 0x7e, 0x1e, 0xcf, 0x9b, 0xf7, 0x7e, 0xef, 0xcd, 0x7b, 0x6f, 0x9e, 0x5f, 0xb7, 0x34, 0xed, 0x8d, 0x37, 0x6b, 0xbd, 0xb7, 0x7a, 0x3f, 0xde, 0xdf, 0x79, 0x36, 0xdd, 0xff, 0xeb, 0x34, 0xfc, 0xfe, 0xf7, 0xf1, 0x3b, 0x3f, 0xf5, 0xef, 0x7e, 0x39, 0x31, 0x5b, 0xde, 0xbd, 0xde, 0x2f, 0xef, 0x7e, 0xf7, 0x47, 0xf0, 0xec, 0xcf, 0xcb, 0xcb, 0xcb, 0x6f, 0x7e, 0xf8, 0x79, 0x6f, 0xf8, 0xf5, 0x7a, 0x67, 0x7f, 0xe9, 0xdb, 0x57, 0xb5, 0xeb, 0x46, 0xa5, 0x52, 0x41, 0x5a, 0x8a, 0x90, 0x4e, 0x0b, 0x24, 0x78, 0x91, 0x56, 0xc6, 0x57, 0xa9, 0x72, 0x36, 0x2b, 0xd0, 0x79, 0xa4, 0x45, 0x62, 0x08, 0x84, 0x28, 0x2a, 0x57, 0x66, 0xe7, 0x79, 0x3a, 0x45, 0x9e, 0xe0, 0x5f, 0x37, 0xb4, 0xdb, 0xf1, 0x9f, 0x8e, 0x24, 0xcf, 0x09, 0x2d, 0x69, 0x67, 0xd1, 0xaf, 0xf3, 0x0b, 0xa4, 0x39, 0x7e, 0x3f, 0xbd, 0x28, 0x61, 0x8e, 0x4b, 0x91, 0x1a, 0x25, 0xdc, 0x8c, 0x66, 0x91, 0x24, 0x39, 0xce, 0x30, 0xc7, 0x67, 0x2a, 0xd7, 0x92, 0x4a, 0x5a, 0xba, 0x89, 0xdf, 0xc5, 0x7c, 0x8b, 0x8a, 0x28, 0x29, 0x2a, 0xdf, 0xe6, 0xff, 0xff, 0x90, 0xff, 0xf9, 0x8b, 0x28, 0x3a, 0x9d, 0xcd, 0xa2, 0x59, 0x81, 0x04, 0x2f, 0x1d, 0xe5, 0xca, 0x79, 0x81, 0xa2, 0x0c, 0xdd, 0xde, 0xff, 0x97, 0x39, 0xff, 0x15, 0x2d, 0xfa, 0x0d, 0x1b, 0xc1, 0x7c, 0x3e, 0x2f, 0xa1, 0x6c, 0x59, 0xdd, 0xd9, 0x84, 0xc4, 0xb8, 0xc0, 0x1c, 0xcf, 0x91, 0x9e, 0x5e, 0xe0, 0x8f, 0x62, 0x9e, 0xa7, 0x8a, 0x76, 0x6d, 0xfa, 0x2b, 0xaf, 0xf4, 0x5e, 0xd3, 0x56, 0x57, 0x81, 0xbb, 0x7c, 0x48, 0xdb, 0xf0, 0x20, 0x64, 0x6c, 0x32, 0x22, 0xfe, 0x17, 0xe0, 0x32, 0xf8, 0x98, 0x1c, 0x93, 0x1d, 0xdb, 0x77, 0xc7, 0x5c, 0x47, 0x09, 0x12, 0x72, 0xc7, 0xf3, 0xdb, 0xf0, 0xc8, 0x3b, 0x84, 0x87, 0x1e, 0xb1, 0x1d, 0xc1, 0xec, 0xd3, 0xc0, 0x46, 0x2d, 0xca, 0x6c, 0x47, 0x68, 0xb9, 0xec, 0x08, 0xb8, 0xe7, 0x0d, 0xf1, 0x05, 0x01, 0xa5, 0xe0, 0x78, 0x27, 0x30, 0x22, 0x6c, 0x02, 0x87, 0x88, 0xeb, 0xd2, 0x00, 0x6c, 0xc2, 0x60, 0x30, 0x9c, 0x00, 0xf1, 0xbd, 0x90, 0xf5, 0x81, 0x3b, 0x14, 0x02, 0xdb, 0xa7, 0x94, 0xd5, 0x20, 0x0c, 0x84, 0xf6, 0xc2, 0x66, 0x43, 0xe0, 0x0f, 0x5d, 0x9b, 0xb2, 0x00, 0x1d, 0xdb, 0xde, 0xda, 0x85, 0x87, 0x72, 0x01, 0x62, 0xc3, 0x65, 0xe3, 0x90, 0xb7, 0xe1, 0x88, 0x8c, 0xe8, 0x98, 0xf4, 0x05, 0x27, 0x88, 0xb5, 0xda, 0xf0, 0x79, 0x20, 0x56, 0xc7, 0xd4, 0x0f, 0x5c, 0x8f, 0xb5, 0xa1, 0xd9, 0x68, 0x36, 0x2c, 0x5d, 0xb7, 0x3d, 0x16, 0x70, 0x65, 0x6b, 0xdf, 0xed, 0x73, 0x07, 0xba, 0xb0, 0xb6, 0x61, 0xe5, 0xf8, 0x1f, 0x51, 0xf7, 0xc8, 0xe1, 0xb8, 0xd1, 0x5c, 0x6f, 0xa9, 0x0d, 0x71, 0x98, 0x43, 0xe2, 0xa7, 0x3b, 0x2d, 0xfd, 0x98, 0xf8, 0x20, 0xbe, 0x10, 0x73, 0x10, 0x32, 0x9b, 0xa3, 0x11, 0xf8, 0x90, 0xf2, 0x47, 0x84, 0xf5, 0xbd, 0xd1, 0x1e, 0x19, 0x86, 0xd4, 0x18, 0xb9, 0x78, 0x9c, 0x11, 0x79, 0x62, 0xc2, 0x57, 0x3a, 0x80, 0x4f, 0x79, 0xe8, 0x33, 0xd8, 0x26, 0xdc, 0x69, 0xf8, 0xb1, 0x94, 0x61, 0xc2, 0x0a, 0x18, 0x28, 0x00, 0x75, 0x40, 0x59, 0x13, 0xaa, 0x62, 0xd2, 0xa7, 0x19, 0xc4, 0x38, 0x0f, 0x86, 0x00, 0x58, 0xe6, 0x8e, 0x1b, 0x34, 0x9e, 0xa0, 0xc5, 0x82, 0x15, 0xab, 0x96, 0x3b, 0x4e, 0x5d, 0xea, 0x34, 0x4e, 0xc4, 0xca, 0x54, 0x6a, 0x93, 0x17, 0xa8, 0xa9, 0x33, 0x25, 0x7a, 0x4e, 0xbc, 0x4c, 0x14, 0x83, 0x31, 0xa5, 0xfd, 0xcf, 0x9e, 0xd7, 0xae, 0x37, 0x2d, 0x04, 0xc0, 0x97, 0x09, 0xab, 0xd0, 0xb2, 0xb2, 0xd2, 0x07, 0x37, 0x97, 0xf6, 0x5d, 0x4e, 0x45, 0x98, 0x75, 0xc5, 0xe9, 0xfb, 0xe4, 0x04, 0xd7, 0xc9, 0xe9, 0xe5, 0xb9, 0x97, 0x51, 0xce, 0xc8, 0x28, 0xd4, 0x40, 0x46, 0x42, 0xcd, 0x13, 0x04, 0x8e, 0x1f, 0x2b, 0x7e, 0x36, 0xf0, 0x41, 0xe7, 0xa7, 0x09, 0x64, 0x38, 0xee, 0x93, 0xd8, 0x48, 0x01, 0x54, 0x45, 0xb3, 0xda, 0x85, 0xcc, 0x39, 0x13, 0xfe, 0x24, 0xcf, 0x3f, 0x40, 0xb0, 0x65, 0x77, 0x00, 0x46, 0xa2, 0x94, 0x0d, 0x31, 0xdc, 0xcf, 0x86, 0x5f, 0x82, 0x2f, 0x72, 0x75, 0x65, 0x66, 0x52, 0x29, 0x15, 0xe1, 0x95, 0x2e, 0xd4, 0x9b, 0xc8, 0x9c, 0xe6, 0x4d, 0x75, 0xc0, 0x2a, 0x42, 0x5a, 0x37, 0x52, 0x9d, 0xa4, 0x5e, 0xca, 0x84, 0xa6, 0x6e, 0xca, 0x74, 0x67, 0x41, 0x27, 0xa9, 0x9f, 0xff, 0x58, 0x0a, 0x79, 0x73, 0x07, 0x19, 0x73, 0x79, 0x7b, 0x9d, 0xfc, 0x25, 0x29, 0x5a, 0xc8, 0x6d, 0x5e, 0x8d, 0x89, 0x0f, 0x02, 0x67, 0xe3, 0x8b, 0xf7, 0xb3, 0xa5, 0xe7, 0x8e, 0xd2, 0x85, 0xf5, 0xb5, 0xcc, 0x1d, 0xf9, 0xe0, 0x93, 0x9d, 0xcc, 0x0d, 0x39, 0x16, 0x15, 0x27, 0xc3, 0x14, 0xaf, 0x07, 0x3e, 0xb6, 0x86, 0x20, 0xc3, 0x18, 0x92, 0x80, 0xef, 0xba, 0x23, 0x21, 0x23, 0xea, 0x32, 0x61, 0x1f, 0x51, 0xbe, 0xa7, 0x54, 0x0b, 0xa5, 0x12, 0x9f, 0x11, 0x15, 0x70, 0x59, 0x87, 0x3c, 0x44, 0xa7, 0x2b, 0xaa, 0x3a, 0x97, 0xa2, 0xd4, 0x5e, 0x76, 0x55, 0x85, 0x24, 0x41, 0x74, 0x88, 0x8d, 0x6b, 0x21, 0x9d, 0x78, 0x9b, 0x11, 0x7e, 0x1e, 0x69, 0x91, 0xf1, 0x8c, 0xef, 0xd2, 0x23, 0x85, 0xaa, 0x7a, 0xcb, 0x02, 0x52, 0xc5, 0x51, 0x36, 0xaf, 0xc1, 0x58, 0xa0, 0x30, 0x7a, 0x22, 0x43, 0xa5, 0xb8, 0x49, 0x2b, 0xee, 0xc2, 0xe3, 0x9e, 0xae, 0x16, 0x8d, 0x71, 0x18, 0x38, 0x86, 0x90, 0x54, 0x8d, 0xc7, 0xcc, 0xc4, 0x79, 0x77, 0xeb, 0x3d, 0x43, 0xb6, 0x32, 0xec, 0xab, 0xdb, 0xd8, 0xa6, 0x6d, 0x5d, 0xc6, 0xa6, 0xdb, 0x95, 0x11, 0x00, 0x18, 0x09, 0xae, 0x61, 0xc5, 0x17, 0x50, 0xee, 0x41, 0x17, 0x9b, 0xe5, 0x4a, 0x6b, 0x63, 0x65, 0xad, 0xb1, 0xfe, 0xf6, 0x66, 0x4e, 0xac, 0x29, 0xc5, 0x78, 0xb5, 0x8a, 0x95, 0x84, 0x90, 0x5b, 0xa2, 0x95, 0x4b, 0xb5, 0x43, 0xce, 0x10, 0x45, 0x86, 0x75, 0xe0, 0xf9, 0x60, 0x88, 0x6e, 0xeb, 0x8a, 0x50, 0xdc, 0xc3, 0xa9, 0x03, 0x9b, 0x38, 0x55, 0xab, 0x2a, 0xec, 0x57, 0xfb, 0xae, 0x0a, 0x4a, 0x06, 0x3d, 0xc1, 0x6d, 0xfe, 0x6b, 0x5c, 0x6f, 0x6c, 0xa4, 0x58, 0xb1, 0xa7, 0x9f, 0xc6, 0x4d, 0x45, 0xcf, 0x42, 0xe0, 0x6f, 0x52, 0xc9, 0x4b, 0x6d, 0xb5, 0x78, 0xec, 0xf6, 0x54, 0x0b, 0x32, 0xcc, 0x54, 0xfd, 0x7d, 0x6c, 0x73, 0xfa, 0xb2, 0x3d, 0x0c, 0x8c, 0xe6, 0xa6, 0x79, 0x53, 0x14, 0xd1, 0x1b, 0x25, 0x06, 0x66, 0xdb, 0xe6, 0x86, 0x6c, 0x77, 0x99, 0xfe, 0x52, 0xcb, 0x5f, 0x31, 0xdc, 0x46, 0x69, 0xec, 0x98, 0x8c, 0x1b, 0x77, 0x1e, 0x48, 0x9c, 0x36, 0xdc, 0xc1, 0x52, 0x4c, 0xce, 0x35, 0xa4, 0xec, 0x48, 0xa8, 0xc9, 0xde, 0xd9, 0xc4, 0x69, 0x40, 0x30, 0x50, 0x31, 0x23, 0xfe, 0x5a, 0xe8, 0x63, 0xdd, 0x48, 0x5d, 0x2c, 0xa5, 0xf4, 0xa6, 0x18, 0x66, 0xfe, 0xcf, 0xb3, 0x0a, 0x6b, 0x57, 0x23, 0x4d, 0xf5, 0xbf, 0x01, 0xe8, 0x90, 0x47, 0xc9, \ No newline at end of file diff --git a/build/assets/luamark.tic.dat b/build/assets/luamark.tic.dat index ac1d9b956..118a96da4 100644 --- a/build/assets/luamark.tic.dat +++ b/build/assets/luamark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x56, 0x4f, 0x6f, 0xe3, 0x44, 0x14, 0x77, 0x0f, 0x20, 0xc5, 0x22, 0x52, 0x73, 0x45, 0x1c, 0x9e, 0x16, 0x21, 0xec, 0x36, 0xc9, 0x3a, 0xfd, 0x13, 0x50, 0xb6, 0xad, 0xb4, 0x0b, 0x5a, 0xb1, 0x12, 0x07, 0xc4, 0x2e, 0x5b, 0x2a, 0x51, 0xad, 0xa6, 0xf1, 0xa4, 0xb1, 0x70, 0xc6, 0x61, 0x3c, 0x6e, 0x1a, 0xad, 0xca, 0x91, 0x4f, 0xc0, 0x07, 0xe0, 0x04, 0x57, 0x38, 0x71, 0xe7, 0x86, 0x94, 0x4a, 0xfd, 0x00, 0x75, 0xb5, 0x7c, 0x00, 0xb2, 0x1c, 0x2a, 0x38, 0xc2, 0x9b, 0xf1, 0xd8, 0x19, 0xa7, 0xdb, 0x6d, 0x91, 0x90, 0x00, 0xa9, 0xa3, 0x3c, 0x77, 0xfc, 0xe6, 0xbd, 0xf7, 0x7b, 0xff, 0xe6, 0xb9, 0xaf, 0x79, 0x96, 0xf5, 0xfa, 0x1b, 0xf5, 0xdd, 0xb7, 0x77, 0x7f, 0xd8, 0x7a, 0xf8, 0xfc, 0x68, 0xfb, 0xcf, 0xe3, 0xe4, 0xbb, 0xdf, 0x86, 0xef, 0xfe, 0xe8, 0xbf, 0xf5, 0xc5, 0xd8, 0x6d, 0x47, 0x77, 0x76, 0x7f, 0xbe, 0xfb, 0xed, 0xef, 0xf1, 0xf3, 0x3f, 0xce, 0xcf, 0xcf, 0xbf, 0xfe, 0xfe, 0xa7, 0xc7, 0xe1, 0x57, 0xab, 0x1b, 0xdb, 0x0b, 0xdf, 0xbc, 0x6a, 0x5d, 0xb5, 0x6a, 0xb5, 0x1a, 0xd2, 0x42, 0x8a, 0x74, 0x3c, 0x47, 0x92, 0x97, 0x5a, 0x8b, 0xf8, 0xa8, 0xd6, 0x4e, 0x26, 0x73, 0x74, 0x9a, 0x5a, 0xa9, 0x5c, 0xd2, 0x42, 0x9a, 0x2e, 0xd6, 0x26, 0xa7, 0x65, 0x3a, 0x46, 0x9e, 0xe4, 0x5f, 0xb5, 0xac, 0x9b, 0xf5, 0xaf, 0xae, 0xbc, 0xce, 0x39, 0x2d, 0x58, 0x27, 0xe9, 0x2f, 0xd3, 0x33, 0xa4, 0x29, 0xee, 0x9f, 0x9d, 0x55, 0xb1, 0xc6, 0xd5, 0x54, 0xaf, 0x2a, 0x1e, 0xa6, 0x93, 0x34, 0xa3, 0x6c, 0x9d, 0x60, 0x8d, 0x4f, 0x74, 0xad, 0x33, 0xaa, 0x5a, 0xc5, 0x21, 0xee, 0xe7, 0xeb, 0x2d, 0x3b, 0xa2, 0xaa, 0x69, 0xf1, 0xa6, 0xfe, 0xff, 0x85, 0xfa, 0x4f, 0x5f, 0x46, 0xe9, 0xf1, 0x64, 0x92, 0x4e, 0xe6, 0x48, 0xf2, 0x8a, 0xb5, 0x58, 0x3b, 0x9d, 0xa3, 0xd4, 0xa0, 0x9b, 0xfb, 0xff, 0x7f, 0xae, 0x7f, 0xcd, 0x4a, 0x7f, 0xc5, 0x41, 0x30, 0x9d, 0x4e, 0xab, 0x28, 0xbb, 0xa8, 0xef, 0x6c, 0x4e, 0x72, 0x9d, 0x61, 0x8d, 0xa7, 0x48, 0xcf, 0xce, 0xf0, 0x43, 0x31, 0x2d, 0x53, 0xcd, 0xba, 0xb2, 0xfc, 0xb5, 0x57, 0x3e, 0xab, 0x58, 0x8d, 0x06, 0x88, 0x40, 0x84, 0xb4, 0x03, 0xf7, 0x12, 0xc6, 0xc6, 0x03, 0xc2, 0x3f, 0x87, 0x80, 0xc1, 0x87, 0x09, 0xb1, 0xf1, 0x88, 0x24, 0xa2, 0x1f, 0xf1, 0x0e, 0x7c, 0x4c, 0xf6, 0x02, 0x02, 0x77, 0xc3, 0x3e, 0xe9, 0xf5, 0x08, 0x97, 0x27, 0x3e, 0x8d, 0xbb, 0xa8, 0x43, 0x59, 0xb7, 0x2f, 0x75, 0x02, 0xb6, 0x0f, 0x22, 0x8a, 0x42, 0x7c, 0x40, 0x4c, 0x29, 0xf4, 0xa3, 0x11, 0x0c, 0x08, 0x1b, 0xc3, 0x1e, 0x5a, 0x0d, 0x68, 0x0c, 0x5d, 0xc2, 0xa0, 0x17, 0x8e, 0x81, 0xf0, 0x28, 0x61, 0x3e, 0x88, 0x3e, 0x85, 0xb8, 0xcb, 0x29, 0x65, 0x75, 0x48, 0x62, 0xa9, 0x8d, 0x88, 0x4d, 0x69, 0x38, 0x60, 0xc3, 0x44, 0x74, 0x60, 0x9f, 0x0c, 0xe8, 0x90, 0xf8, 0x92, 0x83, 0x72, 0xc1, 0x10, 0x59, 0x61, 0xe6, 0xd3, 0x01, 0xe5, 0x71, 0x10, 0xb1, 0x0e, 0xb4, 0x9a, 0xad, 0xa6, 0x67, 0xdb, 0x99, 0x99, 0xed, 0xc0, 0x17, 0x7d, 0xd8, 0x84, 0x95, 0x35, 0x4f, 0x73, 0x3e, 0xa0, 0xc1, 0x7e, 0x5f, 0x20, 0xab, 0xb5, 0xda, 0xb6, 0xa5, 0x6f, 0x7b, 0x84, 0x17, 0x3c, 0xe4, 0xe0, 0x13, 0xb5, 0x7b, 0x09, 0xeb, 0x0a, 0x34, 0x07, 0x9c, 0x30, 0x3f, 0x1a, 0xdc, 0x0f, 0x23, 0x22, 0x9c, 0x30, 0x1a, 0x51, 0x5e, 0x87, 0x7d, 0x4e, 0x89, 0xa0, 0xdc, 0xb5, 0x2b, 0x9c, 0x8a, 0x84, 0x33, 0x70, 0x06, 0x44, 0xf4, 0x9b, 0x99, 0xa4, 0xe3, 0xc2, 0x12, 0x38, 0x5a, 0x04, 0x1a, 0xa0, 0x74, 0x5c, 0x17, 0x96, 0xb3, 0xdd, 0x1d, 0x9b, 0x32, 0xdf, 0xb6, 0x55, 0x52, 0x11, 0xe9, 0xe9, 0x48, 0xfa, 0xb7, 0xe9, 0xd5, 0xfb, 0xca, 0x03, 0xdc, 0x1c, 0x22, 0x8d, 0x91, 0xe2, 0x21, 0xa5, 0xfe, 0xa7, 0xf9, 0x66, 0x47, 0x6d, 0x78, 0x20, 0xe8, 0xa6, 0x77, 0x64, 0x78, 0xa7, 0xec, 0x74, 0x18, 0x1d, 0x39, 0x11, 0xba, 0x13, 0xa1, 0xc5, 0x08, 0x22, 0x0e, 0x4f, 0x8f, 0xec, 0x4a, 0x4c, 0xc5, 0x80, 0x0a, 0x22, 0xc8, 0x5e, 0x48, 0x9d, 0xa8, 0x8e, 0xe9, 0x0f, 0x7b, 0xae, 0x64, 0x87, 0xbd, 0xe6, 0x93, 0x27, 0x01, 0xf3, 0xe9, 0x21, 0x8a, 0xcb, 0x57, 0xcd, 0x1c, 0xe5, 0xa9, 0x6a, 0x6b, 0x46, 0x3f, 0xcf, 0xca, 0xea, 0x8a, 0xe6, 0x48, 0x0d, 0x33, 0x56, 0xaf, 0x0e, 0x66, 0x9a, 0x1b, 0x30, 0x33, 0x94, 0x43, 0x8d, 0x2f, 0x53, 0xd1, 0x39, 0xd7, 0x3a, 0x19, 0x56, 0xae, 0x94, 0x05, 0x8f, 0x9a, 0x66, 0xf6, 0x1b, 0x2d, 0x0f, 0x95, 0xf1, 0xe1, 0xc2, 0x6d, 0x68, 0x7b, 0xa6, 0xe8, 0xce, 0x35, 0x45, 0x65, 0x02, 0x65, 0xe5, 0x8b, 0xca, 0x45, 0x59, 0x39, 0xe6, 0xf2, 0xe9, 0x73, 0x32, 0x72, 0x5c, 0x1b, 0x00, 0x35, 0x1c, 0x43, 0x35, 0x4b, 0x62, 0xf3, 0x50, 0xff, 0x1d, 0x23, 0x84, 0xfa, 0x79, 0xea, 0xb7, 0x86, 0x3f, 0xf7, 0x85, 0xf6, 0x92, 0xa1, 0x8f, 0xdd, 0xe0, 0xb8, 0x46, 0x16, 0xf5, 0x66, 0x19, 0x8c, 0x78, 0x8d, 0x8c, 0xe9, 0x8d, 0x79, 0xbc, 0x63, 0xdb, 0x95, 0xa0, 0x07, 0x4e, 0x59, 0x33, 0x2b, 0xda, 0x96, 0x59, 0x06, 0x57, 0xde, 0x22, 0x66, 0x57, 0x0c, 0xb0, 0x4b, 0x6a, 0x94, 0xcb, 0x14, 0xe9, 0x36, 0xdf, 0x96, 0xa0, 0x81, 0x79, 0x92, 0xe1, 0x98, 0xb0, 0x1b, 0xe0, 0x5d, 0xb4, 0xef, 0xfd, 0x6d, 0x43, 0x45, 0x68, 0xba, 0xc7, 0xb6, 0x4a, 0x4d, 0x51, 0x46, 0x18, 0x17, 0x11, 0xbc, 0xa8, 0x65, 0x4a, 0xd0, 0x3b, 0x25, 0xe8, 0x9d, 0x4b, 0xa0, 0x37, 0xa0, 0x74, 0xed, 0x2f, 0xa2, 0x95, 0x8e, 0xaf, 0x09, 0xa0, 0xea, 0x7e, 0xff, 0xa3, 0x87, 0xf2, 0x52, 0x9b, 0x37, 0x14, 0x59, 0xff, 0xd0, 0xfd, 0x3c, 0x20, 0x61, 0x42, 0xb3, 0x6c, 0xab, 0xf7, 0x1e, 0xc7, 0x59, 0x18, 0x1b, 0x8c, 0x90, 0xc4, 0xe2, 0x51, 0x30, 0xd0, 0x32, 0xba, 0xc3, 0x11, 0x7f, 0xae, 0x27, 0xa5, 0x47, 0xfb, 0x54, 0x3c, 0x96, 0xe6, 0x64, 0x4f, 0xca, 0xcc, 0x08, 0x54, 0xc3, 0xc9, 0xa5, 0x33, 0x5b, 0x18, 0xda, 0xd8, 0x94, 0x97, 0x68, 0xae, 0xe2, 0x05, 0xae, 0xf9, 0xb6, 0x2c, 0x2f, 0x15, 0x0d, 0x63, 0x9a, 0x4b, 0xe5, 0xde, 0x1a, 0x42, 0x17, 0x0c, 0x14, 0x7d, 0x63, 0x78, 0x9e, 0x79, 0xa2, 0x8b, 0xa6, 0x63, 0x98, 0x19, 0xd4, 0xa1, 0x0c, 0xa5, 0x76, 0x9e, 0x59, 0xd7, 0xce, 0x3f, 0x26, 0x2a, 0xf5, 0x2a, 0xa1, 0xcd, 0x80, 0xc5, 0x94, 0x0b, 0x47, 0x9f, 0xd4, 0x8d, 0x41, 0xe9, 0xba, 0x46, 0x2e, 0x1e, 0x3d, 0x78, 0x4f, 0x82, 0xe1, 0xe7, 0x63, 0x80, 0x9f, 0x9b, 0xae, 0x4a, 0x06, 0x4e, 0x3c, 0x74, 0x2d, 0x0f, 0x59, 0xf1, 0x1d, 0xcf, 0x9d, 0xb5, 0x91, 0x3a, 0x6f, 0x2f, 0xb5, 0xd7, 0x96, 0x56, 0x9a, 0xab, 0xef, 0xac, 0x97, 0x05, 0x5b, 0xb9, 0xa0, 0x9c, 0x9b, 0x42, 0xa5, 0x45, 0x99, 0x7f, 0x20, 0x3f, 0x5f, 0x4a, 0x7d, 0x4f, 0x30, 0x67, 0x96, 0xd1, 0x1e, 0x76, 0x43, 0x20, 0x47, 0x52, 0x1d, 0xd6, 0xc1, 0x8f, 0x90, 0x53, 0xb9, 0x46, 0x00, 0x95, 0x0c, 0x23, 0xf7, 0x48, 0x9a, 0x6c, 0xbd, 0xcc, 0x24, 0xca, 0x30, 0x7a, 0x58, 0x58, 0x73, 0xe1, 0xcb, 0x4d, 0x60, 0x41, 0x98, 0x6b, 0xe4, 0x98, 0x9c, 0x0e, 0xa2, 0x03, 0x3a, 0xc3, 0x0c, 0x64, 0xd8, 0x1a, 0x6b, 0x86, 0xa8, 0xe2, 0xf9, 0x44, 0x8d, 0x34, 0x3b, 0x03, 0x43, 0x49, 0x41, 0x07, 0xf2, 0xff, 0x83, 0x21, 0x09, 0x78, 0x3c, 0x83, 0x51, 0xe8, 0xf2, 0xcc, 0x18, 0x81, 0x85, 0x89, 0xf7, 0x71, 0xca, 0xda, 0x95, 0x6e, 0x18, 0x3b, 0xad, 0x75, 0xf7, 0xfa, 0x96, 0xf4, 0x70, 0xd6, 0x76, 0x38, 0xed, 0x0a, 0x27, 0x9b, 0xbf, 0xc6, 0x94, 0xab, 0x97, 0xaf, 0x30, 0x1e, 0xa3, 0x02, 0x8e, 0x70, 0x26, 0x9c, 0x5b, 0xf7, 0x32, 0x93, 0x1d, 0xb8, 0x05, 0xcd, 0x26, 0xbc, 0x59, 0x04, 0x9b, 0xcd, 0xf1, 0x16, 0xfe, 0xe9, 0x11, 0xec, 0x63, 0xc5, 0x50, 0xbb, 0x99, 0xaa, 0xec, 0xb8, 0x4c, 0x0d, 0x3b, 0xd0, 0xb8, 0x43, 0xe5, 0xaf, 0xe0, 0x6d, 0x58, 0xb9, 0xdc, 0x94, 0xf4, 0xfa, 0x2f, 0x79, 0x1c, 0xa7, 0x59, \ No newline at end of file +0x78, 0xda, 0xed, 0x56, 0x4f, 0x6f, 0xe3, 0x44, 0x14, 0x77, 0x0f, 0x20, 0xc5, 0x22, 0x52, 0x73, 0x45, 0x1c, 0x9e, 0x16, 0x21, 0xec, 0x36, 0xcd, 0x3a, 0x6d, 0x37, 0xa0, 0x6c, 0x5b, 0x69, 0x17, 0xb4, 0xa2, 0xd2, 0x22, 0x21, 0xb6, 0x6c, 0xe9, 0xa1, 0x5a, 0x4d, 0xe3, 0x49, 0x63, 0xe1, 0x8c, 0xc3, 0x78, 0xdc, 0x34, 0x5a, 0x95, 0x23, 0x9f, 0x80, 0x0f, 0xc0, 0x09, 0xae, 0x70, 0xe2, 0xce, 0x0d, 0x29, 0x95, 0xfa, 0x01, 0xea, 0x6a, 0xf9, 0x00, 0x64, 0x39, 0x54, 0x70, 0x84, 0x37, 0xe3, 0xb1, 0x33, 0x4e, 0xb7, 0xdb, 0xae, 0x84, 0x04, 0x48, 0x1d, 0xe5, 0xb9, 0xe3, 0x37, 0xef, 0xfd, 0xde, 0xdf, 0x79, 0xee, 0x1b, 0x9e, 0x65, 0xbd, 0xf9, 0x56, 0x7d, 0xf7, 0xdd, 0xdd, 0x1f, 0x37, 0x1e, 0x3d, 0x3f, 0xda, 0xfe, 0xeb, 0x38, 0xf9, 0xfe, 0xf7, 0xc1, 0xfb, 0x3f, 0xf9, 0xef, 0x7c, 0x39, 0x72, 0x5b, 0xd1, 0xdd, 0xdd, 0x5f, 0xee, 0x7d, 0xf7, 0x47, 0xfc, 0xfc, 0xcf, 0xf3, 0xf3, 0xf3, 0x6f, 0x7e, 0xf8, 0xf9, 0x71, 0xf8, 0xf5, 0xca, 0xda, 0xf6, 0xdc, 0xb7, 0xaf, 0x5b, 0x57, 0xad, 0x5a, 0xad, 0x86, 0x34, 0x97, 0x22, 0x1d, 0xcf, 0x90, 0xe4, 0xa5, 0xd6, 0x3c, 0x3e, 0xaa, 0xb5, 0x93, 0xf1, 0x0c, 0x9d, 0xa6, 0x56, 0x2a, 0x97, 0x44, 0x48, 0xd3, 0xf9, 0xda, 0xf8, 0xb4, 0x4c, 0xc7, 0xc8, 0x93, 0xfc, 0xab, 0x96, 0x75, 0xb3, 0xfe, 0xd5, 0x95, 0xd7, 0x39, 0xa7, 0x39, 0xeb, 0x24, 0xfd, 0x75, 0x72, 0x86, 0x34, 0xc1, 0xfd, 0xb3, 0xb3, 0x2a, 0xd6, 0xb8, 0x9a, 0xea, 0x55, 0xc5, 0xc3, 0x74, 0x9c, 0x66, 0x94, 0xad, 0x13, 0xac, 0xf1, 0x89, 0xae, 0x75, 0x46, 0x55, 0xab, 0x38, 0xc4, 0xfd, 0x6c, 0xbd, 0x65, 0x47, 0x54, 0x35, 0xcd, 0xdf, 0xd4, 0xff, 0xbf, 0x50, 0xff, 0xc9, 0xcb, 0x28, 0x3d, 0x1e, 0x8f, 0xd3, 0xf1, 0x0c, 0x49, 0x5e, 0xb1, 0xe6, 0x6b, 0xa7, 0x33, 0x94, 0x1a, 0x74, 0x73, 0xff, 0xff, 0xcf, 0xf5, 0xaf, 0x59, 0xe9, 0x6f, 0x38, 0x08, 0x26, 0x93, 0x49, 0x15, 0x65, 0xe7, 0xf5, 0x9d, 0xcd, 0x49, 0xae, 0x33, 0xac, 0xf1, 0x04, 0xe9, 0xd9, 0x19, 0x7e, 0x28, 0x26, 0x65, 0xaa, 0x59, 0x57, 0x96, 0xbf, 0xf6, 0x5a, 0x52, 0xb1, 0x96, 0x96, 0x40, 0x04, 0x22, 0xa4, 0x6d, 0xb8, 0x9f, 0x30, 0x36, 0xea, 0x13, 0xfe, 0x05, 0x04, 0x0c, 0x1e, 0x26, 0xc4, 0xc6, 0x23, 0x92, 0x88, 0x5e, 0xc4, 0xdb, 0xf0, 0x29, 0xd9, 0x0b, 0x08, 0xdc, 0x0b, 0x7b, 0xa4, 0xdb, 0x25, 0x5c, 0x9e, 0xf8, 0x34, 0xee, 0xa0, 0x0e, 0x65, 0x9d, 0x9e, 0xd4, 0x09, 0xd8, 0x3e, 0x88, 0x28, 0x0a, 0xf1, 0x01, 0x31, 0xa5, 0xd0, 0x8b, 0x86, 0xd0, 0x27, 0x6c, 0x04, 0x7b, 0x88, 0x1a, 0xd0, 0x18, 0x3a, 0x84, 0x41, 0x37, 0x1c, 0x01, 0xe1, 0x51, 0xc2, 0x7c, 0x10, 0x3d, 0x0a, 0x71, 0x87, 0x53, 0xca, 0xea, 0x90, 0xc4, 0x52, 0x1b, 0x2d, 0x36, 0x24, 0x70, 0x18, 0x74, 0x28, 0x8b, 0xd1, 0x9f, 0x8f, 0x37, 0xb7, 0xe0, 0x61, 0xf6, 0x02, 0xf2, 0x20, 0x60, 0x83, 0x44, 0xb4, 0x61, 0x9f, 0xf4, 0xe9, 0x80, 0xf8, 0x92, 0x83, 0x00, 0xc1, 0x00, 0x59, 0x61, 0xe6, 0xec, 0x01, 0xe5, 0x71, 0x10, 0xb1, 0x36, 0x34, 0x1b, 0xcd, 0x86, 0x67, 0xdb, 0x19, 0xfe, 0x76, 0xe0, 0x8b, 0x1e, 0xac, 0xc3, 0xf2, 0xaa, 0xa7, 0x39, 0x1f, 0xd1, 0x60, 0xbf, 0x27, 0x90, 0xd5, 0x5c, 0x69, 0xd9, 0xd2, 0xe9, 0x3d, 0xc2, 0x0b, 0x1e, 0x72, 0xf0, 0x89, 0xda, 0xdd, 0x84, 0x75, 0x04, 0xc2, 0x01, 0x27, 0xcc, 0x8f, 0xfa, 0x0f, 0xc2, 0x88, 0x08, 0x27, 0x8c, 0x86, 0x94, 0xd7, 0x61, 0x9f, 0x53, 0x22, 0x28, 0x77, 0xed, 0x0a, 0xa7, 0x22, 0xe1, 0x0c, 0x9c, 0x3e, 0x11, 0xbd, 0x46, 0x26, 0xe9, 0xb8, 0xb0, 0x00, 0x8e, 0x16, 0x01, 0x0c, 0x48, 0xea, 0xb8, 0x2e, 0x2c, 0x66, 0xbb, 0xbb, 0x36, 0x65, 0xbe, 0x6d, 0xab, 0x6c, 0xa3, 0xa5, 0xa7, 0x43, 0xe9, 0xdf, 0xba, 0x57, 0xef, 0x29, 0x0f, 0x70, 0x73, 0x88, 0x34, 0x42, 0x8a, 0x07, 0x94, 0xfa, 0x9f, 0xe7, 0x9b, 0x1d, 0xb5, 0xe1, 0x81, 0xa0, 0xeb, 0xde, 0x91, 0xe1, 0x9d, 0xc2, 0x69, 0x33, 0x3a, 0x74, 0x22, 0x74, 0x27, 0x42, 0xc4, 0x08, 0x22, 0x0e, 0x4f, 0x8f, 0xec, 0x4a, 0x4c, 0x45, 0x9f, 0x0a, 0x22, 0xc8, 0x5e, 0x48, 0x9d, 0xa8, 0x8e, 0x75, 0x09, 0xbb, 0xae, 0x64, 0x87, 0xdd, 0xc6, 0x93, 0x27, 0x01, 0xf3, 0xe9, 0x21, 0x8a, 0xcb, 0x57, 0xcd, 0x1c, 0xe6, 0xa9, 0x6a, 0x69, 0x46, 0x2f, 0xcf, 0xca, 0xca, 0xb2, 0xe6, 0x48, 0x0d, 0x33, 0x56, 0xaf, 0x0e, 0x66, 0x9a, 0x97, 0x60, 0x0a, 0x94, 0x9b, 0x1a, 0x5d, 0xa6, 0xa2, 0x73, 0xae, 0x75, 0x32, 0x5b, 0xb9, 0x52, 0x16, 0x3c, 0x6a, 0x9a, 0xd9, 0x5f, 0x6a, 0x7a, 0xa8, 0x8c, 0x0f, 0x17, 0x6e, 0x43, 0xcb, 0x33, 0x45, 0x77, 0xae, 0x29, 0x2a, 0x13, 0x28, 0x2b, 0x5f, 0x54, 0x2e, 0xca, 0xca, 0x31, 0x93, 0x4f, 0x9f, 0x93, 0xa1, 0xe3, 0xda, 0x00, 0xa8, 0xe1, 0x18, 0xaa, 0x59, 0x12, 0x1b, 0x87, 0xfa, 0xef, 0x08, 0x4d, 0xa8, 0x9f, 0xa7, 0x7e, 0xab, 0xf8, 0x73, 0x5f, 0x88, 0x97, 0x0c, 0x7c, 0xec, 0x06, 0xc7, 0x35, 0xb2, 0xa8, 0x37, 0x8b, 0x60, 0xc4, 0x6b, 0x64, 0x4c, 0x6f, 0xcc, 0xe3, 0x1d, 0xdb, 0xae, 0x04, 0x5d, 0x70, 0xca, 0x9a, 0x59, 0xd1, 0x36, 0xcc, 0x32, 0xb8, 0xf2, 0x7a, 0x31, 0xbb, 0x62, 0x18, 0xbb, 0xa4, 0x46, 0xb9, 0x4c, 0x91, 0x6e, 0xf3, 0x6d, 0x01, 0x96, 0x30, 0x4f, 0x32, 0x1c, 0xd3, 0xec, 0x1a, 0x78, 0x17, 0xf1, 0xbd, 0x57, 0x06, 0x2a, 0x42, 0xd3, 0x3d, 0xb6, 0x51, 0x6a, 0x8a, 0xb2, 0x85, 0x51, 0x11, 0xc1, 0x8b, 0x5a, 0xa6, 0x64, 0x7a, 0xa7, 0x64, 0x7a, 0xe7, 0x12, 0xd3, 0x6b, 0x50, 0xba, 0xf6, 0x17, 0xad, 0x95, 0x8e, 0xaf, 0x69, 0x40, 0xd5, 0xfd, 0xc1, 0x27, 0x8f, 0xe4, 0xa5, 0x36, 0x6f, 0x28, 0xb2, 0xfe, 0xa1, 0xfb, 0x79, 0x40, 0xc2, 0x84, 0x66, 0xd9, 0x56, 0xef, 0x5d, 0x8e, 0xb3, 0x30, 0x36, 0x18, 0x21, 0x89, 0xc5, 0x56, 0xd0, 0xd7, 0x32, 0xba, 0xc3, 0xd1, 0xfe, 0x4c, 0x4f, 0x4a, 0x8f, 0xf6, 0xa9, 0x78, 0x2c, 0xe1, 0x64, 0x4f, 0xca, 0xcc, 0x08, 0x54, 0xc3, 0xc9, 0xa5, 0x33, 0x5b, 0x00, 0xad, 0xad, 0xcb, 0x4b, 0x34, 0x53, 0xf1, 0xc2, 0xae, 0xf9, 0xb6, 0x28, 0x2f, 0x15, 0x0d, 0x63, 0x9a, 0x4b, 0xe5, 0xde, 0x1a, 0x42, 0x17, 0x00, 0x8a, 0xbe, 0x31, 0x3c, 0xcf, 0x3c, 0xd1, 0x45, 0xd3, 0x31, 0x4c, 0x01, 0x75, 0x28, 0x03, 0xa9, 0x9d, 0x67, 0xd6, 0xb5, 0xf3, 0xaf, 0x8c, 0x4a, 0xbd, 0x4a, 0x68, 0x23, 0xc0, 0xef, 0x06, 0x17, 0x8e, 0x3e, 0xa9, 0x1b, 0x83, 0xd2, 0x75, 0x8d, 0x5c, 0x6c, 0x6d, 0x7e, 0x20, 0x8d, 0xe1, 0xe7, 0xa3, 0x8f, 0xdf, 0xa1, 0x8e, 0x4a, 0x06, 0x4e, 0x3c, 0x74, 0x2d, 0x0f, 0x59, 0xf1, 0x1d, 0xcf, 0x9d, 0xb6, 0x91, 0x3a, 0x6f, 0x2d, 0xb4, 0x56, 0x17, 0x96, 0x1b, 0x2b, 0xef, 0xdd, 0x29, 0x0b, 0x36, 0x73, 0x41, 0x39, 0x37, 0x85, 0x4a, 0x8b, 0x82, 0xdf, 0x94, 0x9f, 0x2f, 0xa5, 0xbe, 0x27, 0x98, 0x33, 0xcd, 0x68, 0x17, 0xbb, 0x21, 0x90, 0x23, 0xa9, 0x0e, 0x77, 0xc0, 0x8f, 0x90, 0x53, 0xb9, 0x46, 0x00, 0x95, 0xcc, 0x46, 0xee, 0x91, 0x84, 0x6c, 0xbe, 0x0c, 0x12, 0x65, 0x18, 0x3d, 0x2c, 0xd0, 0x5c, 0xf8, 0x6a, 0x1d, 0x58, 0x10, 0xe6, 0x1a, 0xb9, 0x4d, 0x4e, 0xfb, 0xd1, 0x01, 0x9d, 0xda, 0x0c, 0x64, 0xd8, 0xda, 0xd6, 0xd4, 0xa2, 0x8a, 0xe7, 0x33, 0x35, 0xd2, 0xec, 0xcc, 0x18, 0x4a, 0x0a, 0xda, 0x97, 0xff, 0x38, 0x0c, 0x48, 0xc0, 0xe3, 0xa9, 0x19, 0x65, 0x5d, 0x9e, 0x19, 0x23, 0xb0, 0x80, 0xf8, 0x10, 0xa7, 0xac, 0x5d, 0xe9, 0x84, 0xb1, 0xd3, 0xbc, 0xe3, 0x5e, 0x1f, 0x49, 0x0f, 0x67, 0x8d, 0xc3, 0x69, 0x47, 0x38, 0xd9, 0xfc, 0x35, 0xa6, 0x5c, 0xbd, 0x7c, 0x85, 0xf1, 0x18, 0x15, 0x70, 0x84, 0x33, 0xe1, 0xdc, 0xba, 0x9f, 0x41, 0xb6, 0xe1, 0x16, 0x34, 0x1a, 0xf0, 0x76, 0x11, 0x6c, 0x36, 0xc7, 0x9b, 0xf8, 0xa7, 0x4b, 0xb0, 0x8f, 0x15, 0x43, 0xed, 0xa6, 0xaa, 0xb2, 0xe3, 0x32, 0x35, 0xec, 0x40, 0xe3, 0x0e, 0x95, 0xbf, 0x82, 0xb7, 0x61, 0xf9, 0x72, 0x28, 0xe9, 0xf5, 0xdf, 0xd6, 0x34, 0xaf, 0x20, \ No newline at end of file diff --git a/build/assets/moondemo.tic.dat b/build/assets/moondemo.tic.dat index c8fdf5b94..5c6b45ff0 100644 --- a/build/assets/moondemo.tic.dat +++ b/build/assets/moondemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0xcd, 0x4a, 0xc3, 0x40, 0x10, 0xde, 0xfa, 0x73, 0xc8, 0x5e, 0xc4, 0x37, 0x58, 0x0b, 0x82, 0xda, 0x84, 0x26, 0x69, 0x29, 0x5a, 0x48, 0x2f, 0x2a, 0x28, 0x14, 0x0a, 0x22, 0x78, 0xae, 0xed, 0xaa, 0x81, 0xb6, 0x09, 0xc9, 0x2a, 0xe9, 0x1b, 0xe4, 0xd0, 0x87, 0xf0, 0x28, 0x61, 0x1f, 0x62, 0xcf, 0x32, 0xf4, 0x49, 0xca, 0x3e, 0x83, 0xb3, 0xa9, 0x96, 0x1e, 0x44, 0x0f, 0x3d, 0x78, 0x71, 0x66, 0x87, 0xdd, 0xef, 0x9b, 0xf9, 0x86, 0x85, 0x6f, 0x9f, 0x10, 0x52, 0x79, 0xdd, 0x22, 0xbf, 0xc5, 0x1c, 0x30, 0xf2, 0x3c, 0x97, 0x45, 0x51, 0x48, 0x73, 0x23, 0x94, 0xa0, 0x56, 0x05, 0xb0, 0xd0, 0x79, 0x0e, 0xba, 0x28, 0x94, 0xce, 0xdf, 0x94, 0x06, 0xa9, 0x40, 0x49, 0xa5, 0xbe, 0xea, 0x7b, 0x3d, 0xfc, 0xa8, 0x87, 0x35, 0x3d, 0xf9, 0x8f, 0x3f, 0x8d, 0xd2, 0x2b, 0xe3, 0x5d, 0x99, 0xef, 0xe5, 0x7b, 0x86, 0x3e, 0x02, 0x51, 0x80, 0xde, 0xce, 0x41, 0x12, 0x40, 0xef, 0x16, 0x12, 0xfd, 0x2b, 0x3e, 0xcb, 0xf8, 0x49, 0xd4, 0x42, 0x03, 0x68, 0xbd, 0xa9, 0xde, 0xea, 0x6c, 0xf6, 0xff, 0xed, 0x9d, 0xdd, 0xbd, 0x0a, 0x71, 0x1c, 0x26, 0x42, 0x31, 0xe2, 0x6d, 0xc6, 0x1e, 0xfb, 0x63, 0xbe, 0x04, 0x14, 0xd9, 0xfe, 0xb3, 0x78, 0x8a, 0x92, 0xf6, 0x92, 0x1d, 0xf2, 0x17, 0x3e, 0x8a, 0x62, 0x9e, 0x98, 0xce, 0x90, 0xa7, 0x03, 0x1c, 0x67, 0x29, 0xf6, 0x45, 0x89, 0x92, 0x30, 0x16, 0x61, 0x34, 0x31, 0xcd, 0x25, 0x68, 0xb3, 0x71, 0x84, 0x98, 0x8a, 0xc0, 0xa5, 0x59, 0x70, 0xd6, 0xa2, 0xd3, 0xc0, 0x6f, 0x52, 0xca, 0xb3, 0xd8, 0x48, 0x6e, 0xaf, 0xcf, 0x03, 0xa7, 0x43, 0xad, 0xf0, 0x81, 0xdd, 0x8b, 0x09, 0x73, 0xa9, 0x65, 0x4d, 0x9d, 0xc0, 0x5b, 0x11, 0x9e, 0x21, 0x6a, 0x6b, 0x84, 0x8f, 0x44, 0xb6, 0x3e, 0xd1, 0x30, 0x84, 0x99, 0xa0, 0xd6, 0x60, 0x94, 0x32, 0x0f, 0x71, 0x1a, 0x27, 0xcc, 0xab, 0x1d, 0x89, 0xc3, 0x96, 0x7b, 0x5c, 0xaf, 0x37, 0xdc, 0x13, 0xdf, 0xce, 0xec, 0xa9, 0xed, 0x35, 0xed, 0x86, 0xed, 0x62, 0xfa, 0x36, 0x6e, 0x89, 0x93, 0x70, 0x22, 0x58, 0xf5, 0xea, 0xb2, 0xdb, 0xed, 0xb1, 0xbb, 0xde, 0x4d, 0xf7, 0xe2, 0xa0, 0x6a, 0x9f, 0x36, 0xf1, 0x50, 0x4b, 0x98, 0x7d, 0x1f, 0x38, 0x10, 0xff, 0x73, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xcd, 0x4a, 0xc3, 0x40, 0x10, 0xde, 0xfa, 0x73, 0xc8, 0xde, 0x7c, 0x83, 0x51, 0x10, 0xd4, 0xa6, 0x35, 0x69, 0x8b, 0x68, 0x21, 0x5e, 0x54, 0xb0, 0x50, 0x29, 0x48, 0xc1, 0x73, 0x1b, 0x57, 0xbb, 0x98, 0x26, 0x21, 0xd9, 0xd6, 0xf6, 0x0d, 0x22, 0xf8, 0x10, 0x1e, 0x25, 0xe4, 0x21, 0xf6, 0x2c, 0x4b, 0x9f, 0xa4, 0xe4, 0x19, 0x9c, 0x8d, 0xad, 0xf4, 0x20, 0x7a, 0xf0, 0xe0, 0xc5, 0xd9, 0x1d, 0x76, 0xe7, 0x9b, 0xf9, 0x66, 0x06, 0xbe, 0x2d, 0x42, 0x48, 0xe9, 0x65, 0x8d, 0xfc, 0x64, 0x33, 0x85, 0x96, 0x24, 0x49, 0x96, 0xa6, 0x69, 0xa6, 0x5f, 0x0c, 0x33, 0x25, 0x3f, 0x5d, 0xa9, 0x79, 0x9e, 0x24, 0x2a, 0x4f, 0x53, 0x99, 0x27, 0xaf, 0x32, 0x57, 0x99, 0x54, 0x32, 0x93, 0x72, 0xe9, 0x5f, 0xf3, 0xd5, 0xb7, 0x7c, 0xb5, 0xc2, 0x27, 0xff, 0xf6, 0xa7, 0x56, 0x68, 0xa5, 0xb5, 0x2b, 0xce, 0x5b, 0xf1, 0x7f, 0x46, 0x1d, 0x15, 0x91, 0x0a, 0xb5, 0x9d, 0xa9, 0x8c, 0x28, 0xd4, 0x6e, 0x9e, 0xa1, 0x7e, 0xe9, 0xc2, 0xb5, 0x9e, 0x44, 0xce, 0x73, 0xa5, 0xf2, 0xfc, 0xb7, 0x7c, 0xe3, 0xf4, 0x77, 0xfb, 0xaf, 0x6f, 0x6c, 0x3e, 0x95, 0x48, 0xa5, 0x02, 0x82, 0x0b, 0x8f, 0x35, 0x01, 0xe0, 0xbe, 0x37, 0x64, 0x1f, 0x11, 0x45, 0xb8, 0x37, 0x12, 0x83, 0x20, 0x6a, 0x2e, 0xe0, 0x5b, 0x36, 0x66, 0x5e, 0x10, 0xb2, 0xc8, 0x04, 0x36, 0xec, 0x71, 0x0f, 0x1f, 0xe1, 0x56, 0x75, 0xdd, 0x2d, 0x8b, 0x5d, 0xcd, 0x86, 0x18, 0xcb, 0x45, 0x11, 0x46, 0x3c, 0x14, 0x3c, 0xf0, 0x75, 0x36, 0xe6, 0xa2, 0xe8, 0x0d, 0x8f, 0xac, 0xaf, 0xff, 0xe0, 0x71, 0xff, 0x41, 0x27, 0x3c, 0xee, 0x32, 0x3f, 0xc6, 0xdc, 0x55, 0xab, 0x0b, 0xed, 0x8f, 0x00, 0xf6, 0xdc, 0x41, 0xcf, 0xbf, 0xc7, 0x25, 0x06, 0x3c, 0x06, 0x11, 0xc0, 0x34, 0x18, 0x45, 0xcb, 0x4a, 0x08, 0xee, 0xc0, 0x1d, 0x04, 0x18, 0xec, 0x6b, 0xfe, 0x98, 0x45, 0x31, 0xce, 0x68, 0x82, 0x55, 0xb5, 0x8b, 0x41, 0xc5, 0x54, 0x1c, 0x35, 0x0c, 0x70, 0x32, 0x15, 0x8e, 0x45, 0x27, 0xce, 0xc9, 0x11, 0x9d, 0x3a, 0xb5, 0x06, 0xa5, 0x6c, 0x12, 0xea, 0xe5, 0xba, 0xad, 0x33, 0xa7, 0x72, 0x4a, 0x0d, 0x7e, 0x07, 0x7d, 0xe1, 0x83, 0x45, 0x0d, 0x63, 0x5a, 0x71, 0xec, 0x4f, 0xc0, 0xd6, 0x40, 0x79, 0x05, 0xa8, 0x21, 0x30, 0x59, 0xad, 0xa8, 0x6b, 0x40, 0x57, 0x50, 0xc3, 0xf5, 0x62, 0xb0, 0x31, 0x8e, 0xc3, 0x08, 0xec, 0xf2, 0x9e, 0xd8, 0x3d, 0xb2, 0xf6, 0x0f, 0x0f, 0xeb, 0xd6, 0x41, 0xcd, 0x9c, 0x98, 0x53, 0xd3, 0x6e, 0x98, 0x75, 0xd3, 0xc2, 0x53, 0x33, 0xb1, 0x4b, 0x18, 0x71, 0x5f, 0xc0, 0xce, 0xe5, 0x45, 0xbb, 0xdd, 0x81, 0x9b, 0xce, 0x75, 0xfb, 0x7c, 0x7b, 0xc7, 0x3c, 0x6e, 0xe0, 0xa5, 0x86, 0xd0, 0xfd, 0xde, 0x01, 0xdf, 0x8d, 0x26, 0x5f, \ No newline at end of file diff --git a/build/assets/moonmark.tic.dat b/build/assets/moonmark.tic.dat index 92b78e1ca..70c030ce5 100644 --- a/build/assets/moonmark.tic.dat +++ b/build/assets/moonmark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xdc, 0x44, 0x14, 0x77, 0x0e, 0x54, 0xb2, 0xc5, 0x4a, 0xeb, 0x2b, 0xe2, 0xf0, 0x52, 0x84, 0xd8, 0x4d, 0x77, 0xb7, 0xf6, 0x26, 0x59, 0x90, 0xc9, 0x46, 0xdb, 0x82, 0x10, 0x95, 0x40, 0x42, 0xa4, 0x34, 0x44, 0x6a, 0x0e, 0x5e, 0x7b, 0x36, 0xb6, 0xb0, 0xc7, 0x66, 0x3c, 0x4e, 0xb2, 0x45, 0xbd, 0xf2, 0x09, 0xf8, 0x00, 0x9c, 0xe0, 0x0a, 0x27, 0xee, 0xdc, 0x90, 0x36, 0x52, 0x3e, 0x40, 0x1c, 0x95, 0x0f, 0xc0, 0x96, 0x43, 0x04, 0x47, 0x78, 0xe3, 0xb1, 0xbd, 0x7f, 0x4a, 0x9a, 0xde, 0x68, 0xa5, 0x8c, 0xfc, 0x66, 0xed, 0xf7, 0x7e, 0xbf, 0x37, 0x33, 0xef, 0xcf, 0xec, 0xeb, 0x86, 0xa2, 0xbc, 0xf1, 0x66, 0x6b, 0xff, 0x9d, 0xfd, 0x9f, 0xb7, 0x77, 0x9e, 0x3e, 0xde, 0xfd, 0xe7, 0x24, 0xfd, 0xf1, 0xcf, 0xf8, 0xbd, 0x5f, 0xdc, 0xb7, 0xbf, 0x1e, 0x37, 0x7b, 0xd1, 0xfb, 0xfb, 0xbf, 0xdd, 0xf9, 0xe1, 0xaf, 0xe4, 0xe9, 0xdf, 0x17, 0x17, 0x17, 0xdf, 0xfd, 0xf4, 0xeb, 0x83, 0xe0, 0xdb, 0xf5, 0xad, 0xdd, 0x95, 0xef, 0x6f, 0x28, 0x57, 0x0d, 0x5d, 0xd7, 0x51, 0x56, 0x32, 0x94, 0x93, 0x25, 0x11, 0xba, 0x4c, 0xa9, 0xe3, 0x54, 0xd3, 0x4f, 0x27, 0x4b, 0x72, 0x96, 0x29, 0x99, 0x18, 0xc2, 0x43, 0x96, 0xd5, 0xf5, 0xc9, 0xd9, 0xa2, 0x9c, 0xa0, 0x4e, 0xe8, 0xaf, 0x1a, 0xca, 0xf5, 0xf8, 0x5f, 0x47, 0x99, 0xe7, 0x52, 0x56, 0x94, 0xd3, 0xec, 0xf7, 0xe9, 0x39, 0xca, 0x14, 0xdf, 0x9f, 0x9c, 0xd7, 0x30, 0xc7, 0xb5, 0xac, 0x18, 0x35, 0x34, 0x66, 0x93, 0x4c, 0x8a, 0x1c, 0xa7, 0x98, 0xe3, 0xd3, 0x22, 0xd7, 0x52, 0x6a, 0x4a, 0x65, 0xc4, 0xf7, 0xe5, 0x7c, 0x8b, 0x8a, 0xa8, 0x15, 0x52, 0xbf, 0xce, 0xff, 0xcb, 0x90, 0xff, 0xe9, 0xf3, 0x24, 0x3b, 0x99, 0x4c, 0xb2, 0xc9, 0x92, 0x08, 0x5d, 0x35, 0xea, 0xfa, 0xd9, 0x92, 0x64, 0x73, 0x72, 0xdd, 0xff, 0xaf, 0x72, 0xfe, 0x75, 0x25, 0xfb, 0x03, 0x2f, 0x82, 0xe9, 0x74, 0x5a, 0x43, 0x6c, 0xbd, 0xe8, 0xd9, 0x52, 0xc4, 0x38, 0xc7, 0x1c, 0x4f, 0x51, 0x9e, 0x9c, 0xe3, 0x1f, 0xc5, 0x74, 0x51, 0x74, 0xe5, 0xca, 0xf4, 0xeb, 0xaf, 0x3d, 0xba, 0xa1, 0xb4, 0xdb, 0xc0, 0x7d, 0x1e, 0x10, 0x0b, 0xee, 0xa6, 0x94, 0x8e, 0x43, 0x9b, 0x7d, 0x05, 0x3e, 0x85, 0x4f, 0xa3, 0x88, 0xee, 0x38, 0xcc, 0x8f, 0xb9, 0x86, 0x08, 0x3b, 0xe5, 0x5e, 0xc4, 0x2c, 0xf8, 0x3c, 0x1a, 0xc2, 0x27, 0x91, 0xed, 0x78, 0x42, 0xe9, 0x92, 0xc4, 0x41, 0x16, 0xa1, 0x8e, 0x27, 0x58, 0x3e, 0x3d, 0x00, 0x1e, 0x45, 0x01, 0x4e, 0x90, 0x10, 0x02, 0x5e, 0x74, 0x04, 0xa1, 0x4d, 0xc7, 0x30, 0x44, 0xbf, 0x3e, 0x49, 0xc0, 0xb1, 0x29, 0x8c, 0x82, 0x31, 0xd8, 0x2c, 0x4a, 0xa9, 0x0b, 0xdc, 0x23, 0x90, 0x38, 0x8c, 0x10, 0xda, 0x82, 0x34, 0x11, 0xec, 0xd9, 0x9a, 0x1d, 0xe1, 0xdf, 0xa7, 0x71, 0xca, 0x2d, 0x38, 0xb0, 0x43, 0x12, 0xdb, 0xae, 0xd0, 0x24, 0xb9, 0xd1, 0x82, 0x10, 0x81, 0xe2, 0xfb, 0x90, 0xb0, 0xc4, 0x8f, 0xa8, 0x05, 0x66, 0xc7, 0xec, 0x18, 0x9a, 0x26, 0xdd, 0xed, 0xfa, 0x2e, 0xf7, 0xa0, 0x0f, 0xdd, 0x0d, 0xa3, 0xd0, 0x7c, 0x4c, 0xfc, 0x03, 0x8f, 0xa3, 0xca, 0x5c, 0xef, 0x69, 0x62, 0x8f, 0x43, 0x9b, 0x55, 0x3a, 0xd4, 0xe0, 0x0c, 0x48, 0x77, 0x02, 0x3b, 0x49, 0x64, 0x18, 0x34, 0x75, 0x70, 0x24, 0xdc, 0x58, 0xd0, 0xed, 0xe1, 0xbb, 0x97, 0x83, 0x2d, 0x58, 0xef, 0x6a, 0x9a, 0x4a, 0xc9, 0x91, 0x05, 0xfd, 0x6d, 0x4d, 0x55, 0x07, 0xc7, 0xc8, 0x0c, 0x6d, 0xee, 0x75, 0x98, 0x4d, 0xdd, 0x28, 0x6c, 0x18, 0x2d, 0x98, 0xdf, 0x43, 0x1b, 0x06, 0xd2, 0x4d, 0x53, 0x80, 0xc7, 0x97, 0x81, 0x8b, 0xad, 0x08, 0xb4, 0x5c, 0x28, 0x87, 0x27, 0x31, 0x21, 0xee, 0x97, 0x4b, 0x9c, 0xb6, 0x69, 0x20, 0x0d, 0xa7, 0x26, 0xdc, 0x86, 0x9e, 0x51, 0xe1, 0xf6, 0x5e, 0x04, 0xc7, 0x7c, 0x4e, 0x44, 0x10, 0xf0, 0x0c, 0x2e, 0xb3, 0xf1, 0x10, 0x8d, 0xa6, 0x3c, 0x07, 0x9a, 0x1a, 0x85, 0xbd, 0x05, 0x83, 0x63, 0x94, 0x31, 0x92, 0xf3, 0xc7, 0xc8, 0x9f, 0x0d, 0x7c, 0x9a, 0x48, 0x4b, 0x63, 0xd7, 0xe6, 0x64, 0x46, 0xc4, 0x00, 0xdc, 0xea, 0x43, 0xb1, 0x55, 0x79, 0xc6, 0xea, 0x7b, 0x0f, 0xf1, 0xaa, 0x3f, 0x02, 0x81, 0x29, 0xe3, 0x00, 0xdb, 0xf3, 0xf1, 0x41, 0xbb, 0x0c, 0xe1, 0x7f, 0xc6, 0x2c, 0xb7, 0x16, 0x41, 0x58, 0xeb, 0x43, 0xdb, 0xac, 0xdc, 0x6d, 0x81, 0x51, 0x51, 0x8d, 0xcb, 0x60, 0xe3, 0x7c, 0x55, 0x19, 0xcf, 0x6a, 0x59, 0x19, 0xe9, 0x9c, 0x32, 0xae, 0xd6, 0x7d, 0x26, 0xfc, 0x33, 0x97, 0x7b, 0x4b, 0x2e, 0xb7, 0x60, 0xa1, 0x7a, 0x2a, 0x47, 0xcf, 0x6a, 0x17, 0xe8, 0x45, 0x65, 0x7d, 0xf4, 0xd9, 0xce, 0x42, 0xf5, 0x1c, 0xda, 0x41, 0x4a, 0x8a, 0x33, 0x0c, 0x46, 0x0c, 0xeb, 0x3c, 0x29, 0xbf, 0x10, 0xcf, 0xef, 0xfb, 0xa1, 0xb4, 0x6a, 0xea, 0x01, 0xe1, 0x0f, 0x04, 0x78, 0x16, 0x79, 0xdc, 0x0f, 0x47, 0x3b, 0x7e, 0xe2, 0xbe, 0x2b, 0xf4, 0x56, 0x5f, 0xe4, 0x5c, 0xc6, 0xa4, 0x70, 0x78, 0x4b, 0x24, 0x5c, 0x55, 0x49, 0x90, 0x90, 0x5c, 0x5d, 0x2e, 0x5a, 0xd8, 0xe7, 0xa1, 0x65, 0x34, 0xe7, 0x16, 0x97, 0x6b, 0xa0, 0x96, 0x11, 0x9e, 0x32, 0x0a, 0x92, 0xae, 0x69, 0xa3, 0x58, 0xc0, 0xf1, 0x40, 0xab, 0x5a, 0xd9, 0xde, 0x7d, 0xf8, 0xe6, 0xb1, 0xc6, 0xed, 0x61, 0x40, 0x3a, 0x3e, 0x4d, 0x08, 0xe3, 0x8d, 0xc2, 0xd2, 0x92, 0x2d, 0xb5, 0x8a, 0x05, 0x44, 0x8e, 0xe3, 0x88, 0x71, 0xb8, 0x7f, 0xef, 0x83, 0x7e, 0x7b, 0x5b, 0x03, 0xc0, 0x1e, 0x0e, 0xb1, 0xf7, 0x1d, 0x2d, 0x3f, 0x0f, 0xf4, 0x71, 0x07, 0xe2, 0x5e, 0xa0, 0x9a, 0x0a, 0xd2, 0xd0, 0x30, 0x9a, 0x33, 0x5b, 0x6f, 0xad, 0xb7, 0xb1, 0xd6, 0xed, 0xac, 0xbf, 0xbb, 0xb9, 0x04, 0x32, 0x11, 0x24, 0x9a, 0x98, 0x63, 0xce, 0x45, 0x75, 0xa3, 0xdb, 0x7b, 0xe2, 0xf2, 0xc8, 0xa9, 0x43, 0x4e, 0x73, 0x2f, 0xea, 0x28, 0x62, 0xe0, 0x8b, 0xfa, 0x6f, 0xc1, 0xa6, 0x38, 0xe7, 0xf3, 0xf7, 0x9a, 0x47, 0xac, 0xa0, 0x9b, 0x97, 0xd3, 0x19, 0x09, 0xa3, 0x43, 0x32, 0xa3, 0x9b, 0x4d, 0xb9, 0xfe, 0x17, 0x79, 0xa7, 0x68, 0x92, 0xd5, 0x02, 0xec, 0xac, 0x50, 0x5c, 0xab, 0xb1, 0xed, 0xb3, 0xa4, 0xbc, 0x11, 0x45, 0x1a, 0x51, 0xff, 0x50, 0x76, 0xd5, 0xaa, 0x24, 0x7e, 0x88, 0x9d, 0xa9, 0xa9, 0x4e, 0x90, 0x34, 0xcc, 0xcd, 0xe6, 0x8b, 0xf1, 0x45, 0x33, 0x0b, 0x36, 0x23, 0x0e, 0x6f, 0xc8, 0x86, 0x9d, 0xeb, 0xa8, 0xd6, 0x62, 0x75, 0xa2, 0x19, 0xdd, 0x62, 0xaf, 0x53, 0xde, 0xb8, 0x79, 0x57, 0x3a, 0xb2, 0xe0, 0x26, 0x74, 0x3a, 0xf0, 0xd6, 0xec, 0x14, 0xb9, 0x13, 0x13, 0x7f, 0x46, 0x36, 0x86, 0x21, 0x57, 0xe4, 0x6f, 0x33, 0x2a, 0xe6, 0xbe, 0xa0, 0x61, 0x2d, 0x3c, 0x2c, 0x0b, 0x74, 0x75, 0xf1, 0x02, 0xbc, 0x0d, 0xdd, 0xcb, 0x3d, 0xfd, 0x0b, 0xc4, 0x87, 0xa2, 0xb8, \ No newline at end of file +0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xdc, 0x44, 0x14, 0x77, 0x0e, 0x54, 0xb2, 0xc5, 0x4a, 0xbb, 0x57, 0xc4, 0xe1, 0xa5, 0x15, 0x62, 0x37, 0xdd, 0xdd, 0xda, 0x9b, 0x64, 0x8b, 0x4c, 0x36, 0x5a, 0x5a, 0x84, 0x88, 0xd4, 0x4a, 0x88, 0x84, 0x86, 0x48, 0xcd, 0xc1, 0x6b, 0xcf, 0xc6, 0x16, 0xf6, 0xd8, 0x8c, 0xc7, 0x49, 0x56, 0xa8, 0x57, 0xbe, 0x00, 0xfd, 0x00, 0x9c, 0xe0, 0x0a, 0x27, 0xee, 0xdc, 0x90, 0x36, 0x52, 0x3e, 0x40, 0x1c, 0x95, 0x0f, 0xc0, 0x96, 0x43, 0x04, 0x47, 0x78, 0xe3, 0xb1, 0xbd, 0x7f, 0x4a, 0x9a, 0xde, 0x68, 0xa5, 0x3c, 0xf9, 0x79, 0x3d, 0xef, 0xbd, 0xdf, 0x7b, 0x33, 0xef, 0xcf, 0xec, 0xdb, 0xba, 0xa2, 0xbc, 0xf3, 0x6e, 0x73, 0xff, 0xfd, 0xfd, 0x9f, 0x37, 0xb7, 0x9f, 0x3f, 0xd9, 0xfd, 0xe7, 0x24, 0xf9, 0xf1, 0xcf, 0xe8, 0x83, 0x5f, 0x9c, 0xf7, 0xbe, 0x1e, 0x35, 0xba, 0xe1, 0x87, 0xfb, 0xbf, 0x7d, 0xf4, 0xc3, 0x5f, 0xf1, 0xf3, 0xbf, 0x2f, 0x2e, 0x2e, 0x9e, 0xfe, 0xf4, 0xeb, 0x23, 0xff, 0xdb, 0xd5, 0x8d, 0xdd, 0xa5, 0xef, 0x6f, 0x28, 0x57, 0x51, 0xad, 0x56, 0x43, 0x5e, 0x4a, 0x91, 0x4f, 0x16, 0x58, 0xc8, 0x52, 0xa5, 0x8a, 0xaf, 0x4a, 0xed, 0x74, 0xbc, 0xc0, 0x67, 0xa9, 0x92, 0x0a, 0x12, 0x1e, 0xd2, 0xb4, 0x5a, 0x1b, 0x9f, 0xcd, 0xf3, 0x09, 0xca, 0x84, 0xfc, 0x2a, 0x52, 0xae, 0xe9, 0x7f, 0xa5, 0xa2, 0xce, 0x05, 0x2f, 0x29, 0xa7, 0xe9, 0xef, 0x93, 0x73, 0xe4, 0x09, 0x7e, 0x3f, 0x3b, 0xaf, 0x60, 0x8d, 0x2b, 0x69, 0x4e, 0x15, 0x54, 0xa6, 0xe3, 0x54, 0xb2, 0xa4, 0x53, 0xac, 0xf1, 0x69, 0x5e, 0x6b, 0xc9, 0x15, 0xa5, 0x54, 0xe2, 0xf7, 0x62, 0xbd, 0x45, 0x47, 0x54, 0x72, 0xae, 0x5e, 0xd7, 0xff, 0x75, 0xa8, 0xff, 0xe4, 0x65, 0x9c, 0x9e, 0x8c, 0xc7, 0xe9, 0x78, 0x81, 0x85, 0xac, 0xa4, 0x6a, 0xed, 0x6c, 0x81, 0xd3, 0x19, 0xbe, 0x9e, 0xff, 0x37, 0xb9, 0xfe, 0x35, 0x25, 0xfd, 0x03, 0x2f, 0x82, 0xc9, 0x64, 0x52, 0x41, 0xdb, 0x6a, 0x3e, 0xb3, 0x05, 0x0b, 0x3a, 0xc7, 0x1a, 0x4f, 0x90, 0x9f, 0x9d, 0xe3, 0x1f, 0xc5, 0x64, 0x9e, 0x6b, 0xca, 0x95, 0xe5, 0xaf, 0xbd, 0xf5, 0xdd, 0x0d, 0xa5, 0xd5, 0x02, 0xee, 0x71, 0x9f, 0x98, 0x70, 0x2f, 0xa1, 0x74, 0x14, 0x58, 0xec, 0x2b, 0xf0, 0x28, 0x3c, 0x0c, 0x43, 0xba, 0x6d, 0x33, 0x2f, 0xe2, 0x1a, 0x5a, 0x58, 0x09, 0x77, 0x43, 0x66, 0xc2, 0xe7, 0xe1, 0x00, 0x1e, 0x84, 0x96, 0xed, 0x0a, 0xa1, 0x43, 0x62, 0x1b, 0x51, 0x84, 0xda, 0xae, 0x40, 0x79, 0xf4, 0x00, 0x78, 0x18, 0xfa, 0xf8, 0x82, 0x98, 0x10, 0x70, 0xc3, 0x23, 0x08, 0x2c, 0x3a, 0x82, 0x01, 0xfa, 0xf5, 0x48, 0x0c, 0xb6, 0x45, 0x61, 0xe8, 0x8f, 0xc0, 0x62, 0x61, 0x42, 0x1d, 0xe0, 0x2e, 0x81, 0xd8, 0x66, 0x84, 0xd0, 0x26, 0x24, 0xb1, 0x40, 0x4f, 0x63, 0xb6, 0x85, 0x7f, 0xdf, 0xb3, 0x09, 0x8d, 0x71, 0x63, 0x0f, 0xb7, 0x76, 0xe0, 0x81, 0x5c, 0x80, 0x50, 0x78, 0x34, 0x4a, 0xb8, 0x09, 0x07, 0x56, 0x40, 0x22, 0xcb, 0x11, 0x92, 0x38, 0x43, 0x99, 0x10, 0xa0, 0x07, 0xb1, 0x3e, 0x24, 0x2c, 0xf6, 0x42, 0x6a, 0x82, 0xd1, 0x36, 0xda, 0xba, 0xa6, 0xc9, 0x38, 0xbb, 0x9e, 0xc3, 0x5d, 0xe8, 0x41, 0x67, 0x4d, 0xcf, 0x25, 0x9f, 0x12, 0xef, 0xc0, 0xe5, 0x28, 0x32, 0x56, 0xbb, 0x9a, 0xd8, 0xfc, 0xc0, 0x62, 0xa5, 0x0c, 0x25, 0xf8, 0x06, 0x84, 0xdb, 0xbe, 0x15, 0xc7, 0x32, 0x3f, 0x9a, 0xda, 0x3f, 0x12, 0x6e, 0x4c, 0xe8, 0x74, 0xf1, 0xdb, 0xcd, 0x8c, 0x4d, 0x58, 0xed, 0x68, 0x9a, 0x4a, 0xc9, 0x91, 0x09, 0xbd, 0x4d, 0x4d, 0x55, 0xfb, 0xc7, 0x88, 0x0c, 0x2c, 0xee, 0xb6, 0x99, 0x45, 0x9d, 0x30, 0xa8, 0xeb, 0x4d, 0x98, 0xdd, 0x43, 0x0b, 0xfa, 0xd2, 0x4d, 0x43, 0x18, 0x8f, 0x2e, 0x33, 0xce, 0xb7, 0x22, 0xac, 0x65, 0xa0, 0xcc, 0x3c, 0x8e, 0x08, 0x71, 0xbe, 0x5c, 0xc0, 0xb4, 0x0c, 0x1d, 0x61, 0xf8, 0x6a, 0xc0, 0x1d, 0xe8, 0xea, 0xa5, 0xdd, 0xde, 0xab, 0xd8, 0x31, 0x8f, 0x13, 0x91, 0x04, 0x3c, 0x83, 0xc3, 0x2c, 0x3c, 0x44, 0xbd, 0x21, 0xcf, 0x81, 0xaa, 0x7a, 0xae, 0x6f, 0x42, 0xff, 0x18, 0x79, 0x84, 0xe0, 0xec, 0xd1, 0xb3, 0x67, 0x0d, 0x9f, 0x06, 0xc2, 0x92, 0xc8, 0xb1, 0x38, 0x99, 0x02, 0x31, 0x01, 0xb7, 0x7b, 0x90, 0x6f, 0x55, 0x9e, 0xb1, 0x5c, 0xef, 0xa1, 0xbd, 0xea, 0x0d, 0x41, 0xd8, 0x14, 0x79, 0x80, 0xcd, 0xd9, 0xfc, 0xa0, 0x5e, 0xa6, 0xf0, 0x3f, 0x73, 0x96, 0x69, 0xf3, 0x24, 0xac, 0xf4, 0xa0, 0x65, 0x94, 0xee, 0x36, 0x40, 0x2f, 0xa1, 0xfa, 0x65, 0x66, 0xa3, 0x2c, 0xaa, 0xcc, 0x67, 0x19, 0x56, 0x66, 0x3a, 0x83, 0x8c, 0xca, 0xb8, 0x2f, 0xa4, 0x7f, 0xea, 0x72, 0x6f, 0xc1, 0xe5, 0x06, 0xcc, 0x75, 0x4f, 0xe9, 0xe8, 0x45, 0xe9, 0x1c, 0x3c, 0xef, 0xac, 0x4f, 0x3e, 0xdb, 0x9e, 0xeb, 0x9e, 0x43, 0xcb, 0x4f, 0x48, 0x7e, 0x86, 0xfe, 0x90, 0x61, 0x9f, 0xc7, 0xc5, 0x0a, 0xed, 0xf9, 0x8e, 0x17, 0x48, 0xad, 0xa6, 0x1e, 0x10, 0xfe, 0x48, 0x18, 0x4f, 0x33, 0x8f, 0xfb, 0xe1, 0xa8, 0xc7, 0x25, 0xee, 0xbb, 0xb4, 0xde, 0xe8, 0x89, 0x9a, 0xcb, 0x9c, 0xe4, 0x0e, 0x6f, 0x8b, 0x82, 0xab, 0x2a, 0xf1, 0x63, 0x92, 0x89, 0x8b, 0xa0, 0xb9, 0x7e, 0xd6, 0xb4, 0xc8, 0xe6, 0x4c, 0x70, 0x19, 0x03, 0xa5, 0x8c, 0xf0, 0x84, 0x51, 0x90, 0x70, 0x4d, 0x1b, 0x46, 0xc2, 0x1c, 0x0f, 0xb4, 0xac, 0x15, 0x73, 0xdf, 0x83, 0x6f, 0x9e, 0x68, 0xdc, 0x1a, 0xf8, 0xa4, 0xed, 0xe1, 0x08, 0x33, 0x5e, 0xcf, 0x35, 0x4d, 0x39, 0x52, 0xcb, 0xd8, 0x40, 0xe4, 0x38, 0x0a, 0x19, 0x87, 0x9d, 0xad, 0xfb, 0xbd, 0xd6, 0xa6, 0x06, 0x80, 0x33, 0x1c, 0xe0, 0xa5, 0x60, 0x6b, 0xd9, 0x79, 0xa0, 0x87, 0x3b, 0x10, 0x17, 0x06, 0xd5, 0x54, 0x90, 0x8a, 0xba, 0xde, 0x98, 0xea, 0xba, 0x2b, 0xdd, 0xb5, 0x95, 0x4e, 0x7b, 0xf5, 0xee, 0xfa, 0x82, 0x91, 0x81, 0x46, 0x62, 0x88, 0x39, 0xd6, 0x5c, 0x74, 0x37, 0xba, 0xdd, 0x12, 0x97, 0x47, 0x06, 0x1d, 0x70, 0x9a, 0x79, 0x51, 0x87, 0x21, 0x03, 0x4f, 0xf4, 0x7f, 0x13, 0xd6, 0xc5, 0x39, 0x5f, 0xbe, 0xd7, 0x2c, 0x63, 0x39, 0xdc, 0xb8, 0x1c, 0xce, 0x48, 0x10, 0x1e, 0x92, 0x29, 0xdc, 0x68, 0xc8, 0xf8, 0x5f, 0x64, 0x93, 0xa2, 0x49, 0x54, 0x13, 0x70, 0xb2, 0x02, 0x71, 0xdf, 0x46, 0x96, 0xc7, 0xe2, 0xe2, 0xaa, 0x14, 0x65, 0x44, 0xf9, 0x63, 0x39, 0x55, 0xcb, 0x12, 0xf8, 0x31, 0x4e, 0xa6, 0xa6, 0xda, 0x7e, 0x5c, 0x37, 0xd6, 0x1b, 0xaf, 0x86, 0x17, 0xc3, 0x2c, 0xd0, 0x8c, 0xd8, 0xbc, 0x2e, 0x07, 0x76, 0x66, 0xa2, 0x9a, 0xf3, 0xdd, 0x89, 0x6a, 0x74, 0x8b, 0xb3, 0x4e, 0x79, 0xfd, 0xe6, 0x3d, 0xe9, 0xc8, 0x84, 0x9b, 0xd0, 0x6e, 0xc3, 0xad, 0xe9, 0x29, 0x32, 0x27, 0x06, 0xfe, 0x0c, 0x2d, 0x4c, 0x43, 0x26, 0xc8, 0xbe, 0xa6, 0x50, 0xac, 0x7d, 0x0e, 0xc3, 0x5e, 0x78, 0x5c, 0x34, 0xe8, 0xf2, 0xfc, 0x05, 0x78, 0x07, 0x3a, 0x97, 0x7b, 0xfa, 0x17, 0xd4, 0x6a, 0xaa, 0x7f, \ No newline at end of file diff --git a/build/assets/rubydemo.tic.dat b/build/assets/rubydemo.tic.dat index 0d6743aa6..b0492630e 100644 --- a/build/assets/rubydemo.tic.dat +++ b/build/assets/rubydemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0xcb, 0x4a, 0xc3, 0x40, 0x14, 0x9d, 0xfa, 0x58, 0x64, 0x36, 0xe2, 0x1f, 0x8c, 0x6d, 0x84, 0xd6, 0x46, 0xcc, 0xa3, 0x14, 0x2d, 0xc4, 0x8d, 0x0a, 0x0a, 0x85, 0x82, 0x08, 0xae, 0xdb, 0x66, 0xaa, 0x81, 0x9a, 0x86, 0x64, 0x94, 0x06, 0xfc, 0x80, 0x2c, 0xfc, 0x08, 0x97, 0x12, 0xf2, 0x11, 0xb3, 0x96, 0x4b, 0xbf, 0xa4, 0xcc, 0x37, 0x78, 0x93, 0xfa, 0xe8, 0x42, 0x74, 0xd1, 0x85, 0x1b, 0xcf, 0x9d, 0xcb, 0xcc, 0x99, 0x33, 0xe7, 0x32, 0x70, 0xb6, 0x09, 0x21, 0x95, 0xe7, 0x35, 0xf2, 0x1b, 0x66, 0x80, 0x48, 0xd3, 0x34, 0xcf, 0xb2, 0x2c, 0x2f, 0x76, 0xa4, 0x39, 0xc8, 0xcf, 0x06, 0x98, 0xab, 0x34, 0x05, 0x95, 0x65, 0x52, 0xa5, 0x2f, 0x52, 0x41, 0x2e, 0x41, 0xe6, 0x52, 0x7e, 0xf4, 0xf7, 0x7e, 0xf8, 0xd1, 0x0f, 0x4b, 0x7e, 0xf2, 0x8f, 0x3f, 0x45, 0x99, 0x55, 0x91, 0x5d, 0x59, 0xaf, 0xe5, 0xf9, 0x09, 0x73, 0x04, 0x22, 0x01, 0xb3, 0x9d, 0x41, 0x4e, 0x00, 0xb3, 0x9b, 0xe7, 0x98, 0x5f, 0xf6, 0xde, 0x45, 0x9e, 0x44, 0xce, 0x15, 0x80, 0x52, 0xab, 0xfa, 0xb5, 0xe3, 0xd5, 0xfe, 0xbf, 0xbe, 0xb1, 0xb9, 0x55, 0x21, 0x35, 0x26, 0x7c, 0x31, 0xe6, 0x1d, 0xc6, 0x6e, 0xfa, 0x77, 0x7c, 0x41, 0x68, 0x8d, 0xf5, 0xef, 0xc5, 0xed, 0x24, 0xea, 0x2c, 0x2e, 0x3d, 0xfe, 0xc0, 0xc7, 0x93, 0x90, 0x47, 0x28, 0x78, 0x3c, 0x1e, 0xe2, 0x63, 0x16, 0xa3, 0x2c, 0x4a, 0x16, 0xf9, 0xa1, 0xf0, 0x27, 0x01, 0x6a, 0x8b, 0x73, 0x87, 0x45, 0xf7, 0x83, 0x84, 0x52, 0x5d, 0xb8, 0x26, 0xd5, 0xa7, 0xee, 0x51, 0x9b, 0xea, 0x89, 0x6b, 0xb7, 0x28, 0xf5, 0xf8, 0x88, 0x5d, 0x5d, 0x9c, 0x50, 0x4d, 0x4f, 0xf6, 0x5d, 0x8b, 0xf9, 0x23, 0x36, 0x10, 0x01, 0x33, 0x0b, 0xde, 0xfc, 0xe2, 0x16, 0xf2, 0xe9, 0x92, 0x6e, 0x17, 0x7c, 0x49, 0x77, 0x28, 0xd5, 0x86, 0xe3, 0x98, 0x59, 0x0e, 0xd5, 0xe2, 0x30, 0x62, 0x56, 0xb3, 0x5e, 0xd7, 0xc5, 0x6e, 0xdb, 0x6c, 0x1c, 0x38, 0xe6, 0xa3, 0xd9, 0xd8, 0xb3, 0x0d, 0x7d, 0x6a, 0xe8, 0x89, 0x61, 0xb5, 0x0c, 0xc7, 0x30, 0xb1, 0x6c, 0x03, 0x67, 0x84, 0x91, 0x1f, 0x08, 0x56, 0x3d, 0x3f, 0xeb, 0x76, 0x7b, 0xec, 0xba, 0x77, 0xd9, 0x3d, 0xdd, 0xa9, 0x1a, 0x87, 0x2d, 0x5c, 0x38, 0x5f, 0xe0, 0x7c, 0xca, 0x03, 0x8f, 0xbe, 0x01, 0x5a, 0xf8, 0x00, 0x3f, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xcd, 0x4a, 0xc3, 0x40, 0x10, 0x5e, 0xff, 0x0e, 0xdd, 0x9b, 0x6f, 0x30, 0xda, 0x08, 0xad, 0x46, 0x4d, 0xda, 0x52, 0xb4, 0x50, 0x2f, 0x2a, 0x28, 0x54, 0x0a, 0x22, 0x78, 0x6e, 0xd3, 0x6d, 0xbb, 0x98, 0x26, 0x25, 0xd9, 0xd6, 0x06, 0x3c, 0x4b, 0x0e, 0x3e, 0x84, 0x47, 0x09, 0x79, 0x88, 0x3d, 0xcb, 0xd2, 0x27, 0x29, 0x79, 0x06, 0x27, 0x69, 0xd5, 0x1e, 0x44, 0x0f, 0x1e, 0xbc, 0x38, 0xb3, 0xc3, 0xce, 0xb7, 0x33, 0xdf, 0xcc, 0xc2, 0xb7, 0x49, 0x08, 0x59, 0x79, 0x5e, 0x25, 0x3f, 0xd9, 0x54, 0xa1, 0x85, 0x61, 0x18, 0x47, 0x51, 0x14, 0xa7, 0x37, 0xc2, 0x58, 0xc9, 0x8f, 0x50, 0x6a, 0x96, 0x84, 0xa1, 0x4a, 0xa2, 0x48, 0x26, 0xe1, 0x8b, 0x4c, 0x54, 0x2c, 0x95, 0x8c, 0xa5, 0x7c, 0x8f, 0xaf, 0xf9, 0xea, 0x5b, 0xbe, 0x5a, 0xe2, 0x93, 0x7f, 0xfb, 0x53, 0xcb, 0xb4, 0x4a, 0xb5, 0xcb, 0xfc, 0x35, 0xcb, 0x9f, 0x50, 0x47, 0x45, 0xa4, 0x42, 0x6d, 0xa7, 0x2a, 0x26, 0x0a, 0xb5, 0x9b, 0xc5, 0xa8, 0x5f, 0xb4, 0x88, 0x54, 0x4f, 0x22, 0x67, 0x89, 0x52, 0x49, 0xf2, 0x5b, 0x7e, 0xee, 0xe4, 0x77, 0xff, 0x5f, 0x5b, 0xdf, 0x78, 0x5c, 0x21, 0x79, 0x10, 0x5c, 0xd8, 0xac, 0x06, 0x00, 0xbd, 0xd6, 0x80, 0xcd, 0x11, 0xcd, 0x43, 0x6b, 0x24, 0xfa, 0xae, 0x57, 0x5b, 0xbc, 0x76, 0xd8, 0x98, 0xd9, 0xee, 0x90, 0x79, 0x3a, 0xb0, 0x41, 0x8b, 0xdb, 0x78, 0x09, 0xeb, 0x00, 0xdb, 0x3a, 0xcc, 0xb7, 0x52, 0x2e, 0xf8, 0xd8, 0x2d, 0x32, 0xe8, 0xf1, 0xa1, 0xe0, 0xae, 0x83, 0x45, 0x9f, 0x8b, 0x6c, 0x30, 0xdc, 0xb3, 0x76, 0x9a, 0x83, 0xcd, 0x9d, 0x3b, 0x7c, 0xb7, 0xb9, 0xc5, 0x1c, 0x1f, 0x4b, 0x57, 0x97, 0x37, 0xd0, 0x98, 0x03, 0x28, 0x58, 0xfd, 0x96, 0xd3, 0xc3, 0x0f, 0xf4, 0xb9, 0x0f, 0xc2, 0x85, 0xc0, 0x1d, 0x79, 0xef, 0x9d, 0xe0, 0x76, 0xc1, 0xea, 0xbb, 0x08, 0x8a, 0x48, 0x1f, 0x33, 0xcf, 0xc7, 0x05, 0x35, 0x30, 0x0e, 0xcc, 0x74, 0x4b, 0xb6, 0x11, 0xf7, 0x78, 0xa3, 0x76, 0x40, 0xa9, 0x26, 0xea, 0x06, 0xd5, 0x26, 0xf5, 0xe3, 0x2a, 0xd5, 0x82, 0x7a, 0xa9, 0x42, 0x69, 0x87, 0x75, 0xe1, 0xe6, 0xf2, 0x94, 0xe6, 0xb4, 0x60, 0xbf, 0x6e, 0x02, 0xef, 0x42, 0x5b, 0x38, 0x60, 0xa4, 0x78, 0xef, 0x13, 0x9b, 0x88, 0x27, 0x4b, 0xf5, 0x52, 0x8a, 0x97, 0xea, 0x65, 0x4a, 0x73, 0x96, 0xed, 0x83, 0x59, 0xa6, 0x39, 0x7f, 0xe8, 0x81, 0xb9, 0x57, 0x28, 0x68, 0x62, 0xa7, 0x6a, 0x14, 0x0f, 0xcb, 0xc6, 0x83, 0x51, 0xdc, 0x2d, 0xe9, 0xda, 0x44, 0xd7, 0x02, 0xdd, 0xac, 0xe8, 0x65, 0xdd, 0x40, 0x2f, 0xe9, 0x38, 0x63, 0xe8, 0x71, 0x47, 0xc0, 0xf6, 0xc5, 0x79, 0xa3, 0xd1, 0x84, 0xdb, 0xe6, 0x75, 0xe3, 0x6c, 0x6b, 0x5b, 0x3f, 0xaa, 0xe0, 0xc1, 0xf9, 0x02, 0xe7, 0x53, 0xe6, 0x74, 0xe8, 0x1b, 0xd0, 0xe0, 0x26, 0x74, \ No newline at end of file diff --git a/build/assets/rubymark.tic.dat b/build/assets/rubymark.tic.dat index c493983ab..f2b9f609f 100644 --- a/build/assets/rubymark.tic.dat +++ b/build/assets/rubymark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xdc, 0x44, 0x14, 0x77, 0x0e, 0x54, 0xb2, 0xc5, 0x4a, 0xeb, 0x2b, 0xe2, 0xf0, 0xd4, 0x84, 0x92, 0xa4, 0x1b, 0x77, 0x77, 0x93, 0x2c, 0x68, 0xbb, 0x5b, 0x42, 0x41, 0x15, 0x45, 0x80, 0x50, 0x53, 0xc8, 0x01, 0x45, 0xd5, 0xac, 0x3d, 0xbb, 0x3b, 0xaa, 0xd7, 0x36, 0xf6, 0xb8, 0x5b, 0xa7, 0xca, 0x95, 0x0b, 0x57, 0x3e, 0x00, 0x27, 0xb8, 0xc2, 0x89, 0x3b, 0x37, 0xa4, 0x8d, 0x94, 0x0f, 0x10, 0x47, 0xe5, 0x03, 0xb0, 0xe5, 0x10, 0xc1, 0x11, 0xde, 0xcc, 0xd8, 0x8e, 0x77, 0x93, 0x34, 0xdc, 0x00, 0x29, 0x23, 0x3f, 0xff, 0x79, 0xef, 0xf7, 0x7e, 0xf3, 0xde, 0xbc, 0x79, 0xe3, 0x57, 0xeb, 0x9a, 0xf6, 0xda, 0xeb, 0xb5, 0xdd, 0x37, 0x77, 0x7f, 0xbc, 0xb3, 0xfd, 0x62, 0x7f, 0xe7, 0xaf, 0x83, 0xf8, 0xfb, 0xdf, 0x83, 0xb7, 0x7f, 0x72, 0xde, 0xf8, 0x32, 0x59, 0x69, 0xf9, 0xb7, 0x77, 0x7f, 0x79, 0xf7, 0xbb, 0x3f, 0xa2, 0x17, 0x7f, 0x9e, 0x9c, 0x9c, 0x7c, 0xf3, 0xc3, 0xcf, 0x9f, 0xbb, 0x5f, 0xad, 0x77, 0x76, 0x16, 0xbe, 0xbd, 0xa6, 0x5d, 0x36, 0x4c, 0xd3, 0x44, 0x59, 0x48, 0x51, 0x0e, 0xe6, 0x44, 0xe8, 0x52, 0xad, 0x8a, 0xb7, 0x8a, 0x79, 0x38, 0x99, 0x93, 0xa3, 0x54, 0x4b, 0xc5, 0x10, 0x0c, 0x69, 0x5a, 0x35, 0x27, 0x47, 0xb3, 0x72, 0x80, 0x3a, 0xa1, 0xbf, 0x6c, 0x68, 0x57, 0xe3, 0x5f, 0x1d, 0x79, 0x9d, 0x73, 0x59, 0xd0, 0x0e, 0xd3, 0x5f, 0xa7, 0xc7, 0x28, 0x53, 0x7c, 0x7f, 0x7e, 0x5c, 0xc1, 0x1a, 0x57, 0xd2, 0x6c, 0x54, 0xd0, 0x98, 0x4e, 0x52, 0x25, 0x6a, 0x1c, 0x62, 0x8d, 0x0f, 0xb3, 0x5a, 0x2b, 0xa9, 0x68, 0x85, 0x11, 0xdf, 0xe7, 0xeb, 0x2d, 0x76, 0x44, 0x25, 0x93, 0xea, 0x55, 0xfd, 0xff, 0x0b, 0xf5, 0x9f, 0xbe, 0x4c, 0xd2, 0x83, 0xc9, 0x24, 0x9d, 0xcc, 0x89, 0xd0, 0x15, 0xa3, 0x6a, 0x1e, 0xcd, 0x49, 0x5a, 0x92, 0xab, 0xfe, 0xff, 0x3f, 0xd7, 0xdf, 0xd4, 0xd2, 0xdf, 0xf0, 0x20, 0x98, 0x4e, 0xa7, 0x15, 0xc4, 0x56, 0xb3, 0x9e, 0xcd, 0x45, 0x8c, 0x63, 0xac, 0xf1, 0x14, 0xe5, 0xf9, 0x31, 0xfe, 0x28, 0xa6, 0xb3, 0x62, 0x6a, 0x97, 0x96, 0xdf, 0x7c, 0xe5, 0xeb, 0x6b, 0xda, 0x22, 0x70, 0xc6, 0x5d, 0xda, 0x86, 0xbb, 0xb1, 0xe7, 0x25, 0x23, 0x12, 0x3e, 0x06, 0xe6, 0xc1, 0x83, 0xb8, 0x97, 0x18, 0x8b, 0x40, 0x62, 0x3e, 0xf4, 0xc3, 0x36, 0x7c, 0x48, 0x43, 0x3a, 0x62, 0x24, 0xda, 0x83, 0x4f, 0xa8, 0xbb, 0x77, 0x1b, 0x7a, 0x24, 0xa2, 0x0e, 0xf8, 0x1e, 0xf0, 0x21, 0x05, 0x3f, 0x64, 0x03, 0xe6, 0x11, 0x17, 0xc6, 0x3e, 0x3a, 0xfb, 0x7d, 0x78, 0xe0, 0xf7, 0xe0, 0x23, 0x9f, 0xd8, 0x43, 0x64, 0x70, 0x68, 0x64, 0x23, 0x37, 0xf5, 0xec, 0xa1, 0xe0, 0x66, 0xde, 0x00, 0xb8, 0xef, 0xbb, 0x78, 0x83, 0x88, 0x52, 0x18, 0xfa, 0x63, 0x18, 0x11, 0x2f, 0x81, 0x1e, 0xce, 0xce, 0x68, 0x04, 0x36, 0xf1, 0xa0, 0xef, 0x26, 0x40, 0x42, 0x3f, 0xf6, 0x1c, 0xc9, 0x1f, 0xd9, 0x21, 0xa5, 0x5e, 0x0d, 0xe2, 0x48, 0x78, 0x8b, 0xc8, 0x2c, 0x24, 0x66, 0x5e, 0x10, 0xf3, 0x36, 0x0c, 0xc8, 0x88, 0x06, 0xc4, 0x41, 0x05, 0xc2, 0x58, 0x80, 0x9a, 0x50, 0x85, 0xfe, 0x84, 0x86, 0x11, 0xf3, 0xbd, 0x36, 0xd4, 0xad, 0x86, 0x55, 0x37, 0x8c, 0x6d, 0xc9, 0xb2, 0xc3, 0x1c, 0x3e, 0x84, 0x2e, 0x34, 0x37, 0xea, 0xa8, 0x54, 0xba, 0x0f, 0x28, 0x1b, 0x0c, 0x39, 0x2a, 0x1b, 0xeb, 0x2d, 0x54, 0x3e, 0xc4, 0xf0, 0x7a, 0x24, 0x2c, 0xb4, 0x2d, 0x63, 0x49, 0x3c, 0x90, 0xc2, 0x76, 0x49, 0x14, 0xa9, 0x75, 0x32, 0xf4, 0xad, 0xad, 0x71, 0xce, 0x25, 0xbc, 0xf0, 0x7b, 0x98, 0x7b, 0xac, 0x37, 0xc5, 0x84, 0xba, 0x43, 0xfb, 0x18, 0x25, 0xe3, 0x8c, 0xb8, 0x6c, 0x8f, 0x1a, 0xba, 0xbe, 0xf5, 0x14, 0x8d, 0xf7, 0x5c, 0x9f, 0xf0, 0xe5, 0x90, 0x78, 0xce, 0x72, 0x39, 0xa4, 0x35, 0xc8, 0x08, 0x57, 0x56, 0x04, 0x32, 0x39, 0x0f, 0x99, 0x85, 0x24, 0xa0, 0x6a, 0x2e, 0x85, 0x8d, 0x02, 0x4a, 0x9d, 0x47, 0x73, 0xdc, 0xcd, 0x7a, 0x7d, 0x05, 0x91, 0x0d, 0xf1, 0xb8, 0x05, 0x2d, 0x91, 0x6d, 0x01, 0x4d, 0xfe, 0x19, 0x34, 0x64, 0x9c, 0x8a, 0x55, 0x31, 0x74, 0xea, 0x39, 0x59, 0x3e, 0x4e, 0x48, 0xc6, 0x68, 0x45, 0x23, 0x64, 0x88, 0x1a, 0x6c, 0x3d, 0x45, 0x49, 0x6a, 0xd0, 0x90, 0x57, 0x5d, 0x5e, 0x1b, 0x78, 0x95, 0xfd, 0xe2, 0xc0, 0x21, 0x3c, 0x5b, 0x83, 0x9b, 0x5d, 0xc8, 0x63, 0x56, 0xa9, 0x9e, 0x2a, 0x12, 0x84, 0xeb, 0xac, 0x0f, 0x02, 0x95, 0x2f, 0x08, 0xdc, 0x81, 0xd2, 0x42, 0xa1, 0x5d, 0xad, 0xe3, 0xb9, 0x8b, 0x27, 0xad, 0xf9, 0x7a, 0xac, 0x76, 0x61, 0xad, 0x21, 0x93, 0x11, 0x71, 0xe4, 0xbc, 0x1d, 0x50, 0x09, 0x2a, 0x96, 0xfc, 0xfd, 0x65, 0x3e, 0x89, 0x8c, 0x25, 0xab, 0x6e, 0x1e, 0x8c, 0xaa, 0x85, 0xf4, 0x4d, 0x8a, 0x68, 0xce, 0x14, 0xa8, 0xc4, 0x9d, 0x5c, 0xc0, 0xdd, 0x81, 0x99, 0x0d, 0x57, 0x30, 0x9e, 0xd5, 0x5e, 0xc0, 0x23, 0x6e, 0x72, 0xa1, 0xd5, 0xf6, 0xbc, 0xf7, 0xe9, 0xf6, 0x79, 0x5b, 0xef, 0x09, 0x71, 0x63, 0x2a, 0xb7, 0x31, 0x7e, 0xf4, 0x43, 0xec, 0x9a, 0x28, 0xff, 0x42, 0x37, 0xfe, 0x88, 0xb3, 0x91, 0x30, 0xaf, 0xe1, 0x2e, 0xa8, 0x97, 0x0b, 0x37, 0xa0, 0x62, 0x72, 0x07, 0x4d, 0x12, 0x81, 0xa9, 0x15, 0x70, 0x95, 0x82, 0x03, 0x9d, 0x2e, 0x28, 0xaf, 0x53, 0xe6, 0x9b, 0x72, 0xdb, 0xe8, 0xd4, 0x8d, 0xa8, 0x54, 0xe7, 0xb3, 0x67, 0xf6, 0x32, 0x54, 0x05, 0x31, 0x1b, 0x45, 0xc6, 0xae, 0xa2, 0xc8, 0xbc, 0x4b, 0x89, 0x2e, 0xf5, 0x03, 0xe1, 0x87, 0x99, 0x5a, 0x1e, 0x1d, 0x1b, 0x4b, 0xf9, 0xd9, 0xd1, 0x85, 0x2f, 0x76, 0x4f, 0xbf, 0x3a, 0x1d, 0xd5, 0xaa, 0x12, 0x63, 0x88, 0x5c, 0x1e, 0xde, 0x7f, 0xcf, 0xd0, 0x17, 0xe1, 0x63, 0x3c, 0x48, 0x6c, 0x43, 0x1f, 0x89, 0xc7, 0x32, 0xee, 0x79, 0x4c, 0x62, 0x89, 0x5b, 0x7b, 0x34, 0xf4, 0xdf, 0x31, 0xf4, 0x5c, 0xdf, 0xc8, 0xf4, 0xd0, 0xc5, 0x13, 0x60, 0xb5, 0xb5, 0xb1, 0xda, 0xb4, 0xd6, 0xdf, 0xda, 0x34, 0x74, 0xd4, 0xc8, 0xe4, 0x04, 0xd1, 0x7d, 0x71, 0x04, 0x19, 0xfa, 0xa6, 0x25, 0xe2, 0x8d, 0xe0, 0x19, 0x9c, 0x3b, 0x37, 0xec, 0x0b, 0xa6, 0x1e, 0xf7, 0x44, 0xa2, 0x67, 0xb1, 0x56, 0xe0, 0x07, 0xa7, 0x10, 0x45, 0xfc, 0x59, 0xd6, 0x2d, 0x05, 0x86, 0xe2, 0x61, 0x0a, 0x37, 0xda, 0x59, 0x17, 0x09, 0xc8, 0xfb, 0xb2, 0x11, 0x6d, 0x37, 0x82, 0xc6, 0xe6, 0x59, 0xa0, 0x6c, 0x53, 0x43, 0x0f, 0xa9, 0xcd, 0xb3, 0x86, 0x2c, 0xb5, 0x4b, 0x6d, 0x76, 0x6f, 0xd5, 0x44, 0x5c, 0xd8, 0xca, 0x1e, 0x87, 0xeb, 0x77, 0x15, 0x4d, 0x1b, 0x16, 0x9f, 0x15, 0x94, 0x36, 0x1e, 0xc4, 0x7c, 0xff, 0x7a, 0xde, 0xdc, 0x0d, 0x7c, 0xf4, 0x09, 0x16, 0x56, 0x2a, 0xe4, 0x5b, 0xe1, 0x8e, 0x15, 0x91, 0xae, 0x58, 0x1f, 0x0b, 0x37, 0x8e, 0x70, 0x2a, 0xb7, 0xe9, 0x2d, 0x68, 0x5e, 0x48, 0x21, 0x0a, 0xfb, 0x37, 0x80, 0x19, 0xaa, 0x35, \ No newline at end of file +0x78, 0xda, 0xed, 0x55, 0x41, 0x6f, 0x1b, 0x45, 0x14, 0xde, 0x1c, 0xa8, 0xb4, 0x2b, 0x2c, 0xd9, 0x57, 0xc4, 0xe1, 0xa9, 0x09, 0x90, 0xa4, 0xce, 0xd6, 0x76, 0x12, 0x17, 0xb9, 0x76, 0x9b, 0x16, 0x54, 0x11, 0xd4, 0x22, 0xd4, 0x04, 0x72, 0x40, 0x51, 0x35, 0xde, 0x1d, 0xdb, 0x23, 0xd6, 0xb3, 0x66, 0x77, 0x5c, 0x77, 0x53, 0xe5, 0xca, 0x2f, 0xe0, 0x07, 0x20, 0x21, 0xc1, 0x15, 0x4e, 0xdc, 0xb9, 0x21, 0x39, 0x52, 0x7e, 0x40, 0x36, 0x2a, 0x3f, 0x00, 0x97, 0x43, 0x04, 0x47, 0x78, 0x33, 0xb3, 0xbb, 0x59, 0x3b, 0x49, 0xc3, 0x0d, 0x2a, 0x65, 0xe4, 0xb7, 0xbb, 0xf3, 0xde, 0xf7, 0xbe, 0x79, 0x6f, 0xde, 0xbc, 0xf1, 0x9b, 0x15, 0xc3, 0x78, 0xeb, 0xed, 0xf2, 0xee, 0x7b, 0xbb, 0x3f, 0xdd, 0xd9, 0x7a, 0xb9, 0xbf, 0xf3, 0xf7, 0xc1, 0xf0, 0x87, 0x3f, 0x06, 0xef, 0xff, 0xec, 0xbe, 0xf3, 0x55, 0xb4, 0x54, 0xf7, 0x6f, 0xef, 0xfe, 0x7a, 0xef, 0xfb, 0x3f, 0xc3, 0x97, 0x7f, 0x9d, 0x9c, 0x9c, 0x7c, 0xf3, 0xe3, 0x2f, 0x9f, 0x7b, 0x5f, 0xaf, 0x36, 0x77, 0xe6, 0xbe, 0xbd, 0x66, 0x5c, 0x36, 0x4a, 0xa5, 0x12, 0xca, 0x5c, 0x8c, 0x72, 0x30, 0x23, 0x52, 0x17, 0x1b, 0x45, 0x7c, 0x14, 0x4a, 0x87, 0xe3, 0x19, 0x39, 0x8a, 0x8d, 0x58, 0x0e, 0xc9, 0x10, 0xc7, 0xc5, 0xd2, 0xf8, 0x68, 0x5a, 0x0e, 0x50, 0x27, 0xf5, 0x97, 0x0d, 0xe3, 0x6a, 0xfc, 0xa7, 0x23, 0xad, 0x73, 0x2a, 0x73, 0xc6, 0x61, 0xfc, 0xdb, 0xe4, 0x18, 0x65, 0x82, 0xdf, 0x2f, 0x8e, 0x0b, 0x58, 0xe3, 0x42, 0x9c, 0x8c, 0x02, 0x1a, 0xe3, 0x71, 0xac, 0x45, 0x8f, 0x43, 0xac, 0xf1, 0x61, 0x52, 0x6b, 0x2d, 0x05, 0x23, 0x33, 0xe2, 0xf7, 0x6c, 0xbd, 0xe5, 0x89, 0x28, 0x24, 0x52, 0xbc, 0xaa, 0xff, 0xff, 0xa1, 0xfe, 0x93, 0x57, 0x49, 0x7c, 0x30, 0x1e, 0xc7, 0xe3, 0x19, 0x91, 0xba, 0x6c, 0x14, 0x4b, 0x47, 0x33, 0x12, 0xe7, 0xe4, 0xaa, 0xff, 0x5f, 0xe7, 0xfa, 0x97, 0x8c, 0xf8, 0x77, 0xbc, 0x08, 0x26, 0x93, 0x49, 0x01, 0xb1, 0xc5, 0xa4, 0x67, 0x53, 0x91, 0xe3, 0x18, 0x6b, 0x3c, 0x41, 0x79, 0x71, 0x8c, 0x7f, 0x14, 0x93, 0x69, 0x29, 0x19, 0x97, 0x96, 0xbf, 0xf4, 0xc6, 0x77, 0xd7, 0x8c, 0x79, 0x10, 0x4c, 0x78, 0xb4, 0x01, 0xf7, 0x87, 0x9c, 0x47, 0x7d, 0x12, 0x7c, 0x09, 0x8c, 0xc3, 0xe3, 0x61, 0x3b, 0xb2, 0xe6, 0x81, 0x0c, 0x45, 0xcf, 0x0f, 0x1a, 0xf0, 0x31, 0x0d, 0x68, 0x9f, 0x91, 0x70, 0x0f, 0x3e, 0xa1, 0xde, 0xde, 0x6d, 0x68, 0x93, 0x90, 0xba, 0xe0, 0x73, 0x10, 0x3d, 0x0a, 0x7e, 0xc0, 0xba, 0x8c, 0x13, 0x0f, 0x46, 0x3e, 0x3a, 0xfb, 0x1d, 0x78, 0xec, 0xb7, 0xe1, 0xa1, 0x4f, 0x9c, 0x1e, 0x32, 0xb8, 0x34, 0x74, 0x90, 0x9b, 0x72, 0xa7, 0x27, 0xb9, 0x19, 0xef, 0x82, 0xf0, 0x7d, 0x0f, 0x1f, 0x10, 0x52, 0x0a, 0x3d, 0x7f, 0x04, 0x7d, 0xc2, 0x23, 0x68, 0xe3, 0xea, 0x8c, 0x86, 0xe0, 0x10, 0x0e, 0x1d, 0x2f, 0x02, 0x12, 0xf8, 0x43, 0xee, 0x2a, 0xfe, 0xd0, 0x09, 0x28, 0xe5, 0x65, 0x18, 0x86, 0xd2, 0x5b, 0x46, 0x66, 0x23, 0xb1, 0xc7, 0x1c, 0xca, 0x43, 0x8c, 0xfb, 0xd1, 0xe6, 0x36, 0x3c, 0xd4, 0x13, 0x40, 0x3d, 0xe3, 0x83, 0xa1, 0x68, 0x40, 0x97, 0xf4, 0xe9, 0x80, 0xb8, 0xa8, 0x40, 0x77, 0x36, 0x40, 0x4d, 0xa0, 0x53, 0x7a, 0x4a, 0x83, 0x90, 0xf9, 0xbc, 0x01, 0x15, 0xbb, 0x6a, 0x57, 0x2c, 0x6b, 0x4b, 0xb1, 0xef, 0x30, 0x57, 0xf4, 0xa0, 0x05, 0xb5, 0xb5, 0x0a, 0x2a, 0xb5, 0xee, 0x23, 0xca, 0xba, 0x3d, 0x81, 0xca, 0xea, 0x6a, 0x1d, 0x95, 0xdb, 0x18, 0x76, 0x9b, 0x04, 0x99, 0xb6, 0x6e, 0x2d, 0xc8, 0x17, 0x52, 0x38, 0x1e, 0x09, 0x43, 0xbd, 0x7f, 0x96, 0xb9, 0xb1, 0x31, 0x4a, 0xb9, 0xa4, 0x17, 0xce, 0x7b, 0xa9, 0xc7, 0x6a, 0x4d, 0x2e, 0x68, 0xba, 0xb4, 0x83, 0x51, 0x32, 0xc1, 0x88, 0xc7, 0xf6, 0xa8, 0x65, 0x9a, 0x1b, 0xcf, 0xd0, 0xf8, 0xc0, 0xf3, 0x89, 0x58, 0x0c, 0x08, 0x77, 0x17, 0xf3, 0x21, 0xad, 0x40, 0x42, 0xb8, 0xb4, 0x24, 0x91, 0xd1, 0x79, 0xc8, 0x24, 0x24, 0x09, 0xd5, 0x6b, 0x69, 0x6c, 0x38, 0xa0, 0xd4, 0x7d, 0x32, 0xc3, 0x5d, 0xab, 0x54, 0x96, 0x10, 0x59, 0x95, 0xaf, 0x9b, 0x50, 0x97, 0xd9, 0x66, 0xd0, 0xe8, 0xdf, 0x41, 0x03, 0x26, 0xa8, 0xdc, 0x15, 0xcb, 0xa4, 0xdc, 0x4d, 0xf2, 0x71, 0x03, 0x32, 0x42, 0x2b, 0x1a, 0x21, 0x41, 0x94, 0x61, 0xe3, 0x19, 0x4a, 0x54, 0x86, 0xaa, 0xfa, 0x55, 0xd4, 0x6f, 0x0d, 0x7f, 0x79, 0xbf, 0xe1, 0xc0, 0x25, 0x22, 0xd9, 0x83, 0x1b, 0x2d, 0x48, 0x63, 0xd6, 0xa9, 0x9e, 0x2a, 0x22, 0x84, 0x9b, 0xac, 0x03, 0x12, 0x95, 0x6e, 0x08, 0xdc, 0x81, 0xdc, 0x46, 0xa1, 0x5d, 0xef, 0xe3, 0xb9, 0x9b, 0xa7, 0xac, 0xe9, 0x7e, 0x2c, 0xb7, 0x60, 0xa5, 0xaa, 0x92, 0x91, 0x71, 0xa4, 0xbc, 0x4d, 0xd0, 0x09, 0x6a, 0x96, 0xf4, 0xfb, 0x55, 0x3e, 0x91, 0x8a, 0x25, 0xa9, 0x6e, 0x1a, 0x8c, 0xae, 0x85, 0xf2, 0x8d, 0xb2, 0x68, 0xce, 0x14, 0x28, 0xc7, 0x1d, 0x5d, 0xc0, 0xdd, 0x84, 0xa9, 0x03, 0x97, 0x31, 0x9e, 0xd5, 0x5e, 0xc0, 0x23, 0x1f, 0x6a, 0xa3, 0xf5, 0xf1, 0x7c, 0xf0, 0xe9, 0xd6, 0x79, 0x47, 0xef, 0x29, 0xf1, 0x86, 0x54, 0x1d, 0x63, 0x9c, 0x74, 0x02, 0xec, 0x9a, 0x30, 0x9d, 0xa1, 0x9b, 0x78, 0x22, 0x58, 0x5f, 0x9a, 0x57, 0xf0, 0x14, 0x54, 0xf2, 0x85, 0xeb, 0x52, 0xb9, 0xb8, 0x8b, 0x26, 0x85, 0xc0, 0xd4, 0x32, 0xb8, 0x4e, 0xc1, 0x85, 0x66, 0x0b, 0xb4, 0xd7, 0x29, 0xf3, 0x0d, 0x75, 0x6c, 0x4c, 0xea, 0x85, 0x54, 0xa9, 0xd3, 0xd5, 0x13, 0x7b, 0x1e, 0xaa, 0x83, 0x98, 0x8e, 0x22, 0x61, 0xd7, 0x51, 0x24, 0xde, 0xb9, 0x44, 0x17, 0x3a, 0x03, 0xe9, 0x87, 0x99, 0xda, 0x9c, 0x8e, 0xac, 0x85, 0xf4, 0x4e, 0x69, 0xc1, 0x17, 0xbb, 0xa7, 0xb3, 0x66, 0x53, 0xb7, 0xaa, 0xc2, 0x58, 0x32, 0x97, 0xed, 0xcd, 0x0f, 0x2c, 0x73, 0x1e, 0x1e, 0xe1, 0x05, 0xe3, 0x58, 0x66, 0x5f, 0xbe, 0x16, 0xf1, 0xcc, 0x63, 0x12, 0x0b, 0xc2, 0xde, 0xa3, 0x81, 0x7f, 0xd7, 0x32, 0x53, 0x7d, 0x35, 0xd1, 0x43, 0x0b, 0x6f, 0x80, 0xe5, 0xfa, 0xda, 0x72, 0xcd, 0x5e, 0xbd, 0xb5, 0x6e, 0x99, 0xa8, 0x51, 0xc9, 0x49, 0xa2, 0x4d, 0x79, 0x05, 0x59, 0xe6, 0xba, 0x2d, 0xe3, 0x0d, 0xe1, 0x39, 0x9c, 0xbb, 0x36, 0xec, 0x4b, 0xa6, 0xb6, 0xe0, 0x32, 0xd1, 0xb3, 0x58, 0x7b, 0xe0, 0x0f, 0x4e, 0x21, 0x9a, 0xf8, 0xb3, 0xa4, 0x5b, 0x32, 0x0c, 0xc5, 0x4b, 0x16, 0xde, 0x6d, 0x24, 0x5d, 0x24, 0x21, 0x1f, 0xaa, 0x46, 0x74, 0xbc, 0x10, 0xaa, 0xeb, 0x67, 0x81, 0xaa, 0x4d, 0x2d, 0x33, 0xa0, 0x8e, 0x48, 0x1a, 0x32, 0xd7, 0x2e, 0xe5, 0xe9, 0xb3, 0x55, 0x96, 0x71, 0x61, 0x2b, 0x73, 0x01, 0xd7, 0xef, 0x6b, 0x9a, 0x06, 0xcc, 0x3f, 0xcf, 0x28, 0x1d, 0xbc, 0xa0, 0xc5, 0xfe, 0xf5, 0xb4, 0xb9, 0xab, 0xf8, 0xea, 0x10, 0x2c, 0xac, 0x52, 0xa8, 0xaf, 0xcc, 0x1d, 0x2b, 0xa2, 0x5c, 0xb1, 0x3e, 0x36, 0x1e, 0x1c, 0xe9, 0x94, 0x6f, 0xd3, 0x9b, 0x50, 0xbb, 0x90, 0x42, 0x16, 0xf6, 0x1f, 0xe5, 0xcf, 0xb1, 0xc4, \ No newline at end of file diff --git a/build/assets/squirreldemo.tic.dat b/build/assets/squirreldemo.tic.dat index 30a054f77..6b45b5ed5 100644 --- a/build/assets/squirreldemo.tic.dat +++ b/build/assets/squirreldemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0xcb, 0x4a, 0xc3, 0x40, 0x14, 0x9d, 0xfa, 0x58, 0x64, 0x76, 0xfe, 0xc1, 0x58, 0x10, 0x26, 0x76, 0x42, 0xf3, 0x28, 0x45, 0x6b, 0xeb, 0x46, 0x05, 0x85, 0x42, 0x41, 0x04, 0xd7, 0xb5, 0x4d, 0x35, 0x10, 0xd3, 0x98, 0x4c, 0x25, 0x41, 0xdc, 0x67, 0xe1, 0x47, 0xb8, 0x94, 0x90, 0x8f, 0x98, 0xb5, 0x5c, 0xfa, 0x25, 0x25, 0xdf, 0xe0, 0x24, 0xf1, 0x51, 0x41, 0x74, 0xe1, 0xc2, 0x8d, 0xe7, 0xce, 0x65, 0xe6, 0x9c, 0x7b, 0x2e, 0x0c, 0x9c, 0x0d, 0x84, 0x50, 0xed, 0x71, 0x05, 0xfd, 0x84, 0x39, 0x48, 0x24, 0x49, 0x92, 0xa5, 0x69, 0x9a, 0x15, 0xb7, 0xa4, 0x19, 0x88, 0xf7, 0x06, 0x58, 0xe4, 0x49, 0x02, 0x79, 0x9a, 0x8a, 0x3c, 0x79, 0x12, 0x39, 0x64, 0x02, 0x44, 0x26, 0xc4, 0x5b, 0x7f, 0xbd, 0x0f, 0xdf, 0xee, 0xc3, 0xd2, 0x3e, 0xfa, 0xc7, 0x9f, 0xa2, 0xcc, 0xaa, 0xc8, 0xae, 0xac, 0xe7, 0xf2, 0xfd, 0x20, 0x73, 0x04, 0x24, 0x40, 0x66, 0x3b, 0x87, 0x0c, 0x81, 0xcc, 0x6e, 0x91, 0xc9, 0xfc, 0xd2, 0xd7, 0x2e, 0xf2, 0x44, 0x62, 0x91, 0x03, 0xe4, 0xf9, 0x6f, 0xf7, 0x95, 0xfd, 0xdf, 0xfd, 0x7f, 0x75, 0x6d, 0x9d, 0xd5, 0x50, 0xb3, 0x49, 0xb8, 0xc3, 0x5d, 0xbb, 0x43, 0xc8, 0xe5, 0xf0, 0xda, 0xae, 0x08, 0x96, 0xea, 0x70, 0xc6, 0xaf, 0xa6, 0x41, 0xa7, 0x52, 0xc7, 0xf6, 0xad, 0xed, 0x4e, 0x7d, 0x3b, 0x28, 0x26, 0x63, 0x3b, 0x1c, 0x49, 0x3b, 0x09, 0xe5, 0x9c, 0x97, 0x2c, 0x70, 0x7c, 0xee, 0x4c, 0xbd, 0x62, 0x58, 0x91, 0x0e, 0x09, 0x6f, 0x66, 0x4e, 0x10, 0xd8, 0x2e, 0xc6, 0xbc, 0xab, 0xe9, 0x38, 0xea, 0x6a, 0xbb, 0x6d, 0x1c, 0x77, 0x35, 0xb3, 0x85, 0xf1, 0x64, 0xe6, 0x8d, 0x0a, 0x3f, 0x39, 0x3b, 0x39, 0xa0, 0x2a, 0xbe, 0xc3, 0x8a, 0x33, 0x21, 0xf4, 0x82, 0x7b, 0x54, 0x57, 0x55, 0x12, 0xf7, 0x62, 0xcd, 0xd8, 0xfb, 0xd0, 0x8c, 0x4a, 0x6b, 0x2c, 0x6b, 0xa6, 0xd4, 0xa2, 0x5e, 0xf4, 0xc9, 0x67, 0x55, 0x5a, 0xe1, 0xc3, 0xca, 0xc8, 0x0d, 0xa9, 0x61, 0xa9, 0x58, 0x09, 0xfd, 0x80, 0x1a, 0x0d, 0x4a, 0xf9, 0x56, 0x5b, 0x57, 0x9b, 0x96, 0xae, 0x6e, 0x9b, 0x2c, 0x62, 0x31, 0x33, 0x5a, 0xcc, 0x62, 0xba, 0x2c, 0x93, 0x99, 0xd2, 0xe6, 0x07, 0x8e, 0xc7, 0x69, 0xfd, 0xf8, 0xa8, 0xdf, 0x1f, 0x90, 0xf3, 0xc1, 0x69, 0xff, 0x70, 0xb3, 0xce, 0x76, 0x5a, 0xf2, 0xc8, 0x21, 0xef, 0xf1, 0x86, 0x81, 0xef, 0xf1, 0x0b, 0x85, 0x6a, 0x09, 0x79, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0xc1, 0x6a, 0xdb, 0x40, 0x10, 0xdd, 0xb4, 0xcd, 0xc1, 0x7b, 0xcb, 0x1f, 0x4c, 0x03, 0x85, 0x55, 0x2d, 0xc7, 0x92, 0x6c, 0x42, 0xea, 0xda, 0xbd, 0x34, 0x85, 0x04, 0x5c, 0x02, 0x25, 0xd0, 0xb3, 0xa3, 0xac, 0xe3, 0xa5, 0x8a, 0xe4, 0xee, 0xae, 0x53, 0x8b, 0xd2, 0xbb, 0x0e, 0xf9, 0x88, 0x9e, 0x4a, 0x11, 0xfa, 0x88, 0x3d, 0x97, 0x25, 0x5f, 0x62, 0xf4, 0x0d, 0x9d, 0x95, 0x93, 0x36, 0x85, 0xd2, 0x1e, 0x72, 0xc8, 0x25, 0xb3, 0x1a, 0x76, 0xe7, 0xcd, 0x7b, 0x9a, 0x81, 0xb7, 0x45, 0x08, 0xd9, 0xf8, 0xfa, 0x88, 0xfc, 0x2f, 0xae, 0x2c, 0x46, 0x51, 0x14, 0x55, 0x59, 0x96, 0x95, 0xbb, 0xb1, 0xac, 0xac, 0xf9, 0x95, 0xd6, 0xae, 0xea, 0xa2, 0xb0, 0x75, 0x59, 0x9a, 0xba, 0xf8, 0x6e, 0x6a, 0x5b, 0x19, 0x6b, 0x2a, 0x63, 0x6e, 0xf2, 0xef, 0x7a, 0xfb, 0x4f, 0xbd, 0xbd, 0xa5, 0x27, 0x0f, 0x71, 0xaf, 0xd1, 0x78, 0xe5, 0xbc, 0x6b, 0xce, 0x8f, 0xe6, 0x7d, 0x89, 0x3e, 0x5a, 0x62, 0x2c, 0x7a, 0x7b, 0x65, 0x2b, 0x62, 0xd1, 0xbb, 0x55, 0x85, 0xfe, 0x95, 0xd7, 0xe9, 0xfc, 0x24, 0x66, 0x55, 0x5b, 0x5b, 0xd7, 0x77, 0xd5, 0xb7, 0x5e, 0xdd, 0x6d, 0xff, 0xc7, 0x4f, 0x36, 0xbf, 0x6d, 0x90, 0x6e, 0x17, 0xb4, 0xd0, 0x09, 0x1f, 0x00, 0xc0, 0xd9, 0xe4, 0x9c, 0xaf, 0x2b, 0x8a, 0xf0, 0x64, 0xa1, 0x67, 0x99, 0x1c, 0x5c, 0xc3, 0xa7, 0xfc, 0x82, 0x27, 0xd9, 0x9c, 0x4b, 0x1f, 0xf8, 0xf9, 0x44, 0x24, 0x78, 0xe9, 0x78, 0xc7, 0xf1, 0x4e, 0xb9, 0x8a, 0x9d, 0x1a, 0x14, 0xd2, 0x75, 0x53, 0x4a, 0x31, 0xd7, 0x22, 0x4b, 0x5d, 0x57, 0x09, 0xdd, 0xfc, 0x1b, 0x3e, 0xf1, 0x13, 0xf7, 0x86, 0x44, 0xa4, 0x1f, 0x5c, 0x23, 0x11, 0x31, 0x4f, 0x15, 0xf6, 0xde, 0x1e, 0x1e, 0xc3, 0x78, 0x5d, 0x00, 0x8b, 0x67, 0x93, 0xf4, 0x0c, 0x97, 0x98, 0x09, 0x05, 0x3a, 0x83, 0x3c, 0x5b, 0xc8, 0x1b, 0x26, 0x64, 0x53, 0x88, 0x67, 0x19, 0x16, 0x9e, 0xd3, 0x5f, 0x70, 0xa9, 0x70, 0xc6, 0x00, 0x82, 0x9d, 0xb0, 0x19, 0xd4, 0x4c, 0xc5, 0x51, 0xea, 0xe3, 0x42, 0x48, 0xc9, 0x13, 0x4a, 0xf5, 0xb0, 0x13, 0xd0, 0xe5, 0xb0, 0xf3, 0x62, 0x97, 0xe6, 0xc3, 0x4e, 0xd4, 0xa7, 0x74, 0xba, 0x48, 0x63, 0xb7, 0x19, 0x1c, 0x1f, 0xbe, 0x66, 0x1e, 0xfd, 0x4c, 0x5b, 0x62, 0x0a, 0xec, 0x44, 0xa7, 0x2c, 0xf0, 0x3c, 0xc8, 0x47, 0x79, 0x27, 0x7c, 0xf9, 0x1b, 0x0b, 0xd7, 0x58, 0xfb, 0x36, 0x16, 0x21, 0xb6, 0x1c, 0x2d, 0xff, 0xe0, 0xf5, 0xd6, 0x98, 0xe3, 0xd1, 0x56, 0x9c, 0x28, 0x16, 0xf6, 0x3c, 0xda, 0x52, 0x73, 0xc9, 0xc2, 0x36, 0x63, 0xfa, 0xd9, 0x6e, 0xe0, 0x75, 0x7b, 0x81, 0xf7, 0x3c, 0xf2, 0x97, 0x7e, 0xee, 0x87, 0x7d, 0xbf, 0xe7, 0x07, 0x78, 0x22, 0x3f, 0x42, 0xda, 0x5c, 0x8a, 0x54, 0xb3, 0xed, 0x83, 0x37, 0xe3, 0xf1, 0x11, 0xbc, 0x3f, 0x7a, 0x37, 0xde, 0x7f, 0xba, 0xed, 0xef, 0xf5, 0xf1, 0xc3, 0xa6, 0x1e, 0xe9, 0x76, 0x48, 0xbf, 0xd0, 0x9f, 0xb5, 0x27, 0x30, 0x62, \ No newline at end of file diff --git a/build/assets/squirrelmark.tic.dat b/build/assets/squirrelmark.tic.dat index f32c139e6..9e7415ec8 100644 --- a/build/assets/squirrelmark.tic.dat +++ b/build/assets/squirrelmark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x55, 0x4b, 0x8b, 0x23, 0x55, 0x14, 0xae, 0x5e, 0x28, 0x26, 0x18, 0x48, 0xb6, 0xe2, 0xe2, 0x30, 0x20, 0x56, 0x3a, 0xe9, 0xa4, 0x92, 0x7e, 0x28, 0x79, 0x34, 0xf4, 0x38, 0x88, 0x03, 0x8e, 0xc8, 0x74, 0x3b, 0x3d, 0x41, 0x1b, 0xa9, 0x54, 0xdd, 0x24, 0x85, 0x95, 0xaa, 0x4c, 0xd5, 0xad, 0xe9, 0x04, 0xc9, 0xd6, 0x5f, 0xe0, 0x0f, 0x70, 0xa5, 0x5b, 0x5d, 0xb9, 0x77, 0x27, 0xa4, 0xa1, 0x7f, 0x40, 0x57, 0x33, 0xfe, 0x00, 0x33, 0x2e, 0x1a, 0x5d, 0xea, 0xb9, 0xaf, 0x4a, 0x55, 0xc0, 0x89, 0x82, 0xa0, 0x42, 0x5f, 0xea, 0xd4, 0xe3, 0x3c, 0xbe, 0x7b, 0x1e, 0xf7, 0x9c, 0x7a, 0xd5, 0xd0, 0xb4, 0xd7, 0x5e, 0xaf, 0x9e, 0xbd, 0x79, 0xf6, 0xdd, 0xe1, 0xf1, 0xf3, 0xf9, 0xe9, 0xef, 0x17, 0xd1, 0x37, 0xbf, 0x4c, 0xde, 0xfe, 0xde, 0x7e, 0xe3, 0xc9, 0xac, 0x7c, 0xe0, 0xb7, 0xcf, 0x7e, 0x3c, 0xfa, 0xfa, 0xd7, 0xf0, 0xf9, 0x6f, 0x37, 0x37, 0x37, 0x5f, 0x7e, 0xfb, 0xc3, 0x23, 0xf7, 0x8b, 0xdd, 0xce, 0xe9, 0xd6, 0x57, 0x2f, 0x6b, 0x9b, 0x56, 0xa9, 0x54, 0x42, 0xda, 0x8a, 0x91, 0x2e, 0xd6, 0x88, 0xf1, 0x62, 0xad, 0x88, 0xb7, 0x42, 0xe9, 0x72, 0xb1, 0x46, 0x57, 0xb1, 0x16, 0xb3, 0xc5, 0x10, 0xe2, 0xb8, 0x58, 0x5a, 0x5c, 0x65, 0xe9, 0x02, 0x79, 0x8c, 0xbf, 0x69, 0x69, 0xb7, 0xeb, 0x5f, 0x5d, 0xaa, 0xce, 0x8a, 0xb6, 0xb4, 0xcb, 0xf8, 0xa7, 0xe5, 0x35, 0xd2, 0x12, 0xdf, 0x9f, 0x5d, 0x17, 0xb0, 0xc6, 0x85, 0x58, 0xae, 0x02, 0x0a, 0xe3, 0x45, 0x2c, 0x48, 0xac, 0x4b, 0xac, 0xf1, 0xa5, 0xac, 0xb5, 0xa0, 0x82, 0x96, 0x08, 0xf1, 0x7d, 0xbd, 0xde, 0xec, 0x44, 0x14, 0x24, 0x15, 0x6f, 0xeb, 0xff, 0x5f, 0xa8, 0xff, 0xf2, 0x45, 0x14, 0x5f, 0x2c, 0x16, 0xf1, 0x62, 0x8d, 0x18, 0x2f, 0x59, 0xc5, 0xd2, 0xd5, 0x1a, 0xc5, 0x29, 0xba, 0xed, 0xff, 0xff, 0x73, 0xfd, 0x4b, 0x5a, 0xfc, 0x33, 0x0e, 0x82, 0xe5, 0x72, 0x59, 0x40, 0xdd, 0xa2, 0xec, 0x59, 0x45, 0x6c, 0x5d, 0x63, 0x8d, 0x97, 0x48, 0xcf, 0xae, 0xf1, 0x47, 0xb1, 0xcc, 0x52, 0x49, 0xdb, 0x58, 0xfe, 0xd2, 0x4b, 0x9f, 0xbc, 0xa2, 0xd5, 0xeb, 0x40, 0x1d, 0xea, 0x92, 0x16, 0xdc, 0x8d, 0x3c, 0x6f, 0x36, 0x36, 0x83, 0xcf, 0xc0, 0xf1, 0xe0, 0xf8, 0x49, 0xe4, 0x04, 0x01, 0x71, 0xf3, 0x28, 0x37, 0x23, 0x3a, 0xf2, 0x83, 0x16, 0x3c, 0xf4, 0xfb, 0xf0, 0xbe, 0x6f, 0x5a, 0x23, 0xc6, 0xb4, 0x49, 0x68, 0xa1, 0x0d, 0xf1, 0xac, 0x11, 0xb3, 0x71, 0xbc, 0x21, 0x50, 0xdf, 0x77, 0xf1, 0x06, 0x21, 0x21, 0x30, 0xf2, 0xcf, 0x61, 0x6c, 0x7a, 0x33, 0xe8, 0x23, 0xaa, 0x43, 0x42, 0xb0, 0x4c, 0x0f, 0x06, 0xee, 0x0c, 0xcc, 0xc0, 0x8f, 0x3c, 0x1b, 0xe8, 0x88, 0x40, 0x68, 0x05, 0x84, 0x78, 0x55, 0x88, 0x42, 0x66, 0xad, 0x76, 0xac, 0x31, 0x74, 0xc7, 0x9b, 0x44, 0xb4, 0x05, 0x43, 0x73, 0x4c, 0x26, 0xa6, 0xcd, 0x38, 0xa8, 0xec, 0x4c, 0x90, 0x15, 0xa6, 0x1c, 0x7b, 0x4a, 0x82, 0xd0, 0xf1, 0xbd, 0x16, 0x34, 0x6a, 0x8d, 0x9a, 0x91, 0xcf, 0xbb, 0xbe, 0x65, 0xba, 0x70, 0xcc, 0x61, 0x4f, 0x1d, 0x9b, 0x8e, 0xa0, 0x0b, 0xcd, 0x3d, 0xa3, 0x9d, 0x11, 0xbc, 0x47, 0x9c, 0xe1, 0x88, 0xa2, 0xa4, 0xb1, 0x7b, 0xa0, 0x24, 0x27, 0xe8, 0x79, 0xdf, 0x0c, 0x12, 0x51, 0x22, 0x60, 0x1f, 0x68, 0x9f, 0x1f, 0x44, 0x9e, 0x45, 0x71, 0x2b, 0x08, 0x3c, 0x7b, 0xe0, 0xfa, 0x26, 0xd5, 0xc7, 0xe6, 0xb4, 0x0c, 0x9f, 0xe7, 0x01, 0x97, 0x50, 0x0d, 0x7c, 0xd7, 0x65, 0xa8, 0x35, 0x03, 0xb6, 0x31, 0xf4, 0x29, 0xde, 0x03, 0xd3, 0xb3, 0xf5, 0x32, 0xd4, 0xe1, 0xe1, 0xd1, 0x07, 0xf7, 0x3e, 0x7d, 0x70, 0xf4, 0xb8, 0xcd, 0xf5, 0x03, 0x42, 0xa3, 0xc0, 0xe3, 0x06, 0xed, 0xfc, 0x3c, 0x0b, 0xee, 0x78, 0xff, 0x14, 0x74, 0x8d, 0xfa, 0x08, 0x46, 0x86, 0x24, 0xd0, 0xcb, 0x7c, 0x1b, 0xcb, 0x35, 0xc3, 0x50, 0x54, 0x19, 0xd1, 0x73, 0x21, 0x35, 0xa9, 0x63, 0xc1, 0xb9, 0xca, 0x13, 0xc6, 0xac, 0x78, 0x23, 0x95, 0x87, 0xdd, 0x26, 0xc6, 0x9e, 0x9b, 0x8a, 0x24, 0xe4, 0x66, 0xf2, 0x19, 0x4e, 0x08, 0xb1, 0x1f, 0xa7, 0x3f, 0x7a, 0xc9, 0x47, 0xe0, 0x50, 0xc2, 0x5c, 0x65, 0x76, 0x96, 0xef, 0x85, 0x34, 0x88, 0x2c, 0xea, 0xa3, 0x0b, 0x6c, 0x4b, 0x8e, 0x24, 0x83, 0x4c, 0x57, 0x69, 0x07, 0x77, 0x47, 0x1f, 0x73, 0x7c, 0x87, 0x8c, 0x5c, 0x56, 0x64, 0x07, 0x3d, 0xe1, 0x0a, 0xc9, 0xd6, 0x7a, 0x52, 0x88, 0xa6, 0x61, 0x94, 0x51, 0xa1, 0xc1, 0x1e, 0x75, 0x38, 0x30, 0x12, 0xb5, 0xde, 0x26, 0x35, 0xcc, 0x49, 0x2e, 0xc9, 0xbd, 0x1d, 0x98, 0xe7, 0xd2, 0x4b, 0x8c, 0x42, 0x17, 0x91, 0x54, 0x61, 0x5a, 0x85, 0x59, 0x15, 0x1a, 0xfc, 0x32, 0xf8, 0xb5, 0x87, 0x57, 0x79, 0xdd, 0x3a, 0x9a, 0xd8, 0x26, 0x25, 0xa9, 0x28, 0xa7, 0x50, 0x01, 0xe1, 0xac, 0x8a, 0x6b, 0xa6, 0x38, 0x3d, 0x96, 0x9b, 0x9c, 0x33, 0x00, 0x9d, 0x29, 0x89, 0xfc, 0x1f, 0xa6, 0x4f, 0xad, 0x40, 0xe1, 0x30, 0xd9, 0x2c, 0x71, 0x5d, 0x86, 0xb7, 0xca, 0x83, 0x7c, 0xd9, 0x66, 0xa1, 0x31, 0xc9, 0x3c, 0x81, 0xee, 0x80, 0x91, 0x02, 0x32, 0xfe, 0xcc, 0x2c, 0x63, 0xc5, 0x7c, 0x94, 0xc5, 0x3f, 0xcc, 0xb4, 0x8b, 0x44, 0x9a, 0x25, 0x2e, 0x25, 0x85, 0x11, 0xea, 0x2b, 0xf4, 0x9e, 0x42, 0xef, 0xa5, 0xd0, 0x13, 0xf8, 0x4e, 0xb6, 0xd5, 0x52, 0xb0, 0x19, 0xfe, 0x06, 0x38, 0xbc, 0x92, 0xf3, 0xfc, 0xee, 0x87, 0xc7, 0x0c, 0x64, 0x30, 0x09, 0x65, 0x94, 0x83, 0x00, 0x87, 0x86, 0xfa, 0x40, 0x15, 0x7a, 0xe2, 0x8c, 0xd9, 0x91, 0xdc, 0xc1, 0xd2, 0xb3, 0x56, 0x5e, 0x15, 0x6d, 0x48, 0xe8, 0x23, 0xd3, 0x8d, 0x54, 0xd9, 0x98, 0x87, 0x14, 0x75, 0x75, 0x76, 0x4e, 0x12, 0xc3, 0x4e, 0x97, 0x9d, 0x19, 0x95, 0xca, 0x04, 0x5c, 0xbe, 0x54, 0x64, 0xd6, 0x81, 0xb8, 0x21, 0x91, 0x2a, 0x93, 0x95, 0xbc, 0x9d, 0xb1, 0x11, 0x35, 0x48, 0xb9, 0x24, 0x76, 0x53, 0x05, 0x90, 0xbd, 0x8b, 0xf6, 0x6d, 0x19, 0xa1, 0xe8, 0x7e, 0x01, 0x88, 0x71, 0x32, 0x55, 0xc1, 0x52, 0x43, 0xb5, 0x0b, 0x1f, 0xf3, 0x7e, 0xd6, 0xcb, 0x67, 0xe9, 0x21, 0x75, 0x72, 0xff, 0x1d, 0x5d, 0x4c, 0x10, 0x1c, 0x92, 0x0f, 0x70, 0xbc, 0x5a, 0x79, 0x11, 0x5d, 0xb7, 0x2b, 0x02, 0x01, 0x18, 0x33, 0xae, 0x6e, 0x94, 0xd9, 0x4e, 0x42, 0x06, 0x5d, 0x9c, 0x7b, 0xdb, 0x07, 0x7b, 0xdb, 0xcd, 0xda, 0xee, 0x5b, 0xfb, 0x19, 0xb5, 0x86, 0x50, 0xa3, 0x95, 0x0a, 0xa6, 0x0f, 0x21, 0xef, 0xb3, 0xe9, 0x2c, 0xcc, 0xfa, 0xd4, 0x43, 0x14, 0x91, 0x9d, 0x81, 0x1f, 0x80, 0x2e, 0x1c, 0x74, 0x78, 0xb8, 0xf8, 0xe8, 0xc0, 0x3e, 0x7b, 0x54, 0x30, 0x8b, 0x32, 0x85, 0xd2, 0xf7, 0xda, 0x24, 0x0a, 0x47, 0xba, 0xf4, 0x5e, 0xe5, 0x40, 0xe6, 0x51, 0x01, 0x37, 0xfe, 0x16, 0x30, 0xb7, 0x92, 0xe0, 0x2e, 0xf1, 0x30, 0x03, 0x87, 0x49, 0x0b, 0x24, 0xbb, 0x06, 0x64, 0xec, 0x3f, 0x25, 0xe8, 0x32, 0xaf, 0xc5, 0x5c, 0x1d, 0x27, 0x1e, 0xd6, 0x47, 0xbc, 0x89, 0xf3, 0x6c, 0x3b, 0x82, 0x7f, 0x39, 0xd0, 0x9d, 0x6a, 0x9f, 0x4f, 0x4b, 0xfc, 0x1f, 0x4a, 0x7b, 0x01, 0xc7, 0xb9, 0x35, 0xd5, 0xf3, 0xed, 0x04, 0xe0, 0x1e, 0xce, 0x10, 0x1c, 0x7b, 0x6e, 0xa8, 0x37, 0xf6, 0xcb, 0x7f, 0x19, 0x47, 0x4c, 0x1e, 0x8e, 0x82, 0x67, 0xc0, 0xa2, 0xba, 0x98, 0x33, 0xa9, 0xd6, 0xaf, 0x66, 0xbb, 0x03, 0xc5, 0x4c, 0x1d, 0x27, 0x14, 0xce, 0xc9, 0x3b, 0x77, 0x05, 0x62, 0x0b, 0xee, 0xe0, 0x69, 0xcc, 0xc4, 0x8f, 0x7f, 0x00, 0x9c, 0xbf, 0xf8, 0x6f, 0xd5, 0xcb, 0x6a, 0x7e, 0x35, 0xf0, 0x31, 0x30, 0x31, 0xc7, 0x9c, 0xc1, 0xdf, 0x52, 0x50, 0x78, 0xc6, 0x04, 0x0c, 0x1e, 0xb9, 0xda, 0xaa, 0x3b, 0x32, 0x38, 0xe9, 0x89, 0x54, 0x87, 0xe6, 0x0b, 0x50, 0xe7, 0xf9, 0x3f, 0x00, 0xbf, 0xc1, 0x26, 0x9b, \ No newline at end of file +0x78, 0xda, 0xed, 0x55, 0x4b, 0x6f, 0xe3, 0x54, 0x14, 0x76, 0x17, 0x20, 0x12, 0x11, 0x29, 0xd9, 0x22, 0x16, 0x47, 0x23, 0x21, 0x9c, 0x26, 0x4d, 0x9c, 0xf4, 0x01, 0xca, 0xa3, 0x52, 0x87, 0x11, 0xa2, 0xd2, 0x14, 0xa1, 0x69, 0x99, 0x4e, 0x84, 0x2a, 0xe4, 0xda, 0x37, 0x89, 0x85, 0x63, 0x67, 0xec, 0xeb, 0x69, 0x22, 0x94, 0x2d, 0xbf, 0x80, 0x1f, 0xc0, 0x0a, 0xb6, 0xb0, 0x62, 0xcf, 0x0e, 0x29, 0x95, 0xfa, 0x03, 0xea, 0x6a, 0xf8, 0x01, 0x64, 0x58, 0x54, 0xb0, 0x84, 0x73, 0x5f, 0x8e, 0x1d, 0x89, 0x09, 0x48, 0x48, 0x80, 0xd4, 0x2b, 0x1f, 0x3f, 0xce, 0xe3, 0xbb, 0xe7, 0x71, 0xcf, 0xf1, 0xeb, 0x86, 0xa6, 0xbd, 0xf1, 0x66, 0xf5, 0xec, 0xed, 0xb3, 0xef, 0xf6, 0x8f, 0x5f, 0xcc, 0x4e, 0x7f, 0xbf, 0x8c, 0xbe, 0xf9, 0x65, 0xfc, 0xee, 0xf7, 0xf6, 0x5b, 0x4f, 0xa7, 0xe5, 0x3d, 0xbf, 0x7d, 0xf6, 0xe3, 0xc1, 0xd7, 0xbf, 0x86, 0x2f, 0x7e, 0xbb, 0xbd, 0xbd, 0xfd, 0xf2, 0xdb, 0x1f, 0x1e, 0xbb, 0x5f, 0x6c, 0x77, 0x4e, 0x37, 0xbe, 0x7a, 0x55, 0x5b, 0xb7, 0x4a, 0xa5, 0x12, 0xd2, 0x46, 0x8c, 0x74, 0xb9, 0x42, 0x8c, 0x17, 0x6b, 0x45, 0xbc, 0x15, 0x4a, 0x57, 0xf3, 0x15, 0xba, 0x8e, 0xb5, 0x98, 0x2d, 0x86, 0x10, 0xc7, 0xc5, 0xd2, 0xfc, 0x3a, 0x4b, 0x97, 0xc8, 0x63, 0xfc, 0x75, 0x4b, 0xbb, 0x5b, 0xff, 0xea, 0x52, 0x75, 0x56, 0xb4, 0xa1, 0x5d, 0xc5, 0x3f, 0x2d, 0x6e, 0x90, 0x16, 0xf8, 0xfe, 0xfc, 0xa6, 0x80, 0x35, 0x2e, 0xc4, 0x72, 0x15, 0x50, 0x18, 0xcf, 0x63, 0x41, 0x62, 0x5d, 0x61, 0x8d, 0xaf, 0x64, 0xad, 0x05, 0x15, 0xb4, 0x44, 0x88, 0xef, 0xab, 0xf5, 0x66, 0x27, 0xa2, 0x20, 0xa9, 0x78, 0x57, 0xff, 0xff, 0x42, 0xfd, 0x17, 0x2f, 0xa3, 0xf8, 0x72, 0x3e, 0x8f, 0xe7, 0x2b, 0xc4, 0x78, 0xc9, 0x2a, 0x96, 0xae, 0x57, 0x28, 0x4e, 0xd1, 0x5d, 0xff, 0xff, 0x9f, 0xeb, 0x5f, 0xd2, 0xe2, 0x9f, 0x71, 0x10, 0x2c, 0x16, 0x8b, 0x02, 0xea, 0x16, 0x65, 0xcf, 0x2a, 0x62, 0xeb, 0x06, 0x6b, 0xbc, 0x40, 0x7a, 0x7e, 0x83, 0x3f, 0x8a, 0x45, 0x96, 0x4a, 0xda, 0xda, 0xf2, 0x97, 0x5e, 0x89, 0x5e, 0xd3, 0xea, 0x75, 0xa0, 0x0e, 0x75, 0x49, 0x0b, 0xee, 0x47, 0x9e, 0x37, 0x1d, 0x99, 0xc1, 0x67, 0xe0, 0x78, 0x70, 0xfc, 0x34, 0x72, 0x82, 0x80, 0xb8, 0x79, 0x94, 0x9b, 0x11, 0x1d, 0xfa, 0x41, 0x0b, 0x1e, 0xf9, 0xe7, 0xf0, 0xd0, 0x37, 0xad, 0x21, 0x63, 0xda, 0x24, 0xb4, 0xd0, 0x86, 0x78, 0xd6, 0x90, 0xd9, 0x38, 0xde, 0x00, 0xa8, 0xef, 0xbb, 0x78, 0x83, 0x90, 0x10, 0x18, 0xfa, 0x17, 0x30, 0x32, 0xbd, 0x29, 0x9c, 0x23, 0xaa, 0x43, 0x42, 0xb0, 0x4c, 0x0f, 0xfa, 0xee, 0x14, 0xcc, 0xc0, 0x8f, 0x3c, 0x1b, 0xe8, 0x90, 0x40, 0x68, 0x05, 0x84, 0x78, 0x55, 0x88, 0x42, 0x66, 0xad, 0x76, 0xac, 0x31, 0x74, 0xd7, 0xb1, 0x88, 0x17, 0xa2, 0x53, 0x47, 0x87, 0x27, 0xf0, 0x50, 0x7c, 0x00, 0x13, 0x38, 0xde, 0x38, 0xa2, 0x2d, 0x18, 0x98, 0x23, 0x32, 0x36, 0x6d, 0xc6, 0x41, 0x14, 0x67, 0x8c, 0xac, 0x30, 0xe5, 0xf1, 0x33, 0x12, 0x84, 0x8e, 0xef, 0xb5, 0xa0, 0x51, 0x6b, 0xd4, 0x8c, 0x7c, 0xde, 0xf5, 0x2d, 0xd3, 0x85, 0x63, 0xbe, 0xdf, 0xa9, 0x63, 0xd3, 0x21, 0x74, 0xa1, 0xb9, 0x63, 0xb4, 0x33, 0x82, 0x0f, 0x88, 0x33, 0x18, 0x52, 0x94, 0x34, 0xb6, 0xf7, 0x94, 0xe4, 0x04, 0x43, 0x3a, 0x37, 0x83, 0x44, 0x94, 0x08, 0xd8, 0x07, 0xda, 0xe7, 0xfb, 0x91, 0x67, 0x51, 0xdc, 0x0a, 0x02, 0xcf, 0xee, 0xbb, 0xbe, 0x49, 0xf5, 0x91, 0x39, 0x29, 0xc3, 0xe7, 0x79, 0xc0, 0x25, 0x54, 0x03, 0xdf, 0x75, 0x19, 0x6a, 0xcd, 0x80, 0x4d, 0xcc, 0xc9, 0x04, 0xef, 0x81, 0xe9, 0xd9, 0x7a, 0x19, 0xea, 0xf0, 0xe8, 0xe0, 0xc3, 0x07, 0x9f, 0x1e, 0x1d, 0x3c, 0x69, 0x73, 0xfd, 0x80, 0xd0, 0x28, 0xf0, 0xb8, 0x41, 0x3b, 0x3f, 0xcb, 0x82, 0x3b, 0xde, 0x3f, 0x05, 0x5d, 0xa3, 0x3e, 0x82, 0x91, 0x01, 0x09, 0xf4, 0x32, 0xdf, 0xc6, 0x72, 0xcd, 0x30, 0x14, 0xe5, 0x47, 0xf4, 0x5c, 0x48, 0x4d, 0xea, 0x58, 0x70, 0xa1, 0xf2, 0x84, 0x31, 0x2b, 0xde, 0x50, 0xe5, 0x61, 0xbb, 0x89, 0xb1, 0xe7, 0x26, 0x22, 0x09, 0xb9, 0xa9, 0x7c, 0x86, 0x63, 0x42, 0xec, 0x27, 0xe9, 0x8f, 0x5e, 0xf2, 0x11, 0x38, 0x94, 0x30, 0x57, 0x99, 0x9d, 0xe5, 0x7b, 0x21, 0x0d, 0x22, 0x8b, 0xfa, 0xe8, 0x02, 0xdb, 0x92, 0x23, 0xc9, 0x20, 0xd3, 0x55, 0xda, 0xc2, 0xdd, 0xd1, 0xc7, 0x1c, 0xdf, 0x21, 0x23, 0x97, 0x15, 0xd9, 0x42, 0x4f, 0xb8, 0x42, 0xb2, 0xb5, 0x9e, 0x14, 0xa2, 0x69, 0x18, 0x65, 0x54, 0x68, 0xb0, 0x47, 0x1d, 0xf6, 0x8c, 0x44, 0xad, 0xb7, 0x4e, 0x0d, 0x73, 0x92, 0x4b, 0x72, 0x6f, 0x07, 0xe6, 0x85, 0xf4, 0x12, 0xa3, 0xd0, 0x45, 0x24, 0x55, 0x98, 0x54, 0x61, 0x5a, 0x85, 0x06, 0xbf, 0x0c, 0x7e, 0xed, 0xe0, 0x55, 0x5e, 0xb5, 0x8e, 0xc6, 0xb6, 0x49, 0x49, 0x2a, 0xca, 0x09, 0x54, 0x40, 0x38, 0xab, 0xe2, 0x9a, 0x2a, 0x4e, 0x8f, 0xe5, 0x26, 0xe7, 0xf4, 0x41, 0x67, 0x4a, 0x22, 0xff, 0xfb, 0xe9, 0x53, 0x2b, 0x50, 0x38, 0x4c, 0x36, 0x4b, 0x5c, 0x97, 0xe1, 0x2d, 0xf3, 0x20, 0x5f, 0x36, 0x59, 0x68, 0x4c, 0x32, 0x4b, 0xa0, 0x3b, 0x60, 0xa4, 0x80, 0x8c, 0x3f, 0x33, 0xcb, 0x58, 0x31, 0x1f, 0x65, 0xf1, 0xf7, 0x33, 0xed, 0x22, 0x91, 0xa6, 0x89, 0x4b, 0x49, 0x61, 0x84, 0xfa, 0x12, 0xbd, 0xa7, 0xd0, 0x7b, 0x29, 0xf4, 0x04, 0xbe, 0x93, 0x6d, 0xb5, 0x14, 0x6c, 0x86, 0xbf, 0x06, 0x0e, 0xaf, 0xe4, 0x3c, 0xbf, 0xff, 0xd1, 0x31, 0x03, 0xe9, 0x8f, 0x43, 0x19, 0x65, 0x3f, 0xc0, 0xa1, 0xa1, 0x3e, 0x50, 0x85, 0x9e, 0x38, 0x23, 0x76, 0x24, 0xb7, 0xb0, 0xf4, 0xac, 0x95, 0x97, 0x45, 0x1b, 0x10, 0xfa, 0xd8, 0x74, 0x23, 0x55, 0x36, 0xe6, 0x21, 0x45, 0x5d, 0x9d, 0x9d, 0x93, 0xc4, 0xb0, 0xd3, 0x65, 0x67, 0x46, 0xa5, 0x32, 0x01, 0x97, 0x2f, 0x15, 0x99, 0x75, 0x20, 0x2e, 0x4e, 0x2e, 0xa1, 0x32, 0x5e, 0xca, 0xdb, 0x19, 0x1b, 0x51, 0x83, 0x94, 0x4b, 0x62, 0x37, 0x55, 0x00, 0xd9, 0xbb, 0x68, 0xdf, 0x96, 0x11, 0x8a, 0xee, 0x17, 0x80, 0x18, 0x27, 0x53, 0x15, 0x2c, 0x35, 0x6d, 0xbb, 0xf0, 0x09, 0xef, 0x67, 0xbd, 0x7c, 0x96, 0x1e, 0x52, 0x27, 0x87, 0xef, 0xe9, 0x62, 0x82, 0xe0, 0x90, 0x3c, 0xc2, 0xb9, 0x6b, 0xe5, 0x45, 0x74, 0xdd, 0xae, 0x08, 0x04, 0x60, 0xc4, 0xb8, 0xba, 0x51, 0x66, 0x3b, 0x09, 0x19, 0x74, 0x71, 0xee, 0x6d, 0xee, 0xed, 0x6c, 0x36, 0x6b, 0xdb, 0xef, 0xec, 0x66, 0xd4, 0x1a, 0x42, 0x8d, 0x56, 0x2a, 0x98, 0x3e, 0x84, 0x3c, 0x64, 0xd3, 0x59, 0x98, 0x9d, 0x53, 0x0f, 0x51, 0x44, 0x76, 0xfa, 0x7e, 0x00, 0xba, 0x70, 0xd0, 0xe1, 0xe1, 0xe2, 0xa3, 0x03, 0xbb, 0xec, 0x51, 0xc1, 0x2c, 0xca, 0x14, 0x4a, 0xdf, 0x6b, 0xe3, 0x28, 0x1c, 0xea, 0xd2, 0x7b, 0x95, 0x03, 0x99, 0x47, 0x05, 0xdc, 0xf8, 0x5b, 0xc0, 0xdc, 0x4a, 0x82, 0xbb, 0xc4, 0xc3, 0x0c, 0xec, 0x27, 0x2d, 0x90, 0xec, 0x1a, 0x90, 0x91, 0xff, 0x8c, 0xa0, 0xcb, 0xbc, 0x16, 0x33, 0x75, 0x9c, 0x78, 0x58, 0x1f, 0xf3, 0x26, 0xce, 0xb3, 0xed, 0x08, 0xfe, 0xfe, 0x40, 0x77, 0xaa, 0xe7, 0x7c, 0x5a, 0xe2, 0x8f, 0x52, 0xda, 0x0b, 0x38, 0xce, 0xad, 0xa9, 0x9e, 0x6f, 0x27, 0x00, 0x0f, 0x70, 0x86, 0xe0, 0xd8, 0x73, 0x43, 0xbd, 0xb1, 0x5b, 0xfe, 0xcb, 0x38, 0x62, 0xf2, 0x70, 0x14, 0x3c, 0x03, 0x16, 0xd5, 0xc5, 0x9c, 0x49, 0xb5, 0x7e, 0x35, 0xdb, 0x1d, 0x28, 0x66, 0xea, 0x38, 0xa1, 0x70, 0x4e, 0xde, 0xbb, 0x2f, 0x10, 0x5b, 0x70, 0x0f, 0x4f, 0x63, 0x26, 0x7e, 0xfc, 0x03, 0xe0, 0xfc, 0xc5, 0x9f, 0xae, 0x5e, 0x56, 0xf3, 0xab, 0x81, 0x8f, 0xbe, 0x89, 0x39, 0xe6, 0x0c, 0xfe, 0x96, 0x82, 0xc2, 0x33, 0x26, 0x60, 0xf0, 0xc8, 0xd5, 0x96, 0xdd, 0x91, 0xc1, 0x49, 0x4f, 0xa4, 0x3a, 0x34, 0x5f, 0x82, 0x3a, 0xcb, 0xff, 0x01, 0x8e, 0x23, 0x2e, 0x66, \ No newline at end of file diff --git a/build/assets/wrendemo.tic.dat b/build/assets/wrendemo.tic.dat index 7b98a8ad8..331d2dd3b 100644 --- a/build/assets/wrendemo.tic.dat +++ b/build/assets/wrendemo.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x51, 0xcb, 0x4a, 0xc3, 0x40, 0x14, 0x9d, 0xfa, 0x58, 0x64, 0x76, 0xfe, 0xc1, 0x58, 0x10, 0x12, 0x1b, 0x6d, 0x1e, 0xa5, 0x68, 0xa1, 0x6e, 0x54, 0x54, 0x28, 0x14, 0x44, 0x70, 0x19, 0x6a, 0x1a, 0x35, 0x10, 0x93, 0x90, 0x4c, 0x6d, 0x4a, 0xcd, 0x3e, 0x0b, 0x3f, 0x42, 0x5c, 0x49, 0xc8, 0x47, 0xcc, 0x5a, 0x86, 0x7e, 0x49, 0xc9, 0x37, 0x38, 0x93, 0xb4, 0xa5, 0x42, 0xd1, 0x45, 0x17, 0x6e, 0xbc, 0x33, 0x97, 0xfb, 0x3a, 0xe7, 0x4e, 0xc8, 0xd9, 0x01, 0x00, 0x54, 0xde, 0x36, 0xc0, 0x6f, 0x36, 0xa1, 0xcc, 0x92, 0x24, 0xc9, 0xd2, 0x34, 0xcd, 0x78, 0x64, 0x65, 0x46, 0xc9, 0xc2, 0x29, 0x9d, 0xe6, 0x49, 0x42, 0xf3, 0x34, 0x25, 0x79, 0xf2, 0x41, 0x72, 0x9a, 0x11, 0x4a, 0x32, 0x42, 0xe6, 0xbe, 0x9a, 0x4f, 0x7f, 0xe4, 0xd3, 0x25, 0x3e, 0xf8, 0xb7, 0x3f, 0xb5, 0x42, 0x2b, 0xae, 0x5d, 0x71, 0x3e, 0x8b, 0xfc, 0x95, 0xe9, 0x48, 0x01, 0xa1, 0x4c, 0xdb, 0x09, 0xcd, 0x00, 0x65, 0xda, 0x4d, 0x33, 0xa6, 0x5f, 0x3a, 0x73, 0xae, 0x27, 0x20, 0xd3, 0x9c, 0xd2, 0x3c, 0x5f, 0x97, 0x2f, 0x9c, 0xac, 0xf7, 0xfd, 0x9b, 0x5b, 0xdb, 0xef, 0x15, 0x50, 0xaf, 0x23, 0x6c, 0x63, 0xc7, 0x6a, 0x21, 0xf4, 0xd0, 0x7b, 0xb2, 0xca, 0x02, 0xb2, 0x6e, 0x6f, 0x80, 0x1f, 0xbd, 0xa0, 0x55, 0x76, 0xfb, 0xd6, 0xb3, 0xe5, 0x78, 0xbe, 0x15, 0xf0, 0x49, 0xdf, 0x0a, 0x4d, 0x06, 0x47, 0x21, 0x9b, 0xe3, 0xa2, 0x0a, 0x6c, 0x1f, 0xdb, 0x9e, 0xcb, 0x87, 0x65, 0xd1, 0x42, 0xc3, 0xc0, 0x72, 0x21, 0x34, 0x9d, 0x5e, 0x18, 0xa2, 0x0b, 0xbe, 0xc2, 0x0e, 0xd1, 0xcd, 0xd5, 0xe9, 0x18, 0x42, 0xc1, 0xf4, 0xdc, 0x10, 0x07, 0x03, 0x13, 0x23, 0xd7, 0x1a, 0x8a, 0xd2, 0x18, 0x0a, 0x82, 0x81, 0xdb, 0x0a, 0x0f, 0x51, 0xfb, 0xb8, 0xc9, 0xe3, 0xa8, 0xad, 0x35, 0xa0, 0x10, 0x43, 0x01, 0x0a, 0x8c, 0x54, 0x62, 0xec, 0x7b, 0x91, 0xe5, 0x87, 0x77, 0xd8, 0x15, 0x15, 0xa9, 0xe8, 0x70, 0x9c, 0x31, 0x3a, 0x50, 0x59, 0x1a, 0x7f, 0x07, 0xa8, 0xcb, 0x80, 0xda, 0x0a, 0x80, 0x36, 0x07, 0x44, 0x6d, 0x23, 0x5a, 0xb5, 0x41, 0x5f, 0x06, 0x2c, 0x36, 0xb0, 0xcb, 0x01, 0xa6, 0x13, 0x8a, 0xaa, 0x2e, 0xcd, 0xaa, 0xd0, 0x0f, 0x44, 0xb5, 0x26, 0x8a, 0x06, 0xde, 0x6b, 0x2a, 0x52, 0x5d, 0x57, 0x5e, 0x14, 0x69, 0x5f, 0x93, 0x8d, 0x48, 0x36, 0x46, 0xb2, 0xda, 0x90, 0x75, 0x59, 0x61, 0x47, 0x93, 0xb5, 0x39, 0xc1, 0x0f, 0x6c, 0x17, 0x8b, 0xd5, 0xcb, 0xf3, 0x4e, 0xa7, 0x8b, 0x6e, 0xbb, 0xd7, 0x9d, 0xb3, 0xdd, 0xaa, 0x7c, 0xd4, 0x60, 0x57, 0x2a, 0xdf, 0x60, 0xbf, 0xc3, 0xc0, 0xfc, 0xd1, 0x18, 0xc6, 0xf0, 0x0b, 0x2e, 0xe1, 0x23, 0x5d, \ No newline at end of file +0x78, 0xda, 0xed, 0x51, 0x4f, 0x6b, 0xdb, 0x30, 0x14, 0x57, 0xbb, 0xee, 0x60, 0xdd, 0x76, 0xef, 0x41, 0x2b, 0x0c, 0xe4, 0xd5, 0x4b, 0x6c, 0x27, 0x94, 0x2d, 0x90, 0x5e, 0xb6, 0xb1, 0x15, 0x32, 0x0a, 0xa5, 0xb0, 0xa3, 0x71, 0x5d, 0xb5, 0x11, 0x73, 0xe5, 0x20, 0x29, 0x4d, 0x42, 0x97, 0xbb, 0x0f, 0xfb, 0x10, 0x3b, 0x0e, 0xe3, 0x0f, 0xe1, 0xf3, 0x10, 0xfd, 0x24, 0xc1, 0x9f, 0x61, 0x4f, 0x4e, 0x52, 0x32, 0x08, 0xdb, 0xa1, 0x87, 0x5d, 0xf6, 0x24, 0xf1, 0xfe, 0xe8, 0xf7, 0x7b, 0x4f, 0xe8, 0xf7, 0x0c, 0x21, 0xb4, 0xf3, 0x7d, 0x17, 0xfd, 0xcd, 0xee, 0x0d, 0x58, 0x9e, 0xe7, 0x65, 0x51, 0x14, 0xa5, 0xf5, 0x90, 0x96, 0xa6, 0x7a, 0x38, 0xc6, 0x2c, 0xea, 0x3c, 0x37, 0x75, 0x51, 0x54, 0x75, 0xfe, 0xa3, 0xaa, 0x4d, 0x59, 0x99, 0xaa, 0xac, 0xaa, 0xf5, 0xd9, 0xce, 0x37, 0x7f, 0xe4, 0x9b, 0x0d, 0x3e, 0xfa, 0x6f, 0xff, 0xd4, 0x1a, 0xad, 0xac, 0x76, 0xcd, 0xfa, 0xd9, 0xc4, 0xdf, 0x40, 0x47, 0x83, 0x2a, 0x03, 0xda, 0xde, 0x9b, 0x12, 0x19, 0xd0, 0x6e, 0x51, 0x82, 0x7e, 0xc5, 0xea, 0x58, 0x3d, 0x51, 0xb5, 0xa8, 0x8d, 0xa9, 0xeb, 0xc7, 0xf2, 0x9d, 0xe3, 0xc7, 0xbd, 0xff, 0xc9, 0xde, 0xd3, 0xfd, 0x5d, 0xd4, 0x6e, 0x13, 0xcd, 0x75, 0xca, 0x7a, 0x84, 0x90, 0xeb, 0xf8, 0x86, 0x2d, 0x33, 0x0c, 0xe5, 0x78, 0xac, 0x87, 0x99, 0xec, 0xad, 0xca, 0x97, 0xec, 0x96, 0xa5, 0xd9, 0x88, 0x49, 0x8f, 0xb0, 0x9b, 0x98, 0xa7, 0xe0, 0x74, 0xd2, 0xb2, 0xb8, 0x4b, 0xa6, 0x12, 0xcb, 0x26, 0x0a, 0xe0, 0xba, 0x49, 0x25, 0x1f, 0x69, 0x9e, 0x09, 0x7b, 0xab, 0xb8, 0x6e, 0x7a, 0x93, 0x09, 0xbb, 0xb0, 0x31, 0x49, 0xb9, 0xf8, 0x62, 0x2f, 0x52, 0x9e, 0x30, 0xa1, 0xe0, 0xee, 0xd3, 0xc9, 0x39, 0x19, 0x2c, 0x13, 0x42, 0x93, 0x61, 0x2c, 0xae, 0xe1, 0x11, 0x43, 0xae, 0x88, 0xce, 0xc8, 0x2c, 0x1b, 0xcb, 0x35, 0x92, 0x64, 0x57, 0x24, 0x19, 0x66, 0x90, 0xb8, 0x96, 0x7f, 0xcb, 0xa4, 0x82, 0x19, 0x3d, 0xe2, 0xb7, 0x82, 0x66, 0x50, 0x33, 0x15, 0x46, 0x4d, 0x24, 0x13, 0x18, 0x27, 0x69, 0xac, 0x14, 0xf9, 0x60, 0x9f, 0x0e, 0xad, 0xce, 0x4f, 0xde, 0xde, 0x61, 0xec, 0x24, 0x99, 0x50, 0x5a, 0x8e, 0x13, 0x4d, 0x04, 0x9b, 0x50, 0xf7, 0x0e, 0x3b, 0x4e, 0xa4, 0xfb, 0xbe, 0x75, 0xd3, 0xfe, 0x9b, 0x23, 0xeb, 0x67, 0xfd, 0xb0, 0x8b, 0x9d, 0x39, 0x76, 0xb0, 0x03, 0xa4, 0x25, 0x86, 0x5f, 0x51, 0x88, 0x5b, 0x17, 0x5a, 0x50, 0xdf, 0x6d, 0x2a, 0x16, 0x17, 0xcd, 0x5e, 0x05, 0x10, 0xce, 0x7f, 0x07, 0x04, 0x9b, 0x80, 0xc3, 0x2d, 0x80, 0x70, 0x0d, 0x98, 0xf6, 0xa3, 0xe9, 0xb6, 0x0e, 0x9d, 0x4d, 0xc0, 0x43, 0x07, 0xd8, 0x16, 0x90, 0xa4, 0x8a, 0x06, 0x1d, 0x77, 0x95, 0xa9, 0x91, 0xa4, 0xc1, 0x21, 0xa5, 0x91, 0x7e, 0x71, 0xe4, 0xbb, 0xed, 0x8e, 0xff, 0xd5, 0x77, 0x5f, 0x86, 0x5e, 0x34, 0xf5, 0xa2, 0x99, 0x17, 0x74, 0xbd, 0x8e, 0xe7, 0xc3, 0x0a, 0xbd, 0x70, 0x4d, 0x18, 0x49, 0x2e, 0x34, 0x3d, 0xf8, 0xf8, 0x7e, 0x30, 0x38, 0x25, 0x9f, 0x4f, 0xcf, 0x06, 0xef, 0x9e, 0x1f, 0x78, 0xaf, 0xbb, 0xb0, 0xdd, 0xe5, 0x0c, 0xf8, 0x8e, 0x48, 0xdb, 0xa1, 0x73, 0x3c, 0xc7, 0xbf, 0x00, 0x6a, 0x4e, 0x49, 0x47, \ No newline at end of file diff --git a/build/assets/wrenmark.tic.dat b/build/assets/wrenmark.tic.dat index f465199ea..4bc84769f 100644 --- a/build/assets/wrenmark.tic.dat +++ b/build/assets/wrenmark.tic.dat @@ -1 +1 @@ -0x78, 0xda, 0xed, 0x55, 0x4f, 0x6f, 0xe3, 0x54, 0x10, 0x77, 0x0f, 0x20, 0x62, 0x11, 0x29, 0xb9, 0x22, 0x0e, 0xa3, 0x4a, 0x2b, 0x9c, 0x6e, 0xea, 0x3a, 0x69, 0x37, 0xa0, 0xd0, 0x54, 0xda, 0x05, 0x01, 0x2b, 0x81, 0x84, 0xb6, 0x65, 0x4b, 0x85, 0xaa, 0xca, 0xb1, 0x5f, 0x1a, 0x8b, 0xc4, 0x0e, 0xf6, 0x4b, 0xb3, 0x11, 0xea, 0x95, 0x4f, 0xc0, 0x07, 0xe0, 0x04, 0x57, 0x38, 0x71, 0xe7, 0x86, 0x94, 0x4a, 0xfd, 0x00, 0x75, 0xb5, 0x7c, 0x00, 0xb2, 0x1c, 0x2a, 0x38, 0xc2, 0xcc, 0xfb, 0x93, 0xd8, 0xe9, 0x76, 0xb3, 0x37, 0x40, 0xea, 0x53, 0xe6, 0xc5, 0x9e, 0xf7, 0x9b, 0xdf, 0xbc, 0x37, 0x33, 0x6f, 0xfc, 0xba, 0x63, 0x18, 0x6f, 0xbc, 0x59, 0x3d, 0x7c, 0xeb, 0xf0, 0xa7, 0x9d, 0xdd, 0x67, 0xa7, 0xfb, 0x7f, 0x9f, 0x0d, 0x7f, 0xf8, 0x63, 0xf0, 0xce, 0xcf, 0xfe, 0x9d, 0xaf, 0xc6, 0x95, 0x46, 0xf4, 0xee, 0xe1, 0xaf, 0xf7, 0xbf, 0xff, 0x33, 0x79, 0xf6, 0xd7, 0xd5, 0xd5, 0xd5, 0xb7, 0x3f, 0xfe, 0xf2, 0xb8, 0xf7, 0xcd, 0xe6, 0xf6, 0xfe, 0xca, 0x77, 0xaf, 0x1a, 0xcb, 0x46, 0xb9, 0x5c, 0x46, 0x59, 0x49, 0x51, 0xce, 0x16, 0x84, 0x74, 0xa9, 0x51, 0xc2, 0xa9, 0x58, 0x3e, 0x9f, 0x2c, 0xc8, 0x45, 0x6a, 0xa4, 0x34, 0x88, 0x21, 0x4d, 0x4b, 0xe5, 0xc9, 0x45, 0x5e, 0xce, 0x50, 0x47, 0xfa, 0x65, 0xc3, 0xb8, 0x1d, 0xff, 0xea, 0xd0, 0x79, 0xd6, 0xb2, 0x62, 0x9c, 0xa7, 0xbf, 0x4d, 0x2f, 0x51, 0xa6, 0xf8, 0xfc, 0xf4, 0xb2, 0x88, 0x39, 0x2e, 0xa6, 0x6a, 0x14, 0x71, 0x31, 0x9d, 0xa4, 0x52, 0xe4, 0x38, 0xc7, 0x1c, 0x9f, 0xab, 0x5c, 0x4b, 0x29, 0x1a, 0xb3, 0x45, 0x7c, 0x5e, 0xcc, 0x37, 0x55, 0x44, 0x51, 0x49, 0xe9, 0x36, 0xff, 0xff, 0x85, 0xfc, 0x4f, 0x5f, 0x24, 0xe9, 0xd9, 0x64, 0x92, 0x4e, 0x16, 0x84, 0x74, 0xb3, 0x51, 0x2a, 0x5f, 0x2c, 0x48, 0x9a, 0x91, 0xdb, 0xfb, 0xff, 0x7f, 0xce, 0x7f, 0xd9, 0x48, 0x7f, 0xc7, 0x46, 0x30, 0x9d, 0x4e, 0x8b, 0x88, 0x2d, 0xa9, 0x3b, 0xab, 0x85, 0xc6, 0x25, 0xe6, 0x78, 0x8a, 0xf2, 0xf4, 0x12, 0x3f, 0x14, 0xd3, 0xbc, 0x94, 0x8d, 0xa5, 0xe9, 0x2f, 0xbf, 0xd2, 0x7a, 0xcd, 0xd8, 0xd8, 0x00, 0x1e, 0xf0, 0x1e, 0x6b, 0xc2, 0x83, 0x61, 0x18, 0x8e, 0xfb, 0x6e, 0xfc, 0x25, 0x04, 0x21, 0xec, 0xc7, 0x2c, 0x34, 0x71, 0xcd, 0x1d, 0xf2, 0x6e, 0x14, 0x37, 0xe1, 0x51, 0xd4, 0x86, 0x8f, 0x23, 0xd7, 0xeb, 0x92, 0xd2, 0x67, 0x89, 0x87, 0x78, 0x16, 0x7a, 0x5d, 0xc2, 0x07, 0xe1, 0x31, 0xf0, 0x28, 0xea, 0xe1, 0x04, 0x09, 0x63, 0xd0, 0x8d, 0x46, 0xd0, 0x77, 0xc3, 0x31, 0xb4, 0x91, 0x31, 0x60, 0x09, 0x78, 0x6e, 0x08, 0x9d, 0xde, 0x18, 0xdc, 0x38, 0x1a, 0x86, 0x3e, 0xf0, 0x2e, 0x83, 0xc4, 0x8b, 0x19, 0x0b, 0xab, 0x30, 0x4c, 0xc8, 0x9a, 0xbc, 0xd9, 0xc4, 0x1c, 0x84, 0x83, 0x21, 0x6f, 0xc2, 0xb1, 0xdb, 0x67, 0x03, 0xd7, 0x27, 0x0d, 0x02, 0x83, 0x01, 0xaa, 0x46, 0x6a, 0x43, 0x27, 0x2c, 0x4e, 0x82, 0x28, 0x6c, 0x42, 0xcd, 0xae, 0xd9, 0x8e, 0x69, 0x06, 0xfd, 0x41, 0x14, 0x73, 0x58, 0x8d, 0xdd, 0xd0, 0x8f, 0xfa, 0xab, 0xd0, 0x89, 0x62, 0x78, 0x24, 0x9e, 0x4d, 0xf3, 0xc4, 0x8d, 0x61, 0x57, 0x38, 0xda, 0x0f, 0x7c, 0xde, 0x85, 0x16, 0xd4, 0xb7, 0x9c, 0x8c, 0xf6, 0x23, 0x16, 0x1c, 0x77, 0x39, 0xaa, 0x6b, 0x9b, 0x0d, 0xa1, 0xde, 0xc3, 0x53, 0xb4, 0xdd, 0x78, 0xa6, 0x6f, 0x98, 0xa6, 0xd7, 0x73, 0x93, 0x44, 0xc6, 0x06, 0xbe, 0x36, 0x0b, 0x5e, 0x14, 0x26, 0x3c, 0x1e, 0x7a, 0x1c, 0x42, 0x36, 0xb2, 0xc8, 0x69, 0x85, 0xd4, 0x85, 0xa3, 0x27, 0x08, 0xa7, 0x57, 0x3b, 0x08, 0xb9, 0xe5, 0x54, 0x73, 0x7e, 0xd7, 0xa5, 0xbd, 0x3d, 0xa2, 0xb7, 0x0a, 0xa1, 0xc7, 0xcf, 0x45, 0x2b, 0xbf, 0x1a, 0xde, 0x15, 0xaf, 0x02, 0x9f, 0x0c, 0x18, 0xf3, 0x3f, 0xd7, 0x46, 0x9d, 0x5e, 0xe4, 0x72, 0x6b, 0xbd, 0xe6, 0xa0, 0x25, 0x4e, 0x15, 0xd8, 0x80, 0x86, 0x33, 0x83, 0x1d, 0xbc, 0x04, 0x2c, 0x0e, 0x38, 0xa3, 0x73, 0x9b, 0x85, 0x53, 0xd3, 0x2c, 0x24, 0xdc, 0xe5, 0x81, 0x07, 0x62, 0x7b, 0xe2, 0x34, 0x31, 0xe3, 0xc3, 0x38, 0x84, 0x7a, 0x83, 0xd6, 0xf5, 0xb2, 0xdc, 0x4e, 0x76, 0x7d, 0xb3, 0x2e, 0xed, 0xfd, 0xd8, 0x1d, 0x59, 0x32, 0x0e, 0x7b, 0x0f, 0xdf, 0xb3, 0x91, 0xde, 0x52, 0x3e, 0xaa, 0x70, 0xf4, 0x04, 0x65, 0x8c, 0x1b, 0x10, 0x3f, 0x47, 0xfc, 0xb6, 0xf0, 0x57, 0x91, 0xa6, 0xc3, 0x81, 0xef, 0x72, 0x66, 0x65, 0x82, 0x88, 0xd3, 0x5d, 0x50, 0x07, 0xd6, 0xa1, 0xc2, 0x49, 0xeb, 0x0e, 0xd0, 0xa8, 0x10, 0x74, 0xc0, 0x12, 0xb8, 0x4c, 0x5c, 0x61, 0x27, 0x1b, 0x73, 0x49, 0x28, 0x19, 0x6f, 0x4c, 0x85, 0x40, 0xcc, 0x42, 0xab, 0x9f, 0xd6, 0x10, 0x84, 0x81, 0xa1, 0x93, 0x6b, 0x47, 0xdb, 0xe0, 0x64, 0x09, 0x9d, 0x1b, 0x0d, 0x73, 0x76, 0xe3, 0xd9, 0x06, 0x55, 0xe8, 0x76, 0x72, 0x79, 0xd6, 0x8c, 0xe3, 0xd9, 0x16, 0x9f, 0x9b, 0xff, 0xb9, 0xaf, 0x83, 0x99, 0xaf, 0x83, 0xb9, 0xaf, 0xb9, 0xb3, 0xed, 0x7c, 0xf9, 0x66, 0xe9, 0x73, 0x0b, 0x4b, 0x08, 0xf1, 0x77, 0xaa, 0xcb, 0xfe, 0x83, 0x4f, 0x77, 0xaf, 0x17, 0xbd, 0xca, 0xd5, 0x89, 0xdb, 0x1b, 0x32, 0x15, 0x8c, 0xa3, 0x4e, 0x8c, 0x37, 0x36, 0xd1, 0x6f, 0x68, 0xcb, 0xf7, 0x82, 0x3e, 0xad, 0x52, 0xf5, 0x39, 0xa2, 0x8a, 0x8e, 0x19, 0x7f, 0x4c, 0x26, 0xca, 0x9e, 0x36, 0x4d, 0xc5, 0xc2, 0x11, 0x87, 0xaa, 0x75, 0x98, 0x5b, 0x6d, 0xb7, 0xa8, 0x5c, 0x67, 0x11, 0x9f, 0x71, 0xeb, 0xa7, 0xbb, 0x32, 0x3d, 0xc0, 0x7a, 0x09, 0x53, 0x18, 0xbd, 0x19, 0x05, 0xc9, 0xdb, 0xc9, 0x74, 0x65, 0x36, 0x35, 0xf7, 0xab, 0xd2, 0xa5, 0xea, 0x59, 0xd2, 0xe4, 0x22, 0xf0, 0x21, 0x72, 0x40, 0x90, 0x90, 0xc9, 0x8d, 0x91, 0xe8, 0x0c, 0xc8, 0x0b, 0xc6, 0xca, 0x16, 0x4a, 0x52, 0xc9, 0x6e, 0x84, 0x5a, 0xd9, 0x8a, 0xe6, 0x0b, 0xba, 0x25, 0xb6, 0xe0, 0x0b, 0x99, 0x64, 0x5a, 0x51, 0xf0, 0xca, 0x21, 0x21, 0xb8, 0xdc, 0x31, 0x65, 0x16, 0x9d, 0x4a, 0x1f, 0x00, 0xd8, 0xf9, 0x3e, 0xc1, 0x5e, 0xe9, 0xe9, 0x74, 0x23, 0xaa, 0xa5, 0x8b, 0x12, 0xc4, 0x81, 0xfa, 0xb4, 0x6c, 0x39, 0x95, 0x6c, 0x05, 0x0a, 0x54, 0x63, 0xad, 0xb1, 0xb5, 0x56, 0xb7, 0x37, 0xdf, 0xbe, 0x77, 0x1d, 0x5e, 0xd3, 0x70, 0xe1, 0x16, 0x27, 0x8a, 0x2d, 0xbe, 0xa2, 0xbb, 0x87, 0xd4, 0x8a, 0x33, 0x89, 0x6a, 0xf3, 0x10, 0xd9, 0x55, 0x52, 0xa8, 0xcb, 0x5a, 0x01, 0x7d, 0x28, 0x6a, 0xb6, 0x6d, 0x2b, 0xe2, 0xf9, 0xf1, 0x6c, 0xd7, 0xf7, 0xad, 0xeb, 0xe7, 0x23, 0x67, 0xc2, 0x9b, 0xca, 0x5d, 0x96, 0xba, 0xb6, 0x84, 0x5a, 0x9c, 0x47, 0xd3, 0x7b, 0xf8, 0x1d, 0xa1, 0xeb, 0xa4, 0x6b, 0x24, 0xe3, 0x39, 0x66, 0xfd, 0xe8, 0x84, 0xdd, 0xe7, 0x32, 0x12, 0xd2, 0x9d, 0xf4, 0xa9, 0xce, 0xf5, 0x99, 0xe8, 0x38, 0xa6, 0x72, 0xd4, 0x16, 0x8d, 0x1d, 0x9d, 0x69, 0x02, 0xc5, 0x28, 0xf4, 0xb6, 0xee, 0x4e, 0x19, 0xf3, 0xf7, 0xb1, 0xd7, 0xa9, 0x3e, 0xe7, 0xf5, 0x12, 0xab, 0x76, 0xaf, 0xf2, 0x72, 0x54, 0xb2, 0x47, 0xaa, 0x68, 0x93, 0x75, 0xcc, 0x3c, 0xd1, 0xfa, 0xf3, 0xdf, 0x8a, 0x6a, 0xfe, 0xae, 0xe2, 0x72, 0x45, 0xe1, 0xb1, 0x9f, 0xe2, 0xb7, 0x62, 0xf5, 0x81, 0xe4, 0x6e, 0xc2, 0x9d, 0x85, 0x70, 0x54, 0x56, 0x75, 0x87, 0xad, 0xe1, 0x5f, 0xc7, 0xc5, 0x00, 0x0b, 0x85, 0x78, 0x5a, 0x20, 0xc1, 0x5a, 0x15, 0x04, 0x58, 0xb9, 0xf6, 0xfc, 0x5e, 0x12, 0x43, 0xb6, 0x57, 0x6e, 0x40, 0xfd, 0x05, 0x7c, 0x74, 0x49, 0xfe, 0x01, 0x31, 0x90, 0x1c, 0xe5, \ No newline at end of file +0x78, 0xda, 0xed, 0x55, 0xcd, 0x6e, 0x23, 0x45, 0x10, 0x9e, 0x1c, 0x40, 0x78, 0x84, 0xa5, 0xf8, 0x8a, 0x38, 0x94, 0x22, 0xad, 0x18, 0x67, 0x9d, 0xc9, 0xd8, 0xc9, 0x7a, 0x57, 0x26, 0x89, 0xb4, 0x0b, 0x02, 0x22, 0xed, 0x4a, 0x68, 0x13, 0x12, 0x22, 0x14, 0x45, 0xe3, 0x99, 0x76, 0x3c, 0xc2, 0x9e, 0x31, 0x33, 0xed, 0x78, 0x2d, 0x94, 0x2b, 0x4f, 0xc0, 0x03, 0x70, 0x82, 0x2b, 0x9c, 0xb8, 0x73, 0x43, 0x72, 0xa4, 0x3c, 0x40, 0x26, 0x5a, 0x1e, 0x00, 0x2f, 0x87, 0x08, 0x8e, 0x50, 0xd5, 0x3f, 0xf6, 0x8c, 0xb3, 0x59, 0xef, 0x0d, 0x90, 0xd2, 0x72, 0xb5, 0xbb, 0xeb, 0xe7, 0xab, 0xee, 0xaa, 0xea, 0x9a, 0xb7, 0x1d, 0xc3, 0x78, 0xe7, 0xdd, 0xca, 0xe1, 0x7b, 0x87, 0x3f, 0x6d, 0xed, 0xbc, 0x38, 0xdd, 0xff, 0xfb, 0xac, 0xff, 0xc3, 0x1f, 0xbd, 0x07, 0x3f, 0xfb, 0x77, 0xbe, 0x1a, 0x96, 0xeb, 0xd1, 0xfb, 0x87, 0xbf, 0x3e, 0xfc, 0xfe, 0xcf, 0xe4, 0xc5, 0x5f, 0x57, 0x57, 0x57, 0xdf, 0xfe, 0xf8, 0xcb, 0x5e, 0xe7, 0x9b, 0xb5, 0x8d, 0xfd, 0x85, 0xef, 0xde, 0x34, 0xe6, 0x8d, 0x52, 0xa9, 0x84, 0xb4, 0x90, 0x22, 0x9d, 0xcd, 0x10, 0xf1, 0x52, 0x63, 0x11, 0xa7, 0x62, 0xe9, 0x7c, 0x34, 0x43, 0x17, 0xa9, 0x91, 0xd2, 0x20, 0x84, 0x34, 0x5d, 0x2c, 0x8d, 0x2e, 0xf2, 0x74, 0x86, 0x3c, 0xe2, 0xcf, 0x1b, 0xc6, 0xed, 0xf8, 0x57, 0x87, 0xce, 0xb3, 0xa6, 0x05, 0xe3, 0x3c, 0xfd, 0x6d, 0x7c, 0x89, 0x34, 0xc6, 0xf5, 0xf3, 0xcb, 0x22, 0xe6, 0xb8, 0x98, 0xaa, 0x51, 0x44, 0x61, 0x3a, 0x4a, 0x25, 0xc9, 0x71, 0x8e, 0x39, 0x3e, 0x57, 0xb9, 0x96, 0x54, 0x34, 0x26, 0x42, 0x5c, 0xcf, 0xe6, 0x9b, 0x2a, 0xa2, 0xa8, 0x68, 0xf1, 0x36, 0xff, 0xff, 0x85, 0xfc, 0x8f, 0x5f, 0x45, 0xe9, 0xd9, 0x68, 0x94, 0x8e, 0x66, 0x88, 0x78, 0x93, 0xb1, 0x58, 0xba, 0x98, 0xa1, 0x34, 0x43, 0xb7, 0xef, 0xff, 0xff, 0x9c, 0xff, 0x92, 0x91, 0xfe, 0x8e, 0x8d, 0x60, 0x3c, 0x1e, 0x17, 0x51, 0x77, 0x51, 0xbd, 0x59, 0x4d, 0x34, 0x2e, 0x31, 0xc7, 0x63, 0xa4, 0xe7, 0x97, 0xf8, 0xa1, 0x18, 0xe7, 0xa9, 0x64, 0xcc, 0x4d, 0x7f, 0xe9, 0x8d, 0xbd, 0xb7, 0x8c, 0xd5, 0x55, 0xe0, 0x01, 0xef, 0xb0, 0x06, 0x3c, 0xea, 0x87, 0xe1, 0xb0, 0xeb, 0xc6, 0x5f, 0x42, 0x10, 0xc2, 0x7e, 0xcc, 0x42, 0x13, 0x65, 0x6e, 0x9f, 0xb7, 0xa3, 0xb8, 0x01, 0x4f, 0xa3, 0x26, 0x3c, 0x8e, 0x5c, 0xaf, 0x4d, 0x4c, 0x9f, 0x25, 0x1e, 0xea, 0xb3, 0xd0, 0x6b, 0x93, 0x7e, 0x10, 0x1e, 0x03, 0x8f, 0xa2, 0x0e, 0x4e, 0x90, 0x30, 0x06, 0xed, 0x68, 0x00, 0x5d, 0x37, 0x1c, 0x42, 0x13, 0x11, 0x03, 0x96, 0x80, 0xe7, 0x86, 0xd0, 0xea, 0x0c, 0xc1, 0x8d, 0xa3, 0x7e, 0xe8, 0x03, 0x6f, 0x33, 0x48, 0xbc, 0x98, 0xb1, 0xb0, 0x02, 0xfd, 0x84, 0xac, 0xc9, 0x9b, 0x4d, 0xc8, 0x9d, 0xc0, 0x63, 0x61, 0x82, 0x87, 0x79, 0xb2, 0xbd, 0x0b, 0x8f, 0xe5, 0x06, 0x48, 0x10, 0x84, 0xbd, 0x3e, 0x6f, 0xc0, 0xb1, 0xdb, 0x65, 0x3d, 0xd7, 0x27, 0x0e, 0x22, 0x04, 0x3d, 0x64, 0x0d, 0xd4, 0x49, 0x4f, 0x58, 0x9c, 0x04, 0x51, 0xd8, 0x80, 0xaa, 0x5d, 0xb5, 0x1d, 0xd3, 0x0c, 0xba, 0xbd, 0x28, 0xe6, 0xb0, 0x14, 0xbb, 0xa1, 0x1f, 0x75, 0x97, 0xa0, 0x15, 0xc5, 0xf0, 0x54, 0xac, 0x4d, 0xf3, 0xc4, 0x8d, 0x61, 0x47, 0x9c, 0x60, 0x3f, 0xf0, 0x79, 0x1b, 0x36, 0xa1, 0xb6, 0xee, 0x64, 0xb8, 0x9f, 0xb0, 0xe0, 0xb8, 0xcd, 0x91, 0x5d, 0x5d, 0xab, 0x0b, 0xf6, 0x2e, 0x5e, 0xaf, 0xe9, 0xc6, 0x13, 0x7e, 0xdd, 0x34, 0xbd, 0x8e, 0x9b, 0x24, 0x32, 0x68, 0xf0, 0xb5, 0x59, 0xf0, 0xa2, 0x30, 0xe1, 0x71, 0xdf, 0xe3, 0x10, 0xb2, 0x81, 0x45, 0x4e, 0xcb, 0xc4, 0x2e, 0x1c, 0x3d, 0x43, 0x75, 0xda, 0xda, 0x41, 0xc8, 0x2d, 0xa7, 0x92, 0xf3, 0xbb, 0x22, 0xed, 0xed, 0x01, 0xed, 0xca, 0xa4, 0x3d, 0x7c, 0xa9, 0xb6, 0xf2, 0xab, 0xd5, 0xdb, 0x62, 0x2b, 0xf4, 0x93, 0x1e, 0x63, 0xfe, 0xe7, 0xda, 0xa8, 0xd5, 0x89, 0x5c, 0x6e, 0xad, 0x54, 0x1d, 0xb4, 0xc4, 0xa9, 0x0c, 0xab, 0x50, 0x77, 0x26, 0x6a, 0x07, 0xaf, 0xa1, 0x16, 0x07, 0x9c, 0xd1, 0xbd, 0xcd, 0xc2, 0xa9, 0x69, 0x16, 0x12, 0xee, 0xf2, 0xc0, 0x03, 0x71, 0x3c, 0x71, 0x9b, 0x98, 0xf1, 0x7e, 0x1c, 0x42, 0xad, 0x4e, 0x72, 0x2d, 0x96, 0xc7, 0xc9, 0xca, 0xd7, 0x6a, 0xd2, 0xde, 0x8f, 0xdd, 0x81, 0x25, 0xe3, 0xb0, 0xbb, 0xfd, 0x81, 0x8d, 0xf0, 0x96, 0xf2, 0x51, 0x81, 0xa3, 0x67, 0x48, 0x43, 0x3c, 0x80, 0xf8, 0x39, 0xe2, 0xb7, 0x8e, 0xbf, 0xb2, 0x34, 0xed, 0xf7, 0x7c, 0x97, 0x33, 0x2b, 0x13, 0x44, 0x9c, 0xee, 0x82, 0xba, 0xb0, 0x0e, 0x15, 0x4e, 0x9a, 0x77, 0x80, 0x46, 0x85, 0xa0, 0x05, 0x96, 0xd0, 0xcb, 0xc4, 0x15, 0xb6, 0xb2, 0x31, 0x97, 0x80, 0x12, 0xf1, 0xc6, 0x54, 0x08, 0x8d, 0x49, 0x68, 0xf5, 0x6a, 0x19, 0x95, 0x30, 0x30, 0x74, 0x73, 0xed, 0x68, 0x03, 0x9c, 0x2c, 0xa0, 0x73, 0xa3, 0x61, 0xce, 0x6e, 0x38, 0x39, 0xa0, 0x0a, 0xdd, 0x56, 0x2e, 0xcf, 0x1a, 0x71, 0x38, 0x39, 0xe2, 0x4b, 0xf3, 0x3f, 0xf5, 0x75, 0x30, 0xf1, 0x75, 0x30, 0xf5, 0x35, 0x75, 0xb6, 0x91, 0x2f, 0xdf, 0x2c, 0x7c, 0x4e, 0x30, 0x07, 0x10, 0x7f, 0xa7, 0xba, 0xec, 0x3f, 0xfa, 0x74, 0xe7, 0x7a, 0xd1, 0xab, 0x5c, 0x9d, 0xb8, 0x9d, 0x3e, 0x53, 0xc1, 0x38, 0x6a, 0xc5, 0xf8, 0x62, 0x13, 0xbd, 0x43, 0x5b, 0xbe, 0x1b, 0x74, 0x49, 0x4a, 0xd5, 0xe7, 0x88, 0x2a, 0x3a, 0x66, 0x7c, 0x8f, 0x4c, 0x94, 0x3d, 0x1d, 0x9a, 0x8a, 0x85, 0xa3, 0x1e, 0xb2, 0x56, 0x60, 0x6a, 0xb5, 0xb1, 0x49, 0xe5, 0x3a, 0x89, 0xf8, 0x04, 0x5b, 0xaf, 0xee, 0xca, 0xf4, 0x00, 0xeb, 0x60, 0xd7, 0x90, 0x3a, 0xfa, 0x30, 0x4a, 0x25, 0x6f, 0x27, 0xd3, 0x95, 0x39, 0xd4, 0xd4, 0xaf, 0x4a, 0x97, 0xaa, 0x67, 0x09, 0x93, 0x8b, 0xc0, 0xc7, 0x88, 0x01, 0x41, 0x42, 0x26, 0x37, 0x46, 0xa2, 0xd5, 0x23, 0x2f, 0x18, 0x2b, 0x5b, 0x30, 0x89, 0x25, 0xbb, 0x11, 0x72, 0x65, 0x2b, 0x9a, 0x0a, 0x74, 0xaf, 0xdc, 0x84, 0x2f, 0x64, 0x92, 0x49, 0xa2, 0xd4, 0xcb, 0x87, 0xa4, 0xc1, 0xe5, 0x89, 0x29, 0xb3, 0xe8, 0x54, 0xfa, 0x00, 0xc0, 0xce, 0xf7, 0x04, 0x9b, 0xa8, 0xa7, 0xd3, 0x8d, 0x5a, 0x9b, 0xba, 0x28, 0x41, 0x5c, 0xa8, 0x4b, 0x62, 0xcb, 0x29, 0x67, 0x2b, 0x50, 0x68, 0xd5, 0x97, 0xeb, 0xeb, 0xcb, 0x35, 0x7b, 0xed, 0xfe, 0xbd, 0xeb, 0xea, 0x55, 0xad, 0x2e, 0xdc, 0xe2, 0x44, 0xb1, 0xc5, 0x2d, 0xba, 0xdb, 0xa6, 0x56, 0x9c, 0x49, 0x54, 0x93, 0x87, 0x88, 0xae, 0x92, 0x42, 0x5d, 0xd6, 0x0a, 0xe8, 0x0b, 0x52, 0xb5, 0x6d, 0x5b, 0x01, 0x4f, 0xaf, 0x67, 0xbb, 0xbe, 0x6f, 0x5d, 0xbf, 0x1f, 0x39, 0x13, 0xde, 0x54, 0xee, 0xb2, 0xd0, 0xd5, 0x39, 0xd0, 0xe2, 0x3e, 0x1a, 0xde, 0xc3, 0x0f, 0x0c, 0x3d, 0x27, 0x5d, 0x23, 0x19, 0xcf, 0x31, 0xeb, 0x46, 0x27, 0xec, 0x21, 0x97, 0x91, 0x90, 0xee, 0xa4, 0x4f, 0x75, 0xaf, 0xcf, 0x44, 0xc7, 0x31, 0x95, 0xa3, 0xa6, 0x68, 0xec, 0xe8, 0x4c, 0x03, 0x28, 0x44, 0xc1, 0xb7, 0x75, 0x77, 0xca, 0x98, 0x7f, 0x88, 0xbd, 0x4e, 0xf5, 0x39, 0xaf, 0x93, 0x58, 0xd5, 0x7b, 0xe5, 0xd7, 0x83, 0x92, 0x3d, 0x52, 0x45, 0x9b, 0xac, 0x63, 0xe6, 0x89, 0xd6, 0x9f, 0xff, 0x56, 0x54, 0xf2, 0x6f, 0x15, 0xc5, 0x65, 0xa5, 0x8f, 0xfd, 0x14, 0xbf, 0x15, 0x4b, 0x8f, 0x24, 0x76, 0x03, 0xee, 0xcc, 0x84, 0xa3, 0xbc, 0xa4, 0x3b, 0x6c, 0x15, 0xff, 0x5a, 0x2e, 0x06, 0x58, 0x30, 0xc4, 0x6a, 0x06, 0x04, 0x6b, 0x55, 0x00, 0x60, 0xe5, 0xda, 0xd3, 0x77, 0x49, 0x08, 0xd9, 0x5e, 0xb9, 0x0a, 0xb5, 0x57, 0xe0, 0xd1, 0x23, 0xf9, 0x07, 0xf2, 0x42, 0x24, 0xb0, \ No newline at end of file From 78900a757a1af8d65bbc4e7c42d44983f58bd5aa Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 8 Jan 2022 22:19:33 -0500 Subject: [PATCH 232/379] (enh) moonscript supports eval now --- src/api/moonscript.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/api/moonscript.c b/src/api/moonscript.c index 997bd4e84..713ea8416 100644 --- a/src/api/moonscript.c +++ b/src/api/moonscript.c @@ -59,6 +59,23 @@ static void setloaded(lua_State* l, char* name) lua_settop(l, top); } +static void evalMoonscript(tic_mem* tic, const char* code) { + tic_core* core = (tic_core*)tic; + lua_State* lua = core->currentVM; + + lua_getglobal(lua, "_ms_loadstring"); + + lua_pushstring(lua, code); + if (lua_pcall(lua, 1, 1, 0) != LUA_OK) + { + const char* msg = lua_tostring(lua, -1); + if (msg) + { + core->data->error(core->data->data, msg); + } + } +} + static bool initMoonscript(tic_mem* tic, const char* code) { tic_core* core = (tic_core*)tic; @@ -73,7 +90,7 @@ static bool initMoonscript(tic_mem* tic, const char* code) initLuaAPI(core); { - lua_State* moon = core->currentVM; + lua_State* moon = lua; lua_settop(moon, 0); @@ -91,6 +108,9 @@ static bool initMoonscript(tic_mem* tic, const char* code) return false; } + lua_setglobal(lua, "_ms_loadstring"); + lua_getglobal(lua, "_ms_loadstring"); + lua_pushstring(moon, code); if (lua_pcall(moon, 1, 1, 0) != LUA_OK) { @@ -183,7 +203,7 @@ tic_script_config MoonSyntaxConfig = }, .getOutline = getMoonOutline, - .eval = NULL, + .eval = evalMoonscript, .blockCommentStart = NULL, .blockCommentEnd = NULL, From 58e2175388422394d0dd8af37ec1fe874a90be55 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 9 Jan 2022 09:25:09 -0500 Subject: [PATCH 233/379] use a constant --- src/api/moonscript.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/api/moonscript.c b/src/api/moonscript.c index 713ea8416..95c4069a4 100644 --- a/src/api/moonscript.c +++ b/src/api/moonscript.c @@ -29,6 +29,8 @@ #if defined(TIC_BUILD_WITH_MOON) +static const char _ms_loadstring[] = "_ms_loadstring"; + static inline bool isalnum_(char c) {return isalnum(c) || c == '_';} #include "moonscript.h" @@ -63,7 +65,7 @@ static void evalMoonscript(tic_mem* tic, const char* code) { tic_core* core = (tic_core*)tic; lua_State* lua = core->currentVM; - lua_getglobal(lua, "_ms_loadstring"); + lua_getglobal(lua, _ms_loadstring); lua_pushstring(lua, code); if (lua_pcall(lua, 1, 1, 0) != LUA_OK) @@ -108,8 +110,8 @@ static bool initMoonscript(tic_mem* tic, const char* code) return false; } - lua_setglobal(lua, "_ms_loadstring"); - lua_getglobal(lua, "_ms_loadstring"); + lua_setglobal(lua, _ms_loadstring); + lua_getglobal(lua, _ms_loadstring); lua_pushstring(moon, code); if (lua_pcall(moon, 1, 1, 0) != LUA_OK) From e2e22e64bde40ca7ad80c423b78bd4b0d73d97b1 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 9 Jan 2022 09:46:05 -0500 Subject: [PATCH 234/379] faster drawTile, remove repeat clipping checks `drawTile` appears to be taking clipping into account, yet in setPixel for every single pixel we check the clipping individually... it seems this is not necessary. This adds a new `setPixelFast` that avoids the repeat checks. I see about a 4-5% increase in benchmarks for just sprite draws. --- src/core/draw.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/core/draw.c b/src/core/draw.c index 6f57e494f..b5fb5e747 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -67,6 +67,15 @@ static void setPixel(tic_core* core, s32 x, s32 y, u8 color) tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } +static void setPixelFast(tic_core* core, s32 x, s32 y, u8 color) +{ + const tic_vram* vram = &core->memory.ram.vram; + + // does not do any CLIP checking, the caller needs to do that first + + tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); +} + static u8 getPixel(tic_core* core, s32 x, s32 y) { return tic_api_peek4((tic_mem*)core, y * TIC80_WIDTH + x); @@ -129,7 +138,7 @@ static void drawRectBorder(tic_core* core, s32 x, s32 y, s32 width, s32 height, for(s32 px=sx; px < ex; px++, xx++) \ { \ u8 color = mapping[tic_tilesheet_gettilepix(tile, (X), (Y))];\ - if(color != TRANSPARENT_COLOR) setPixel(core, xx, y, color); \ + if(color != TRANSPARENT_COLOR) setPixelFast(core, xx, y, color); \ } \ } \ } while(0) From 4456087101faccb49516de3ce3d5cb7a515b2d82 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 9 Jan 2022 16:16:21 -0500 Subject: [PATCH 235/379] order langauges by alphabetical order --- src/core/languages.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/core/languages.c b/src/core/languages.c index 06dcd96e8..592fbd450 100644 --- a/src/core/languages.c +++ b/src/core/languages.c @@ -31,33 +31,35 @@ extern tic_script_config WrenSyntaxConfig; tic_script_config* Languages[] = { - #if defined (TIC_BUILD_WITH_LUA) - &LuaSyntaxConfig, - #endif + #if defined(TIC_BUILD_WITH_FENNEL) + &FennelSyntaxConfig, + #endif - #if defined(TIC_BUILD_WITH_MRUBY) - &MRubySyntaxConfig, + #if defined(TIC_BUILD_WITH_JS) + &JsSyntaxConfig, #endif - #if defined(TIC_BUILD_WITH_JS) - &JsSyntaxConfig, - #endif + #if defined (TIC_BUILD_WITH_LUA) + &LuaSyntaxConfig, + #endif - #if defined(TIC_BUILD_WITH_MOON) - &MoonSyntaxConfig, - #endif + #if defined(TIC_BUILD_WITH_MOON) + &MoonSyntaxConfig, + #endif - #if defined(TIC_BUILD_WITH_FENNEL) - &FennelSyntaxConfig, - #endif + // R for Ruby (is the name we display) + #if defined(TIC_BUILD_WITH_MRUBY) + &MRubySyntaxConfig, + #endif - #if defined(TIC_BUILD_WITH_SQUIRREL) - &SquirrelSyntaxConfig, - #endif - #if defined(TIC_BUILD_WITH_WREN) - &WrenSyntaxConfig, - #endif + #if defined(TIC_BUILD_WITH_SQUIRREL) + &SquirrelSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_WREN) + &WrenSyntaxConfig, + #endif - NULL}; + NULL}; From 7e8b971a7a76792ab82dc2544a6c7a2d38198bca Mon Sep 17 00:00:00 2001 From: nesbox Date: Mon, 10 Jan 2022 09:28:55 +0300 Subject: [PATCH 236/379] master branch renamed to main #1805 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 972a39a9a..f78fa455c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ To make a retro styled game, the whole process of creation and execution takes p # Binary Downloads You can download compiled versions for the major operating systems directly from our [releases page](https://github.com/nesbox/TIC-80/releases). ## Nightly builds -Can be downloaded from [nightly builds](https://nightly.link/nesbox/TIC-80/workflows/build/master) page or from the [Github Actions](https://github.com/nesbox/TIC-80/actions?query=branch%3Amaster) page. +Can be downloaded from [nightly builds](https://nightly.link/nesbox/TIC-80/workflows/build/main) page or from the [Github Actions](https://github.com/nesbox/TIC-80/actions?query=branch%3Amain) page. # Pro Version To help support TIC-80 development, we have a [PRO Version](https://nesbox.itch.io/tic80). @@ -52,7 +52,7 @@ The community also hangs out and discusses on [Telegram](https://t.me/tic80) or # Contributing You can contribute by reporting a bug or requesting a new feature on our [issues page](https://github.com/nesbox/TIC-80/issues). -Keep in mind when engaging on a discussion to follow our [Code of Conduct](https://github.com/nesbox/TIC-80/blob/master/CODE_OF_CONDUCT.md). +Keep in mind when engaging on a discussion to follow our [Code of Conduct](https://github.com/nesbox/TIC-80/blob/main/CODE_OF_CONDUCT.md). You can also contribute by reviewing or improving our [wiki](https://github.com/nesbox/TIC-80/wiki). The wiki holds TIC-80 documentation, code snippets and game development tutorials. From 7364cbbad4cfee4897a5deb8ae00700fad51d0f0 Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 11 Jan 2022 09:57:02 +0300 Subject: [PATCH 237/379] Revert "Merge pull request #1804 from joshgoebel/alpha_ordering_languages" This reverts commit 612fc62178e747a7cb793af0bcf127871cd0f3ba, reversing changes made to c3efe280aa56b57d23ef68e17999c53d2f0974cf. --- src/core/languages.c | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/core/languages.c b/src/core/languages.c index 592fbd450..06dcd96e8 100644 --- a/src/core/languages.c +++ b/src/core/languages.c @@ -31,35 +31,33 @@ extern tic_script_config WrenSyntaxConfig; tic_script_config* Languages[] = { - #if defined(TIC_BUILD_WITH_FENNEL) - &FennelSyntaxConfig, - #endif - - #if defined(TIC_BUILD_WITH_JS) - &JsSyntaxConfig, - #endif + #if defined (TIC_BUILD_WITH_LUA) + &LuaSyntaxConfig, + #endif - #if defined (TIC_BUILD_WITH_LUA) - &LuaSyntaxConfig, - #endif - - #if defined(TIC_BUILD_WITH_MOON) - &MoonSyntaxConfig, - #endif - - // R for Ruby (is the name we display) #if defined(TIC_BUILD_WITH_MRUBY) &MRubySyntaxConfig, #endif + #if defined(TIC_BUILD_WITH_JS) + &JsSyntaxConfig, + #endif - #if defined(TIC_BUILD_WITH_SQUIRREL) - &SquirrelSyntaxConfig, - #endif + #if defined(TIC_BUILD_WITH_MOON) + &MoonSyntaxConfig, + #endif - #if defined(TIC_BUILD_WITH_WREN) - &WrenSyntaxConfig, - #endif + #if defined(TIC_BUILD_WITH_FENNEL) + &FennelSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_SQUIRREL) + &SquirrelSyntaxConfig, + #endif + + #if defined(TIC_BUILD_WITH_WREN) + &WrenSyntaxConfig, + #endif - NULL}; + NULL}; From 0a27e2cff849803477783ce984926e62cacf1fbe Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 12 Jan 2022 15:44:31 +0300 Subject: [PATCH 238/379] new gamepad mapping menu #1748 --- src/defines.h | 30 +++--- src/studio/screens/menu.c | 11 ++- src/studio/screens/menu.h | 1 + src/studio/studio.c | 202 +++++++++++++++++++++++++------------- src/tic.h | 3 +- 5 files changed, 160 insertions(+), 87 deletions(-) diff --git a/src/defines.h b/src/defines.h index 694d0651a..3b076f2d3 100644 --- a/src/defines.h +++ b/src/defines.h @@ -48,19 +48,19 @@ #define _BITCLEAR(a,b) ((a) &= ~(1ULL<<(b))) #define _BITFLIP(a,b) ((a) ^= (1ULL<<(b))) -#define REP0(X) -#define REP1(X) X -#define REP2(X) REP1(X) X -#define REP3(X) REP2(X) X -#define REP4(X) REP3(X) X -#define REP5(X) REP4(X) X -#define REP6(X) REP5(X) X -#define REP7(X) REP6(X) X -#define REP8(X) REP7(X) X -#define REP9(X) REP8(X) X -#define REP10(X) REP9(X) X +#define REP0(...) +#define REP1(...) __VA_ARGS__ +#define REP2(...) REP1(__VA_ARGS__) __VA_ARGS__ +#define REP3(...) REP2(__VA_ARGS__) __VA_ARGS__ +#define REP4(...) REP3(__VA_ARGS__) __VA_ARGS__ +#define REP5(...) REP4(__VA_ARGS__) __VA_ARGS__ +#define REP6(...) REP5(__VA_ARGS__) __VA_ARGS__ +#define REP7(...) REP6(__VA_ARGS__) __VA_ARGS__ +#define REP8(...) REP7(__VA_ARGS__) __VA_ARGS__ +#define REP9(...) REP8(__VA_ARGS__) __VA_ARGS__ +#define REP10(...) REP9(__VA_ARGS__) __VA_ARGS__ -#define REP(HUNDREDS,TENS,ONES,X) \ - REP##HUNDREDS(REP10(REP10(X))) \ - REP##TENS(REP10(X)) \ - REP##ONES(X) +#define REP(HUNDREDS,TENS,ONES,...) \ + REP##HUNDREDS(REP10(REP10(__VA_ARGS__))) \ + REP##TENS(REP10(__VA_ARGS__)) \ + REP##ONES(__VA_ARGS__) diff --git a/src/studio/screens/menu.c b/src/studio/screens/menu.c index ab8828c91..62a817291 100644 --- a/src/studio/screens/menu.c +++ b/src/studio/screens/menu.c @@ -169,7 +169,7 @@ static void startDone(Menu *menu) static void closeDone(Menu *menu) { resetMovie(menu, &menu->anim.idle); - menu->items[menu->pos].handler(menu->data); + menu->items[menu->pos].handler(menu->data ? menu->data : &menu->pos); } static void backDone(Menu *menu) @@ -367,7 +367,7 @@ static void drawMenu(Menu* menu, s32 x, s32 y) { drawOptionArrow(menu, it->option, rect.x + menu->maxwidth.item + TIC_FONT_WIDTH, rect.y, tic_icon_left, -1); drawOptionArrow(menu, it->option, - rect.x + menu->maxwidth.item + menu->maxwidth.option + 2 * TIC_FONT_WIDTH, rect.y, tic_icon_right, +1); + rect.x + menu->maxwidth.item + it->option->width + 2 * TIC_FONT_WIDTH, rect.y, tic_icon_right, +1); printShadow(tic, it->option->values[it->option->pos], rect.x + menu->maxwidth.item + 2 * TIC_FONT_WIDTH, rect.y, tic_color_yellow); @@ -473,9 +473,6 @@ void studio_menu_tick(Menu* menu) { tic_mem* tic = menu->tic; - if(menu->ticks == 0) - playSystemSfx(0); - processAnim(menu); // process scroll @@ -547,6 +544,10 @@ void studio_menu_init(Menu* menu, const MenuItem* items, s32 rows, s32 pos, s32 for(const char **opt = it->option->values, **end = opt + it->option->count; opt != end; ++opt) { s32 len = strlen(*opt) * TIC_FONT_WIDTH; + + if(it->option->width < len) + it->option->width = len; + if(menu->maxwidth.option < len) menu->maxwidth.option = len; } diff --git a/src/studio/screens/menu.h b/src/studio/screens/menu.h index 8001d2996..5c9a79731 100644 --- a/src/studio/screens/menu.h +++ b/src/studio/screens/menu.h @@ -36,6 +36,7 @@ typedef struct s32 count; s32(*get)(); void(*set)(s32); + s32 width; s32 pos; } MenuOption; diff --git a/src/studio/studio.c b/src/studio/studio.c index 631d18ee5..daff6c564 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -188,6 +188,13 @@ static struct tic_net* net; #endif + struct + { + tic_mapping mapping; + s32 index; + s32 key; + } gamepads; + Start* start; Run* run; Menu* menu; @@ -231,6 +238,11 @@ static struct .text = "\0", }, + .gamepads = + { + .key = -1, + }, + .video = { .record = false, @@ -1260,81 +1272,113 @@ void showGameMenu() studio_menu_init(impl.menu, GameMenu, Count, Count - 4, 0, NULL, NULL); } -static void showOptionsMenu() +static void showOptionsMenuPos(s32 pos) { - enum{Count = COUNT_OF(OptionMenu)}; studio_menu_init(impl.menu, OptionMenu, - Count, Count - 4, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); -} - -static const char* KeysList[] = -{ - "...", - "A", "B", "C", "D", "E", "F", "G", "H", - "I", "J", "K", "L", "M", "N", "O", "P", - "Q", "R", "S", "T", "U", "V", "W", "X", - "Y", "Z", "0", "1", "2", "3", "4", "5", - "6", "7", "8", "9", "-", "=", "[", "]", - "\\", ";", "'", "`", ",", ".", "/", "SPACE", - "TAB", "RET", "BACKS","DEL", "INS", "PGUP", "PGDN", "HOME", - "END", "UP", "DOWN", "LEFT", "RIGHT","CAPS", "CTRL", "SHIFT", - "ALT", "ESC", "F1", "F2", "F3", "F4", "F5", "F6", - "F7", "F8", "F9", "F10", "F11", "F12", -}; - -static tic_mapping GamepadMapping; - -#define OPTION_KEY(KEY) \ - \ -enum{KEY ## KeyIndex = __COUNTER__}; \ - \ -static s32 option ## KEY ## KeyGet() \ -{ \ - return GamepadMapping.data[KEY ## KeyIndex]; \ -} \ - \ -static void option ## KEY ## KeySet(s32 pos) \ -{ \ - GamepadMapping.data[KEY ## KeyIndex] = pos; \ -} \ - \ -static MenuOption KEY ## KeyOption = \ -{ \ - .values = KeysList, \ - .count = COUNT_OF(KeysList), \ - option ## KEY ## KeyGet, \ - option ## KEY ## KeySet, \ -}; + COUNT_OF(OptionMenu), pos, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); +} -OPTION_KEY(Up) -OPTION_KEY(Down) -OPTION_KEY(Left) -OPTION_KEY(Right) -OPTION_KEY(A) -OPTION_KEY(B) -OPTION_KEY(X) -OPTION_KEY(Y) +static void showOptionsMenu() +{ + showOptionsMenuPos(COUNT_OF(OptionMenu) - 4); +} static void saveGamepadMenu() { - impl.config->data.options.mapping = GamepadMapping; - showOptionsMenu(); + impl.config->data.options.mapping = impl.gamepads.mapping; + showOptionsMenuPos(COUNT_OF(OptionMenu) - 3); } static void resetGamepadMenu(); +static char MappingItems[TIC_BUTTONS][sizeof "RIGHT - RIGHT"]; + +static const char* const ButtonLabels[] = +{ + "UP", + "DOWN", + "LEFT", + "RIGHT", + "A", + "B", + "X", + "Y", +}; + +enum{KeyMappingStart = 2}; + +static void assignMapping(void* data) +{ + impl.gamepads.key = *(s32*)data - KeyMappingStart; + + static const char Fmt[] = "to assign to (%s) button..."; + static char str[sizeof Fmt + STRLEN("RIGHT")]; + + static const MenuItem AssignKeyMenu[] = + { + {"Please, press a key you want"}, + {str}, + }; + + sprintf(str, Fmt, ButtonLabels[impl.gamepads.key]); + + studio_menu_init(impl.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); +} + +static void initGamepadButtons() +{ + static const char* const KeysList[] = + { + "...", + "A", "B", "C", "D", "E", "F", "G", "H", + "I", "J", "K", "L", "M", "N", "O", "P", + "Q", "R", "S", "T", "U", "V", "W", "X", + "Y", "Z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "-", "=", "[", "]", + "\\", ";", "'", "`", ",", ".", "/", "SPCE", + "TAB", "RET", "BACKS","DEL", "INS", "PGUP", "PGDN", "HOME", + "END", "UP", "DOWN", "LEFT", "RIGHT","CAPS", "CTRL", "SHIFT", + "ALT", "ESC", "F1", "F2", "F3", "F4", "F5", "F6", + "F7", "F8", "F9", "F10", "F11", "F12", + }; + + for(s32 i = 0, index = impl.gamepads.index * TIC_BUTTONS; i != TIC_BUTTONS; ++i) + sprintf(MappingItems[i], "%-5s - %-5s", ButtonLabels[i], KeysList[impl.gamepads.mapping.data[index++]]); +} + +static s32 optionGamepadGet() +{ + return impl.gamepads.index; +} + +static void optionmappinget(s32 pos) +{ + impl.gamepads.index = pos; + initGamepadButtons(); +} + +static MenuOption GamepadOption = +{ + OPTION_VALUES({"1", "2", "3", "4"}), + optionGamepadGet, + optionmappinget, +}; + static void initGamepadMenu() { static const MenuItem GamepadMenu[] = { - {"UP", NULL, &UpKeyOption}, - {"DOWN", NULL, &DownKeyOption}, - {"LEFT", NULL, &LeftKeyOption}, - {"RIGHT", NULL, &RightKeyOption}, - {"A", NULL, &AKeyOption}, - {"B", NULL, &BKeyOption}, - {"X", NULL, &XKeyOption}, - {"Y", NULL, &YKeyOption}, + {"GAMEPAD", NULL, &GamepadOption}, + {""}, + + {MappingItems[0], assignMapping}, + {MappingItems[1], assignMapping}, + {MappingItems[2], assignMapping}, + {MappingItems[3], assignMapping}, + {MappingItems[4], assignMapping}, + {MappingItems[5], assignMapping}, + {MappingItems[6], assignMapping}, + {MappingItems[7], assignMapping}, {""}, {"SAVE MAPPING", saveGamepadMenu}, @@ -1342,21 +1386,28 @@ static void initGamepadMenu() {"BACK", showOptionsMenu, .back = true}, }; - GamepadMapping = getConfig()->options.mapping; + initGamepadButtons(); studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), - 0, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); + impl.gamepads.key < 0 ? KeyMappingStart : impl.gamepads.key + KeyMappingStart, + COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); + + impl.gamepads.key = -1; } static void resetGamepadMenu() { - tic_sys_default_mapping(&GamepadMapping); + impl.gamepads.index = 0; + ZEROMEM(impl.gamepads.mapping); + tic_sys_default_mapping(&impl.gamepads.mapping); initGamepadMenu(); } static void showGamepadMenu() { - GamepadMapping = getConfig()->options.mapping; + impl.gamepads.index = 0; + impl.gamepads.mapping = getConfig()->options.mapping; + initGamepadMenu(); } @@ -1464,6 +1515,8 @@ void confirmDialog(const char** text, s32 rows, ConfirmCallback callback, void* studio_menu_init(impl.menu, items, count, count - 2, 0, NULL, MOVE((ConfirmData){callback, data})); + + playSystemSfx(0); } } @@ -1748,7 +1801,7 @@ static void switchBank(s32 bank) #endif -static void processShortcuts() +static void processStudioShortcuts() { tic_mem* tic = impl.studio.tic; @@ -1860,6 +1913,23 @@ static void processShortcuts() } } +static void processShortcuts() +{ + tic_mem* tic = impl.studio.tic; + + if(impl.gamepads.key < 0) + processStudioShortcuts(); + else + { + tic_key key = *tic->ram.input.keyboard.keys; + if(key > tic_key_unknown) + { + impl.gamepads.mapping.data[impl.gamepads.index * TIC_BUTTONS + impl.gamepads.key] = key; + initGamepadMenu(); + } + } +} + #if defined(BUILD_EDITORS) static void reloadConfirm(bool yes, void* data) { diff --git a/src/tic.h b/src/tic.h index 860ba4267..9935e1c7e 100644 --- a/src/tic.h +++ b/src/tic.h @@ -99,6 +99,7 @@ #define TIC_CODE_SIZE (TIC_BANK_SIZE * TIC_BANKS) +#define TIC_BUTTONS 8 #define TIC_GAMEPADS (sizeof(tic80_gamepads) / sizeof(tic80_gamepad)) #define SFX_NOTES {"C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-"} @@ -509,7 +510,7 @@ typedef struct typedef struct { - u8 data[sizeof(tic80_gamepads) * BITS_IN_BYTE]; + u8 data[TIC_GAMEPADS * TIC_BUTTONS]; } tic_mapping; typedef union From 94d7e79b46375f6b663bad2ada261cb81f48c91b Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 12 Jan 2022 19:27:07 +0300 Subject: [PATCH 239/379] function names fix #1748 --- src/studio/studio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index daff6c564..2341fa70e 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1351,7 +1351,7 @@ static s32 optionGamepadGet() return impl.gamepads.index; } -static void optionmappinget(s32 pos) +static void optionGamepadSet(s32 pos) { impl.gamepads.index = pos; initGamepadButtons(); @@ -1361,7 +1361,7 @@ static MenuOption GamepadOption = { OPTION_VALUES({"1", "2", "3", "4"}), optionGamepadGet, - optionmappinget, + optionGamepadSet, }; static void initGamepadMenu() From 06fde1279677273856c1daf9f2fa22e337daba3d Mon Sep 17 00:00:00 2001 From: nesbox Date: Sat, 15 Jan 2022 22:39:51 +0300 Subject: [PATCH 240/379] custom game menu #1748 --- src/api.h | 8 +- src/api/js.c | 16 ++- src/api/lua.c | 16 ++- src/api/mruby.c | 16 ++- src/api/squirrel.c | 16 ++- src/api/wren.c | 34 +++-- src/core/core.c | 8 +- src/studio/editors/code.c | 4 +- src/studio/screens/console.c | 37 ++---- src/studio/screens/console.h | 1 - src/studio/screens/surf.c | 4 +- src/studio/studio.c | 240 ++++++++++++++++++++--------------- src/studio/studio.h | 6 +- src/tic.h | 2 +- src/tools.c | 12 +- src/tools.h | 2 +- 16 files changed, 233 insertions(+), 189 deletions(-) diff --git a/src/api.h b/src/api.h index 9e41c0604..9f6f42e82 100644 --- a/src/api.h +++ b/src/api.h @@ -53,6 +53,7 @@ typedef struct tic_mem tic_mem; typedef void(*tic_tick)(tic_mem* memory); typedef void(*tic_scanline)(tic_mem* memory, s32 row, void* data); typedef void(*tic_border)(tic_mem* memory, s32 row, void* data); +typedef void(*tic_gamemenu)(tic_mem* memory, s32 index, void* data); typedef struct { @@ -62,8 +63,9 @@ typedef struct typedef struct { - tic_scanline scanline; - tic_border border; + tic_scanline scanline; + tic_border border; + tic_gamemenu gamemenu; void* data; } tic_blit_callback; @@ -135,10 +137,12 @@ enum #define SCN_FN "SCN" #define OVR_FN "OVR" // deprecated since v1.0 #define BDR_FN "BDR" +#define MENU_FN "MENU" #define TIC_CALLBACK_LIST(macro) \ macro(TIC, TIC_FN "()", "Main function. It's called at " DEF2STR(TIC80_FRAMERATE) \ "fps (" DEF2STR(TIC80_FRAMERATE) " times every second).") \ + macro(MENU, MENU_FN "(index)", "Game Menu handler.") \ macro(SCN, SCN_FN "(row)", "Allows you to execute code between the drawing of each scanline, " \ "for example, to manipulate the palette.") \ macro(BDR, BDR_FN "(row)", "Allows you to execute code between the drawing of each fullscreen scanline, " \ diff --git a/src/api/js.c b/src/api/js.c index 9c1def6a3..c7ad8b96b 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -1040,14 +1040,14 @@ static void callJavascriptTick(tic_mem* tic) } } -static void callJavascriptScanlineName(tic_mem* tic, s32 row, void* data, const char* name) +static void callJavascriptIntCallback(tic_mem* tic, s32 value, void* data, const char* name) { tic_core* core = (tic_core*)tic; duk_context* duk = core->currentVM; if(duk_get_global_string(duk, name)) { - duk_push_int(duk, row); + duk_push_int(duk, value); if(duk_pcall(duk, 1) != 0) core->data->error(core->data->data, duk_safe_to_stacktrace(duk, -1)); @@ -1058,15 +1058,20 @@ static void callJavascriptScanlineName(tic_mem* tic, s32 row, void* data, const static void callJavascriptScanline(tic_mem* tic, s32 row, void* data) { - callJavascriptScanlineName(tic, row, data, SCN_FN); + callJavascriptIntCallback(tic, row, data, SCN_FN); // try to call old scanline - callJavascriptScanlineName(tic, row, data, "scanline"); + callJavascriptIntCallback(tic, row, data, "scanline"); } static void callJavascriptBorder(tic_mem* tic, s32 row, void* data) { - callJavascriptScanlineName(tic, row, data, BDR_FN); + callJavascriptIntCallback(tic, row, data, BDR_FN); +} + +static void callJavascriptGameMenu(tic_mem* tic, s32 index, void* data) +{ + callJavascriptIntCallback(tic, index, data, MENU_FN); } static const char* const JsKeywords [] = @@ -1156,6 +1161,7 @@ const tic_script_config JsSyntaxConfig = { .scanline = callJavascriptScanline, .border = callJavascriptBorder, + .gamemenu = callJavascriptGameMenu, }, .getOutline = getJsOutline, diff --git a/src/api/lua.c b/src/api/lua.c index 5d1856174..025cee6b7 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -1553,7 +1553,7 @@ void callLuaTick(tic_mem* tic) } } -void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name) +void callLuaIntCallback(tic_mem* tic, s32 value, void* data, const char* name) { tic_core* core = (tic_core*)tic; lua_State* lua = core->currentVM; @@ -1563,7 +1563,7 @@ void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name) lua_getglobal(lua, name); if(lua_isfunction(lua, -1)) { - lua_pushinteger(lua, row); + lua_pushinteger(lua, value); if(docall(lua, 1, 0) != LUA_OK) core->data->error(core->data->data, lua_tostring(lua, -1)); } @@ -1573,15 +1573,20 @@ void callLuaScanlineName(tic_mem* tic, s32 row, void* data, const char* name) void callLuaScanline(tic_mem* tic, s32 row, void* data) { - callLuaScanlineName(tic, row, data, SCN_FN); + callLuaIntCallback(tic, row, data, SCN_FN); // try to call old scanline - callLuaScanlineName(tic, row, data, "scanline"); + callLuaIntCallback(tic, row, data, "scanline"); } void callLuaBorder(tic_mem* tic, s32 row, void* data) { - callLuaScanlineName(tic, row, data, BDR_FN); + callLuaIntCallback(tic, row, data, BDR_FN); +} + +void callLuaGameMenu(tic_mem* tic, s32 index, void* data) +{ + callLuaIntCallback(tic, index, data, MENU_FN); } static const char* const LuaKeywords [] = @@ -1681,6 +1686,7 @@ tic_script_config LuaSyntaxConfig = { .scanline = callLuaScanline, .border = callLuaBorder, + .gamemenu = callLuaGameMenu, }, .getOutline = getLuaOutline, diff --git a/src/api/mruby.c b/src/api/mruby.c index 1486bdb71..bead1d97a 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -1085,28 +1085,33 @@ static void callMRubyTick(tic_mem* tic) } } -static void callMRubyScanlineName(tic_mem* memory, s32 row, void* data, const char* name) +static void callMRubyIntCallback(tic_mem* memory, s32 value, void* data, const char* name) { tic_core* machine = (tic_core*)memory; mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; if (mrb && mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, name))) { - mrb_funcall(mrb, mrb_top_self(mrb), name, 1, mrb_fixnum_value(row)); + mrb_funcall(mrb, mrb_top_self(mrb), name, 1, mrb_fixnum_value(value)); catcherr(machine); } } static void callMRubyScanline(tic_mem* memory, s32 row, void* data) { - callMRubyScanlineName(memory, row, data, SCN_FN); + callMRubyIntCallback(memory, row, data, SCN_FN); - callMRubyScanlineName(memory, row, data, "scanline"); + callMRubyIntCallback(memory, row, data, "scanline"); } static void callMRubyBorder(tic_mem* memory, s32 row, void* data) { - callMRubyScanlineName(memory, row, data, BDR_FN); + callMRubyIntCallback(memory, row, data, BDR_FN); +} + +static void callMRubyGameMenu(tic_mem* memory, s32 index, void* data) +{ + callMRubyIntCallback(memory, index, data, MENU_FN); } /** @@ -1203,6 +1208,7 @@ const tic_script_config MRubySyntaxConfig = { .scanline = callMRubyScanline, .border = callMRubyBorder, + .gamemenu = callMRubyGameMenu, }, .getOutline = getMRubyOutline, diff --git a/src/api/squirrel.c b/src/api/squirrel.c index 078964c2c..e927a07b7 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -1663,7 +1663,7 @@ static void callSquirrelTick(tic_mem* tic) } } -static void callSquirrelScanlineName(tic_mem* tic, s32 row, void* data, const char* name) +static void callSquirrelIntCallback(tic_mem* tic, s32 value, void* data, const char* name) { tic_core* core = (tic_core*)tic; HSQUIRRELVM vm = core->currentVM; @@ -1675,7 +1675,7 @@ static void callSquirrelScanlineName(tic_mem* tic, s32 row, void* data, const ch if (SQ_SUCCEEDED(sq_get(vm, -2))) { sq_pushroottable(vm); - sq_pushinteger(vm, row); + sq_pushinteger(vm, value); if(SQ_FAILED(sq_call(vm, 2, SQFalse, SQTrue))) { @@ -1695,15 +1695,20 @@ static void callSquirrelScanlineName(tic_mem* tic, s32 row, void* data, const ch static void callSquirrelScanline(tic_mem* tic, s32 row, void* data) { - callSquirrelScanlineName(tic, row, data, SCN_FN); + callSquirrelIntCallback(tic, row, data, SCN_FN); // try to call old scanline - callSquirrelScanlineName(tic, row, data, "scanline"); + callSquirrelIntCallback(tic, row, data, "scanline"); } static void callSquirrelBorder(tic_mem* tic, s32 row, void* data) { - callSquirrelScanlineName(tic, row, data, BDR_FN); + callSquirrelIntCallback(tic, row, data, BDR_FN); +} + +static void callSquirrelGameMenu(tic_mem* tic, s32 index, void* data) +{ + callSquirrelIntCallback(tic, index, data, MENU_FN); } static const char* const SquirrelKeywords [] = @@ -1819,6 +1824,7 @@ tic_script_config SquirrelSyntaxConfig = { .scanline = callSquirrelScanline, .border = callSquirrelBorder, + .gamemenu = callSquirrelGameMenu, }, .getOutline = getSquirrelOutline, diff --git a/src/api/wren.c b/src/api/wren.c index 92b21099d..0c54c95f1 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -37,6 +37,7 @@ static WrenHandle* new_handle = NULL; static WrenHandle* update_handle = NULL; static WrenHandle* scanline_handle = NULL; static WrenHandle* border_handle = NULL; +static WrenHandle* gamemenu_handle = NULL; static WrenHandle* overline_handle = NULL; static bool loaded = false; @@ -175,6 +176,7 @@ class TIC {\n\ " TIC_FN "(){}\n\ " SCN_FN "(row){}\n\ " BDR_FN "(row){}\n\ + " MENU_FN "(index){}\n\ " OVR_FN "(){}\n\ }\n"; @@ -217,6 +219,7 @@ static void closeWren(tic_mem* tic) wrenReleaseHandle(core->currentVM, update_handle); wrenReleaseHandle(core->currentVM, scanline_handle); wrenReleaseHandle(core->currentVM, border_handle); + wrenReleaseHandle(core->currentVM, gamemenu_handle); wrenReleaseHandle(core->currentVM, overline_handle); if (game_class != NULL) { @@ -1524,6 +1527,7 @@ static bool initWren(tic_mem* tic, const char* code) update_handle = wrenMakeCallHandle(vm, TIC_FN "()"); scanline_handle = wrenMakeCallHandle(vm, SCN_FN "(_)"); border_handle = wrenMakeCallHandle(vm, BDR_FN "(_)"); + gamemenu_handle = wrenMakeCallHandle(vm, MENU_FN "(_)"); overline_handle = wrenMakeCallHandle(vm, OVR_FN "()"); // create game class @@ -1572,7 +1576,7 @@ static void callWrenTick(tic_mem* tic) } } -static void callWrenScanline(tic_mem* tic, s32 row, void* data) +static void callWrenIntCallback(tic_mem* tic, s32 value, WrenHandle* handle, void* data) { tic_core* core = (tic_core*)tic; WrenVM* vm = core->currentVM; @@ -1581,23 +1585,24 @@ static void callWrenScanline(tic_mem* tic, s32 row, void* data) { wrenEnsureSlots(vm, 2); wrenSetSlotHandle(vm, 0, game_class); - wrenSetSlotDouble(vm, 1, row); - wrenCall(vm, scanline_handle); + wrenSetSlotDouble(vm, 1, value); + wrenCall(vm, handle); } } +static void callWrenScanline(tic_mem* tic, s32 row, void* data) +{ + callWrenIntCallback(tic, row, scanline_handle, data); +} + static void callWrenBorder(tic_mem* tic, s32 row, void* data) { - tic_core* core = (tic_core*)tic; - WrenVM* vm = core->currentVM; + callWrenIntCallback(tic, row, border_handle, data); +} - if(vm && game_class) - { - wrenEnsureSlots(vm, 2); - wrenSetSlotHandle(vm, 0, game_class); - wrenSetSlotDouble(vm, 1, row); - wrenCall(vm, border_handle); - } +static void callWrenGameMenu(tic_mem* tic, s32 index, void* data) +{ + callWrenIntCallback(tic, index, gamemenu_handle, data); } static const char* const WrenKeywords [] = @@ -1685,8 +1690,9 @@ tic_script_config WrenSyntaxConfig = .tick = callWrenTick, .callback = { - .scanline = callWrenScanline, - .border = callWrenBorder, + .scanline = callWrenScanline, + .border = callWrenBorder, + .gamemenu = callWrenGameMenu, }, .getOutline = getWrenOutline, diff --git a/src/core/core.c b/src/core/core.c index 9096e0d3c..531ac6842 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -217,12 +217,12 @@ static bool compareMetatag(const char* code, const char* tag, const char* value, { bool result = false; - const char* str = tic_tool_metatag(code, tag, comment); + char* str = tic_tool_metatag(code, tag, comment); if (str) { result = strcmp(str, value) == 0; - free((void*)str); + free(str); } return result; @@ -242,11 +242,11 @@ const tic_script_config* tic_core_script_config(tic_mem* memory) static void updateSaveid(tic_mem* memory) { memset(memory->saveid, 0, sizeof memory->saveid); - const char* saveid = tic_tool_metatag(memory->cart.code.data, "saveid", tic_core_script_config(memory)->singleComment); + char* saveid = tic_tool_metatag(memory->cart.code.data, "saveid", tic_core_script_config(memory)->singleComment); if (saveid) { strncpy(memory->saveid, saveid, TIC_SAVEID_SIZE - 1); - free((void*)saveid); + free(saveid); } } diff --git a/src/studio/editors/code.c b/src/studio/editors/code.c index 452ef48df..c097dfa9c 100644 --- a/src/studio/editors/code.c +++ b/src/studio/editors/code.c @@ -2134,7 +2134,7 @@ static void drawCodeToolbar(Code* code) switch(i) { case TEXT_RUN_CODE: - runProject(); + runGame(); break; default: { @@ -2169,7 +2169,7 @@ static void tick(Code* code) switch(code->mode) { - case TEXT_RUN_CODE: runProject(); break; + case TEXT_RUN_CODE: runGame(); break; case TEXT_DRAG_CODE: textDragTick(code); break; case TEXT_EDIT_MODE: textEditTick(code); break; case TEXT_FIND_MODE: textFindTick(code); break; diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index f12792b57..8814ec7ef 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -680,8 +680,6 @@ static void onLoadDemoCommandConfirmed(Console* console, tic_script_config* scri void* data = NULL; s32 size = 0; - console->showGameMenu = false; - { char path[1024]; getDemoCartPath(path, script); @@ -778,8 +776,6 @@ static void loadByHashDone(const u8* buffer, s32 size, void* data) FREE(loadByHashData->section); FREE(loadByHashData); - console->showGameMenu = true; - commandDone(console); } @@ -884,7 +880,6 @@ static void onLoadCommandConfirmed(Console* console) } else { - console->showGameMenu = false; s32 size = 0; void* data = strcmp(name, CONFIG_TIC_PATH) == 0 ? tic_fs_loadroot(console->fs, name, &size) @@ -1457,13 +1452,6 @@ static void onInstallDemosCommand(Console* console) commandDone(console); } -static void onGameMenuCommand(Console* console) -{ - console->showGameMenu = false; - showGameMenu(); - commandDone(console); -} - static void onSurfCommand(Console* console) { gotoSurf(); @@ -2210,16 +2198,20 @@ static CartSaveResult saveCartName(Console* console, const char* name) const char* comment = tic_core_script_config(tic)->singleComment; - const char* title = tic_tool_metatag(tic->cart.code.data, "title", comment); + char* title = tic_tool_metatag(tic->cart.code.data, "title", comment); if(title) + { drawShadowText(tic, title, 0, 0, tic_color_white, Scale); + free(title); + } - const char* author = tic_tool_metatag(tic->cart.code.data, "author", comment); + char* author = tic_tool_metatag(tic->cart.code.data, "author", comment); if(author) { char buf[TICNAME_MAX]; snprintf(buf, sizeof buf, "by %s", author); drawShadowText(tic, buf, 0, Row, tic_color_grey, Scale); + free(author); } u32* ptr = img.values + PaddingTop * CoverWidth + PaddingLeft; @@ -2336,15 +2328,14 @@ static void onRunCommand(Console* console) { commandDone(console); - runProject(); + runGame(); } static void onResumeCommand(Console* console) { commandDone(console); - tic_core_resume(console->tic); - resumeRunMode(); + resumeGame(); } static void onEvalCommand(Console* console) @@ -2658,12 +2649,6 @@ static const char HelpUsage[] = "help [" NULL, \ onSurfCommand) \ \ - macro("menu", \ - NULL, \ - "show game menu where you can setup keyboard/gamepad buttons mapping.", \ - NULL, \ - onGameMenuCommand) \ - \ ADDGET_FILE(macro) static struct Command @@ -3768,10 +3753,7 @@ static void tick(Console* console) { if(console->tickCounter >= (u32)(console->args.skip ? 1 : TIC80_FRAMERATE)) { - if(!console->args.skip) - console->showGameMenu = true; - - runProject(); + runGame(); start->embed = false; studioRomLoaded(); @@ -3905,7 +3887,6 @@ void initConsole(Console* console, tic_mem* tic, tic_fs* fs, tic_net* net, Confi .color = console->color, .fs = fs, .net = net, - .showGameMenu = false, .args = args, .desc = console->desc, }; diff --git a/src/studio/screens/console.h b/src/studio/screens/console.h index 1142467ea..9964dd8d6 100644 --- a/src/studio/screens/console.h +++ b/src/studio/screens/console.h @@ -91,7 +91,6 @@ struct Console u32 tickCounter; bool active; - bool showGameMenu; StartArgs args; struct diff --git a/src/studio/screens/surf.c b/src/studio/screens/surf.c index aa9eaf21c..48cb66a0e 100644 --- a/src/studio/screens/surf.c +++ b/src/studio/screens/surf.c @@ -662,7 +662,7 @@ static void changeDirectory(Surf* surf, const char* name) static void onCartLoaded(void* data) { - runGameFromSurf(); + runGame(); } static void onPlayCart(Surf* surf) @@ -676,7 +676,7 @@ static void onPlayCart(Surf* surf) else { surf->console->load(surf->console, item->name); - runGameFromSurf(); + runGame(); } } diff --git a/src/studio/studio.c b/src/studio/studio.c index 2341fa70e..61b4f4a52 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -200,6 +200,12 @@ static struct Menu* menu; Config* config; + struct + { + MenuItem* items; + s32 count; + } gameMenu; + tic_fs* fs; s32 samplerate; @@ -1037,20 +1043,9 @@ void gotoCode() setStudioMode(TIC_CODE_MODE); } -void runGameFromSurf() -{ - tic_api_reset(impl.studio.tic); - setStudioMode(TIC_RUN_MODE); - impl.prevMode = TIC_SURF_MODE; -} - -void resumeRunMode() -{ - impl.mode = TIC_RUN_MODE; -} #endif -static void exitGameMenu() +static void exitGame() { if(impl.prevMode == TIC_SURF_MODE) { @@ -1060,10 +1055,6 @@ static void exitGameMenu() { setStudioMode(TIC_CONSOLE_MODE); } - -#if defined(BUILD_EDITORS) - impl.console->showGameMenu = false; -#endif } void setStudioMode(EditorMode mode) @@ -1084,10 +1075,6 @@ void setStudioMode(EditorMode mode) case TIC_CONSOLE_MODE: case TIC_MENU_MODE: break; - case TIC_RUN_MODE: - case TIC_SURF_MODE: - impl.prevMode = TIC_CODE_MODE; - break; default: impl.prevMode = prev; break; } @@ -1144,7 +1131,7 @@ static void resetGame() setStudioMode(TIC_RUN_MODE); } -static void hideGameMenu() +void resumeGame() { tic_core_resume(impl.studio.tic); impl.mode = TIC_RUN_MODE; @@ -1231,6 +1218,7 @@ static MenuOption VolumeOption = }; static void showGamepadMenu(); +static void showMainMenu(); static const MenuItem OptionMenu[] = { @@ -1242,24 +1230,86 @@ static const MenuItem OptionMenu[] = {"VOLUME", NULL, &VolumeOption}, {"SETUP GAMEPAD", showGamepadMenu}, {""}, - {"BACK", showGameMenu, .back = true}, + {"BACK", showMainMenu, .back = true}, }; static void showOptionsMenu(); +static void gameMenuHandler(void* data) +{ + tic_mem* tic = impl.studio.tic; + tic_core_script_config(tic)->callback.gamemenu(tic, *(s32*)data, NULL); + resumeGame(); +} + +static void freeGameMenu() +{ + if(impl.gameMenu.items) + { + for(MenuItem *it = impl.gameMenu.items, *end = it + impl.gameMenu.count; it != end; ++it) + free((void*)it->label); + + free(impl.gameMenu.items); + impl.gameMenu.count = 0; + impl.gameMenu.items = NULL; + } +} + +static void initGameMenu() +{ + tic_mem* tic = impl.studio.tic; + + freeGameMenu(); + + char* menu = tic_tool_metatag(tic->cart.code.data, "menu", tic_core_script_config(tic)->singleComment); + + if(menu) SCOPE(free(menu)) + { + MenuItem *items = NULL; + s32 count = 0; + + char* label = strtok(menu, " "); + while(label) + { + items = realloc(items, sizeof(MenuItem) * ++count); + items[count - 1] = (MenuItem){strdup(label), gameMenuHandler}; + + label = strtok(NULL, " "); + } + + count += 2; + items = realloc(items, sizeof(MenuItem) * count); + items[count - 2] = (MenuItem){strdup("")}; + items[count - 1] = (MenuItem){strdup("BACK"), showMainMenu, .back = true}; + + impl.gameMenu.items = items; + impl.gameMenu.count = count; + } +} + +static void showGameMenu() +{ + studio_menu_init(impl.menu, impl.gameMenu.items, impl.gameMenu.count, 0, 0, showMainMenu, NULL); +} + +static inline s32 mainMenuStart() +{ + return impl.gameMenu.count ? 0 : 1; +} -static const MenuItem GameMenu[] = +static const MenuItem MainMenu[] = { + {"GAME MENU", showGameMenu}, + {"RESUME GAME", resumeGame}, + {"RESET GAME", resetGame}, #if defined(BUILD_EDITORS) - {"CLOSE GAME", exitGameMenu}, + {"CLOSE GAME", exitGame}, #endif - {"RESET GAME", resetGame}, - {"RESUME GAME", hideGameMenu}, {"OPTIONS", showOptionsMenu}, {""}, {"QUIT TIC-80", exitStudio}, }; -void showGameMenu() +static void showMainMenu() { if(impl.mode != TIC_MENU_MODE) { @@ -1268,14 +1318,17 @@ void showGameMenu() impl.mode = TIC_MENU_MODE; } - enum{Count = COUNT_OF(GameMenu)}; - studio_menu_init(impl.menu, GameMenu, Count, Count - 4, 0, NULL, NULL); + initGameMenu(); + + s32 start = mainMenuStart(); + + studio_menu_init(impl.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); } static void showOptionsMenuPos(s32 pos) { studio_menu_init(impl.menu, OptionMenu, - COUNT_OF(OptionMenu), pos, COUNT_OF(GameMenu) - 3, showGameMenu, NULL); + COUNT_OF(OptionMenu), pos, COUNT_OF(MainMenu) - 3 - mainMenuStart(), showMainMenu, NULL); } static void showOptionsMenu() @@ -1617,16 +1670,7 @@ bool studioCartChanged() } #endif -static inline bool isGameMenu() -{ - return (impl.mode == TIC_RUN_MODE || impl.mode == TIC_MENU_MODE) -#if defined(BUILD_EDITORS) - && impl.console->showGameMenu -#endif - ; -} - -void runProject() +void runGame() { #if defined(BUILD_EDITORS) if(impl.console->args.keepcmd @@ -1644,8 +1688,15 @@ void runProject() if(impl.mode == TIC_RUN_MODE) { initRunMode(); + return; } - else setStudioMode(TIC_RUN_MODE); + + setStudioMode(TIC_RUN_MODE); + +#if defined(BUILD_EDITORS) + if(impl.mode == TIC_SURF_MODE) + impl.prevMode = TIC_SURF_MODE; +#endif } } @@ -1818,45 +1869,19 @@ static void processStudioShortcuts() if(keyWasPressedOnce(tic_key_f6)) switchCrtMonitor(); #endif - if(isGameMenu()) - { - if(keyWasPressedOnce(tic_key_escape)) - { - if(impl.mode == TIC_MENU_MODE) - { - if(!studio_menu_back(impl.menu)) - hideGameMenu(); - } - else showGameMenu(); - } - else if(keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); - else if(keyWasPressedOnce(tic_key_return)) - { - if(alt) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); - } -#if defined(BUILD_EDITORS) - else if(keyWasPressedOnce(tic_key_f7)) setCoverImage(); - else if(keyWasPressedOnce(tic_key_f8)) takeScreenshot(); - else if(keyWasPressedOnce(tic_key_f9)) startVideoRecord(); -#endif - else if(keyWasPressedOnce(tic_key_r)) - { - if(ctrl) runProject(); - } - - return; - } - if(alt) { if (keyWasPressedOnce(tic_key_return)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); #if defined(BUILD_EDITORS) - else if(keyWasPressedOnce(tic_key_grave)) setStudioMode(TIC_CONSOLE_MODE); - else if(keyWasPressedOnce(tic_key_1)) setStudioMode(TIC_CODE_MODE); - else if(keyWasPressedOnce(tic_key_2)) setStudioMode(TIC_SPRITE_MODE); - else if(keyWasPressedOnce(tic_key_3)) setStudioMode(TIC_MAP_MODE); - else if(keyWasPressedOnce(tic_key_4)) setStudioMode(TIC_SFX_MODE); - else if(keyWasPressedOnce(tic_key_5)) setStudioMode(TIC_MUSIC_MODE); + else if(impl.mode != TIC_RUN_MODE) + { + if(keyWasPressedOnce(tic_key_grave)) setStudioMode(TIC_CONSOLE_MODE); + else if(keyWasPressedOnce(tic_key_1)) setStudioMode(TIC_CODE_MODE); + else if(keyWasPressedOnce(tic_key_2)) setStudioMode(TIC_SPRITE_MODE); + else if(keyWasPressedOnce(tic_key_3)) setStudioMode(TIC_MAP_MODE); + else if(keyWasPressedOnce(tic_key_4)) setStudioMode(TIC_SFX_MODE); + else if(keyWasPressedOnce(tic_key_5)) setStudioMode(TIC_MUSIC_MODE); + } #endif } else if(ctrl) @@ -1865,8 +1890,8 @@ static void processStudioShortcuts() #if defined(BUILD_EDITORS) else if(keyWasPressedOnce(tic_key_pageup)) changeStudioMode(-1); else if(keyWasPressedOnce(tic_key_pagedown)) changeStudioMode(1); - else if(keyWasPressedOnce(tic_key_return)) runProject(); - else if(keyWasPressedOnce(tic_key_r)) runProject(); + else if(keyWasPressedOnce(tic_key_return)) runGame(); + else if(keyWasPressedOnce(tic_key_r)) runGame(); else if(keyWasPressedOnce(tic_key_s)) saveProject(); #endif @@ -1883,33 +1908,39 @@ static void processStudioShortcuts() else { if (keyWasPressedOnce(tic_key_f11)) tic_sys_fullscreen_set(!tic_sys_fullscreen_get()); -#if defined(BUILD_EDITORS) - else if(keyWasPressedOnce(tic_key_f1)) setStudioMode(TIC_CODE_MODE); - else if(keyWasPressedOnce(tic_key_f2)) setStudioMode(TIC_SPRITE_MODE); - else if(keyWasPressedOnce(tic_key_f3)) setStudioMode(TIC_MAP_MODE); - else if(keyWasPressedOnce(tic_key_f4)) setStudioMode(TIC_SFX_MODE); - else if(keyWasPressedOnce(tic_key_f5)) setStudioMode(TIC_MUSIC_MODE); - else if(keyWasPressedOnce(tic_key_f7)) setCoverImage(); - else if(keyWasPressedOnce(tic_key_f8)) takeScreenshot(); - else if(keyWasPressedOnce(tic_key_f9)) startVideoRecord(); -#endif else if(keyWasPressedOnce(tic_key_escape)) { -#if defined(BUILD_EDITORS) - Code* code = impl.code; - - if(impl.mode == TIC_CODE_MODE && code->mode != TEXT_EDIT_MODE) + switch(impl.mode) { - code->escape(code); - return; - } + case TIC_MENU_MODE: studio_menu_back(impl.menu); break; + case TIC_RUN_MODE: showMainMenu(); break; +#if defined(BUILD_EDITORS) + case TIC_CONSOLE_MODE: setStudioMode(impl.prevMode); break; + case TIC_CODE_MODE: + if(impl.code->mode != TEXT_EDIT_MODE) + { + impl.code->escape(impl.code); + return; + } + default: + setStudioMode(TIC_CONSOLE_MODE); #endif + } - if(impl.mode == TIC_MENU_MODE && studio_menu_back(impl.menu)) - return; - - setStudioMode(impl.mode == TIC_CONSOLE_MODE ? impl.prevMode : TIC_CONSOLE_MODE); } +#if defined(BUILD_EDITORS) + else if(impl.mode != TIC_RUN_MODE) + { + if(keyWasPressedOnce(tic_key_f1)) setStudioMode(TIC_CODE_MODE); + else if(keyWasPressedOnce(tic_key_f2)) setStudioMode(TIC_SPRITE_MODE); + else if(keyWasPressedOnce(tic_key_f3)) setStudioMode(TIC_MAP_MODE); + else if(keyWasPressedOnce(tic_key_f4)) setStudioMode(TIC_SFX_MODE); + else if(keyWasPressedOnce(tic_key_f5)) setStudioMode(TIC_MUSIC_MODE); + else if(keyWasPressedOnce(tic_key_f7)) setCoverImage(); + else if(keyWasPressedOnce(tic_key_f8)) takeScreenshot(); + else if(keyWasPressedOnce(tic_key_f9)) startVideoRecord(); + } +#endif } } @@ -2269,13 +2300,13 @@ static void studioTick() tic_blit_callback callback[TIC_MODES_COUNT] = { - [TIC_MENU_MODE] = {studio_menu_anim_scanline, NULL, impl.menu}, + [TIC_MENU_MODE] = {studio_menu_anim_scanline, NULL, NULL, impl.menu}, #if defined(BUILD_EDITORS) - [TIC_SPRITE_MODE] = {sprite->scanline, NULL, sprite}, - [TIC_MAP_MODE] = {map->scanline, NULL, map}, - [TIC_WORLD_MODE] = {impl.world->scanline, NULL, impl.world}, - [TIC_SURF_MODE] = {impl.surf->scanline, NULL, impl.surf}, + [TIC_SPRITE_MODE] = {sprite->scanline, NULL, NULL, sprite}, + [TIC_MAP_MODE] = {map->scanline, NULL, NULL, map}, + [TIC_WORLD_MODE] = {impl.world->scanline, NULL, NULL, impl.world}, + [TIC_SURF_MODE] = {impl.surf->scanline, NULL, NULL, impl.surf}, #endif }; @@ -2350,6 +2381,7 @@ static void studioClose() freeRun (impl.run); freeConfig (impl.config); + freeGameMenu(); studio_menu_free(impl.menu); } diff --git a/src/studio/studio.h b/src/studio/studio.h index 3eae6caa2..5e9ef926a 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -187,7 +187,6 @@ void studioRomSaved(); void studioConfigChanged(); void setStudioMode(EditorMode mode); -void resumeRunMode(); EditorMode getStudioMode(); void exitStudio(); @@ -225,12 +224,11 @@ void confirmDialog(const char** text, s32 rows, ConfirmCallback callback, void* bool studioCartChanged(); void playSystemSfx(s32 id); -void runGameFromSurf(); void gotoCode(); void gotoSurf(); -void showGameMenu(); -void runProject(); +void runGame(); +void resumeGame(); tic_tiles* getBankTiles(); tic_palette* getBankPalette(bool bank); diff --git a/src/tic.h b/src/tic.h index 9935e1c7e..5345ccbb8 100644 --- a/src/tic.h +++ b/src/tic.h @@ -434,7 +434,7 @@ typedef struct tic_bank banks[TIC_BANKS]; }; - tic_code code; + tic_code code; } tic_cartridge; diff --git a/src/tools.c b/src/tools.c index cb8bf8874..1e3d9b3c5 100644 --- a/src/tools.c +++ b/src/tools.c @@ -22,6 +22,7 @@ #include "tools.h" +#include #include #include #include @@ -232,21 +233,20 @@ u32 tic_tool_unzip(void* dest, s32 destSize, const void* source, s32 size) return uncompress(dest, &destSizeLong, source, size) == Z_OK ? destSizeLong : 0; } -const char* tic_tool_metatag(const char* code, const char* tag, const char* comment) +char* tic_tool_metatag(const char* code, const char* tag, const char* comment) { const char* start = NULL; { static char format[] = "%s %s:"; - char* tagBuffer = malloc(strlen(format) + strlen(tag)); + char* tagBuffer = malloc(sizeof format + strlen(tag)); - if (tagBuffer) + SCOPE(free(tagBuffer)) { sprintf(tagBuffer, format, comment, tag); if ((start = strstr(code, tagBuffer))) start += strlen(tagBuffer); - free(tagBuffer); } } @@ -256,8 +256,8 @@ const char* tic_tool_metatag(const char* code, const char* tag, const char* comm if (end) { - while (*start <= ' ' && start < end) start++; - while (*(end - 1) <= ' ' && end > start) end--; + while (isspace(*start) && start < end) start++; + while (isspace(*(end - 1)) && end > start) end--; const s32 size = (s32)(end - start); diff --git a/src/tools.h b/src/tools.h index d86856f89..ee7e8bc93 100644 --- a/src/tools.h +++ b/src/tools.h @@ -101,4 +101,4 @@ bool tic_tool_flat4(const void* buffer, s32 size); u32 tic_nearest_color(const tic_rgb* palette, const tic_rgb* color, s32 count); -const char* tic_tool_metatag(const char* code, const char* tag, const char* comment); \ No newline at end of file +char* tic_tool_metatag(const char* code, const char* tag, const char* comment); \ No newline at end of file From a9a6d1efc5346d7e37e679ea9ec3d935ee364667 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 15 Jan 2022 15:47:18 -0500 Subject: [PATCH 241/379] nicer start up stages --- src/studio/screens/start.c | 63 +++++++++++++++++++++----------------- src/studio/screens/start.h | 10 ++++-- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/studio/screens/start.c b/src/studio/screens/start.c index df6d498c1..9244dd099 100644 --- a/src/studio/screens/start.c +++ b/src/studio/screens/start.c @@ -53,47 +53,42 @@ static void drawHeader(Start* start) start->color[i], true, 1, false); } -static void header(Start* start) +static void chime(Start* start) { - if(!start->play) - { - playSystemSfx(1); + playSystemSfx(1); +} - start->play = true; - } +static void stop_chime(Start* start) +{ + sfx_stop(start->tic, 0); +} +static void header(Start* start) +{ drawHeader(start); } -static void end(Start* start) +static void start_console(Start* start) { - if(start->play) - { - sfx_stop(start->tic, 0); - - start->play = false; - } - drawHeader(start); - setStudioMode(TIC_CONSOLE_MODE); } static void tick(Start* start) { - if(!start->initialized) - { - start->phase = 1; - start->ticks = 0; - - start->initialized = true; + // stages that have a tick count of 0 run in zero time + // (typically this is only used to start/stop audio) + while (start->stages[start->stage].ticks == 0) { + start->stages[start->stage].fn(start); + start->stage++; } tic_api_cls(start->tic, TIC_COLOR_BG); - static void(*const steps[])(Start*) = {reset, header, end}; - - steps[CLAMP(start->ticks / TIC80_FRAMERATE, 0, COUNT_OF(steps) - 1)](start); + Stage *stage = &start->stages[start->stage]; + stage->fn(start); + if (stage->ticks > 0) stage->ticks--; + if (stage->ticks == 0) start->stage++; start->ticks++; } @@ -121,15 +116,27 @@ static void* _memmem(const void* haystack, size_t hlen, const void* needle, size void initStart(Start* start, tic_mem* tic, const char* cart) { + enum duration { + immediate = 0, + one_second = TIC80_FRAMERATE, + forever = -1 + }; + *start = (Start) { .tic = tic, - .initialized = false, - .phase = 1, - .ticks = 0, + .initialized = true, .tick = tick, - .play = false, .embed = false, + .ticks = 0, + .stage = 0, + .stages = { + { reset, .ticks = one_second }, + { chime, .ticks = immediate }, + { header, .ticks = one_second }, + { stop_chime, .ticks = immediate }, + { start_console, .ticks = forever }, + } }; start->text = calloc(1, STUDIO_TEXT_BUFFER_SIZE); diff --git a/src/studio/screens/start.h b/src/studio/screens/start.h index 085b5fa0c..93146e1a1 100644 --- a/src/studio/screens/start.h +++ b/src/studio/screens/start.h @@ -35,14 +35,20 @@ typedef struct typedef struct Start Start; +typedef struct stage { + void(*fn)(Start*); + u8 ticks; +} Stage; + struct Start { tic_mem* tic; bool initialized; + Stage stages[5]; - u32 phase; - u32 ticks; + u32 stage; + s32 ticks; bool play; char* text; From ce2abb5c799d97652d673b45024d2ab8c96236f7 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 15 Jan 2022 15:49:49 -0500 Subject: [PATCH 242/379] fewer allocations is better --- src/studio/screens/start.c | 9 ++------- src/studio/screens/start.h | 4 ++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/studio/screens/start.c b/src/studio/screens/start.c index 9244dd099..e3129cafb 100644 --- a/src/studio/screens/start.c +++ b/src/studio/screens/start.c @@ -121,7 +121,7 @@ void initStart(Start* start, tic_mem* tic, const char* cart) one_second = TIC80_FRAMERATE, forever = -1 }; - + *start = (Start) { .tic = tic, @@ -139,9 +139,6 @@ void initStart(Start* start, tic_mem* tic, const char* cart) } }; - start->text = calloc(1, STUDIO_TEXT_BUFFER_SIZE); - start->color = calloc(1, STUDIO_TEXT_BUFFER_SIZE); - static const char* Header[] = { "", @@ -151,7 +148,7 @@ void initStart(Start* start, tic_mem* tic, const char* cart) }; for(s32 i = 0; i < COUNT_OF(Header); i++) - strcpy(start->text + i * STUDIO_TEXT_BUFFER_WIDTH, Header[i]); + strcpy(&start->text[i * STUDIO_TEXT_BUFFER_WIDTH], Header[i]); for(s32 i = 0; i < STUDIO_TEXT_BUFFER_SIZE; i++) start->color[i] = CLAMP(((i % STUDIO_TEXT_BUFFER_WIDTH) + (i / STUDIO_TEXT_BUFFER_WIDTH)) / 2, @@ -241,7 +238,5 @@ void initStart(Start* start, tic_mem* tic, const char* cart) void freeStart(Start* start) { - free(start->text); - free(start->color); free(start); } diff --git a/src/studio/screens/start.h b/src/studio/screens/start.h index 93146e1a1..5b3a313b4 100644 --- a/src/studio/screens/start.h +++ b/src/studio/screens/start.h @@ -51,8 +51,8 @@ struct Start s32 ticks; bool play; - char* text; - u8* color; + char text[STUDIO_TEXT_BUFFER_SIZE]; + u8 color[STUDIO_TEXT_BUFFER_SIZE]; bool embed; From 37cc59c14c7c7e431377c014084643de93ec4603 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 15 Jan 2022 16:46:19 -0500 Subject: [PATCH 243/379] Separate game menu from studio --- CMakeLists.txt | 2 + src/studio/screens/game_menu.c | 372 +++++++++++++++++++++++++ src/studio/screens/game_menu.h | 28 ++ src/studio/screens/run.h | 1 + src/studio/studio.c | 486 +-------------------------------- src/studio/studio_impl.h | 199 ++++++++++++++ 6 files changed, 606 insertions(+), 482 deletions(-) create mode 100644 src/studio/screens/game_menu.c create mode 100644 src/studio/screens/game_menu.h create mode 100644 src/studio/studio_impl.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 85ce0405b..1d3fabf65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -812,6 +812,7 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/studio/screens/console.c ${TIC80LIB_DIR}/studio/screens/run.c ${TIC80LIB_DIR}/studio/screens/menu.c + ${TIC80LIB_DIR}/studio/screens/game_menu.c ${TIC80LIB_DIR}/studio/screens/surf.c ${TIC80LIB_DIR}/studio/screens/start.c ${TIC80LIB_DIR}/studio/editors/code.c @@ -1098,6 +1099,7 @@ if(BUILD_STUB) src/system/sdl/main.c src/studio/screens/run.c src/studio/screens/menu.c + src/studio/screens/game_menu.c src/studio/screens/start.c src/studio/config.c src/studio/studio.c diff --git a/src/studio/screens/game_menu.c b/src/studio/screens/game_menu.c new file mode 100644 index 000000000..e2d4b9d8f --- /dev/null +++ b/src/studio/screens/game_menu.c @@ -0,0 +1,372 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include "../studio.h" +#include "../studio_impl.h" +#include "menu.h" +#include "game_menu.h" + +typedef struct _StudioImplementation StudioImplementation; + +// TODO: we should be able to shrink this access +extern StudioImplementation impl; + +#define OPTION_VALUES(...) \ + .values = (const char*[])__VA_ARGS__, \ + .count = COUNT_OF(((const char*[])__VA_ARGS__)) + +static s32 optionFullscreenGet() +{ + return tic_sys_fullscreen_get() ? 1 : 0; +} + +static void optionFullscreenSet(s32 pos) +{ + tic_sys_fullscreen_set(impl.config->data.options.fullscreen = (pos == 1)); +} + +static const char OffValue[] = "OFF"; +static const char OnValue[] = "ON"; + +static MenuOption FullscreenOption = +{ + OPTION_VALUES({OffValue, OnValue}), + optionFullscreenGet, + optionFullscreenSet, +}; + +#if defined(CRT_SHADER_SUPPORT) +static s32 optionCrtMonitorGet() +{ + return impl.config->data.options.crt ? 1 : 0; +} + +static void optionCrtMonitorSet(s32 pos) +{ + impl.config->data.options.crt = pos == 1; +} + +static MenuOption CrtMonitorOption = +{ + OPTION_VALUES({OffValue, OnValue}), + optionCrtMonitorGet, + optionCrtMonitorSet, +}; + +#endif + +static s32 optionVSyncGet() +{ + return getConfig()->options.vsync ? 1 : 0; +} + +static void optionVSyncSet(s32 pos) +{ + impl.config->data.options.vsync = pos == 1; +} + +static MenuOption VSyncOption = +{ + OPTION_VALUES({OffValue, OnValue}), + optionVSyncGet, + optionVSyncSet, +}; + +static s32 optionVolumeGet() +{ + return impl.config->data.options.volume; +} + +static void optionVolumeSet(s32 pos) +{ + impl.config->data.options.volume = pos; +} + +static MenuOption VolumeOption = +{ + OPTION_VALUES( + { + "00", "01", "02", "03", + "04", "05", "06", "07", + "08", "09", "10", "11", + "12", "13", "14", "15", + }), + optionVolumeGet, + optionVolumeSet, +}; + + +static const MenuItem OptionMenu[] = +{ +#if defined(CRT_SHADER_SUPPORT) + {"CRT MONITOR", NULL, &CrtMonitorOption}, +#endif + {"VSYNC", NULL, &VSyncOption, "VSYNC needs restart!"}, + {"FULLSCREEN", NULL, &FullscreenOption}, + {"VOLUME", NULL, &VolumeOption}, + {"SETUP GAMEPAD", showGamepadMenu}, + {""}, + {"BACK", showMainMenu, .back = true}, +}; + +static void showOptionsMenu(); +static void gameMenuHandler(void* data) +{ + tic_mem* tic = impl.studio.tic; + tic_core_script_config(tic)->callback.gamemenu(tic, *(s32*)data, NULL); + resumeGame(); +} + +void freeGameMenu() +{ + if(impl.gameMenu.items) + { + for(MenuItem *it = impl.gameMenu.items, *end = it + impl.gameMenu.count; it != end; ++it) + free((void*)it->label); + + free(impl.gameMenu.items); + impl.gameMenu.count = 0; + impl.gameMenu.items = NULL; + } +} + +void initGameMenu() +{ + tic_mem* tic = impl.studio.tic; + + freeGameMenu(); + + char* menu = tic_tool_metatag(tic->cart.code.data, "menu", tic_core_script_config(tic)->singleComment); + + if(menu) SCOPE(free(menu)) + { + MenuItem *items = NULL; + s32 count = 0; + + char* label = strtok(menu, " "); + while(label) + { + items = realloc(items, sizeof(MenuItem) * ++count); + items[count - 1] = (MenuItem){strdup(label), gameMenuHandler}; + + label = strtok(NULL, " "); + } + + count += 2; + items = realloc(items, sizeof(MenuItem) * count); + items[count - 2] = (MenuItem){strdup("")}; + items[count - 1] = (MenuItem){strdup("BACK"), showMainMenu, .back = true}; + + impl.gameMenu.items = items; + impl.gameMenu.count = count; + } +} + +void showGameMenu() +{ + studio_menu_init(impl.menu, impl.gameMenu.items, impl.gameMenu.count, 0, 0, showMainMenu, NULL); +} + +static inline s32 mainMenuStart() +{ + return impl.gameMenu.count ? 0 : 1; +} + +static void exitGame() +{ + if(impl.prevMode == TIC_SURF_MODE) + { + setStudioMode(TIC_SURF_MODE); + } + else + { + setStudioMode(TIC_CONSOLE_MODE); + } +} + +static const MenuItem MainMenu[] = +{ + {"GAME MENU", showGameMenu}, + {"RESUME GAME", resumeGame}, + {"RESET GAME", resetGame}, +#if defined(BUILD_EDITORS) + {"CLOSE GAME", exitGame}, +#endif + {"OPTIONS", showOptionsMenu}, + {""}, + {"QUIT TIC-80", exitStudio}, +}; + +void showMainMenu() +{ + if(impl.mode != TIC_MENU_MODE) + { + tic_core_pause(impl.studio.tic); + tic_api_reset(impl.studio.tic); + impl.mode = TIC_MENU_MODE; + } + + initGameMenu(); + + s32 start = mainMenuStart(); + + studio_menu_init(impl.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); +} + +static void showOptionsMenuPos(s32 pos) +{ + studio_menu_init(impl.menu, OptionMenu, + COUNT_OF(OptionMenu), pos, COUNT_OF(MainMenu) - 3 - mainMenuStart(), showMainMenu, NULL); +} + +static void showOptionsMenu() +{ + showOptionsMenuPos(COUNT_OF(OptionMenu) - 4); +} + +static void saveGamepadMenu() +{ + impl.config->data.options.mapping = impl.gamepads.mapping; + showOptionsMenuPos(COUNT_OF(OptionMenu) - 3); +} + +static void resetGamepadMenu(); + +static char MappingItems[TIC_BUTTONS][sizeof "RIGHT - RIGHT"]; + +static const char* const ButtonLabels[] = +{ + "UP", + "DOWN", + "LEFT", + "RIGHT", + "A", + "B", + "X", + "Y", +}; + +enum{KeyMappingStart = 2}; + +static void assignMapping(void* data) +{ + impl.gamepads.key = *(s32*)data - KeyMappingStart; + + static const char Fmt[] = "to assign to (%s) button..."; + static char str[sizeof Fmt + STRLEN("RIGHT")]; + + static const MenuItem AssignKeyMenu[] = + { + {"Please, press a key you want"}, + {str}, + }; + + sprintf(str, Fmt, ButtonLabels[impl.gamepads.key]); + + studio_menu_init(impl.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); +} + +static void initGamepadButtons() +{ + static const char* const KeysList[] = + { + "...", + "A", "B", "C", "D", "E", "F", "G", "H", + "I", "J", "K", "L", "M", "N", "O", "P", + "Q", "R", "S", "T", "U", "V", "W", "X", + "Y", "Z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "-", "=", "[", "]", + "\\", ";", "'", "`", ",", ".", "/", "SPCE", + "TAB", "RET", "BACKS","DEL", "INS", "PGUP", "PGDN", "HOME", + "END", "UP", "DOWN", "LEFT", "RIGHT","CAPS", "CTRL", "SHIFT", + "ALT", "ESC", "F1", "F2", "F3", "F4", "F5", "F6", + "F7", "F8", "F9", "F10", "F11", "F12", + }; + + for(s32 i = 0, index = impl.gamepads.index * TIC_BUTTONS; i != TIC_BUTTONS; ++i) + sprintf(MappingItems[i], "%-5s - %-5s", ButtonLabels[i], KeysList[impl.gamepads.mapping.data[index++]]); +} + +static s32 optionGamepadGet() +{ + return impl.gamepads.index; +} + +static void optionGamepadSet(s32 pos) +{ + impl.gamepads.index = pos; + initGamepadButtons(); +} + +static MenuOption GamepadOption = +{ + OPTION_VALUES({"1", "2", "3", "4"}), + optionGamepadGet, + optionGamepadSet, +}; + +void initGamepadMenu() +{ + static const MenuItem GamepadMenu[] = + { + {"GAMEPAD", NULL, &GamepadOption}, + {""}, + + {MappingItems[0], assignMapping}, + {MappingItems[1], assignMapping}, + {MappingItems[2], assignMapping}, + {MappingItems[3], assignMapping}, + {MappingItems[4], assignMapping}, + {MappingItems[5], assignMapping}, + {MappingItems[6], assignMapping}, + {MappingItems[7], assignMapping}, + + {""}, + {"SAVE MAPPING", saveGamepadMenu}, + {"RESET TO DEFAULTS", resetGamepadMenu}, + {"BACK", showOptionsMenu, .back = true}, + }; + + initGamepadButtons(); + + studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), + impl.gamepads.key < 0 ? KeyMappingStart : impl.gamepads.key + KeyMappingStart, + COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); + + impl.gamepads.key = -1; +} + +static void resetGamepadMenu() +{ + impl.gamepads.index = 0; + ZEROMEM(impl.gamepads.mapping); + tic_sys_default_mapping(&impl.gamepads.mapping); + initGamepadMenu(); +} + +void showGamepadMenu() +{ + impl.gamepads.index = 0; + impl.gamepads.mapping = getConfig()->options.mapping; + + initGamepadMenu(); +} \ No newline at end of file diff --git a/src/studio/screens/game_menu.h b/src/studio/screens/game_menu.h new file mode 100644 index 000000000..85eb9f03d --- /dev/null +++ b/src/studio/screens/game_menu.h @@ -0,0 +1,28 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#pragma once + +void showGamepadMenu(); +void showMainMenu(); +void freeGameMenu(); +void initGamepadMenu(); \ No newline at end of file diff --git a/src/studio/screens/run.h b/src/studio/screens/run.h index 3b5d25b92..904dc76d4 100644 --- a/src/studio/screens/run.h +++ b/src/studio/screens/run.h @@ -22,6 +22,7 @@ #pragma once +#include "../system.h" #include "studio/studio.h" typedef struct Run Run; diff --git a/src/studio/studio.c b/src/studio/studio.c index 61b4f4a52..b12b90158 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -21,6 +21,7 @@ // SOFTWARE. #include "studio.h" +#include "studio_impl.h" #if defined(BUILD_EDITORS) @@ -43,6 +44,7 @@ #include "screens/start.h" #include "screens/run.h" #include "screens/menu.h" +#include "screens/game_menu.h" #include "config.h" #include "cart.h" @@ -53,13 +55,7 @@ #include #include -#if defined(TIC80_PRO) -#define TIC_EDITOR_BANKS (TIC_BANKS) -#else -#define TIC_EDITOR_BANKS 1 -#endif -#define MD5_HASHSIZE 16 #define OPTION_VALUES(...) \ .values = (const char*[])__VA_ARGS__, \ @@ -73,146 +69,11 @@ static const char VideoGif[] = "video%i.gif"; static const char ScreenGif[] = "screen%i.gif"; -typedef struct -{ - u8 data[MD5_HASHSIZE]; -} CartHash; - -static const EditorMode Modes[] = -{ - TIC_CODE_MODE, - TIC_SPRITE_MODE, - TIC_MAP_MODE, - TIC_SFX_MODE, - TIC_MUSIC_MODE, -}; - -static const EditorMode BankModes[] = -{ - TIC_SPRITE_MODE, - TIC_MAP_MODE, - TIC_SFX_MODE, - TIC_MUSIC_MODE, -}; -#endif - -typedef struct -{ - bool down; - bool click; - - tic_point start; - tic_point end; - -} MouseState; - -static struct -{ - Studio studio; - - tic80_local* tic80local; - - EditorMode mode; - EditorMode prevMode; - EditorMode toolbarMode; - - struct - { - MouseState state[3]; - } mouse; - -#if defined(BUILD_EDITORS) - EditorMode menuMode; - - struct - { - CartHash hash; - u64 mdate; - }cart; - - struct - { - bool show; - bool chained; - - union - { - struct - { - s8 sprites; - s8 map; - s8 sfx; - s8 music; - } index; - - s8 indexes[COUNT_OF(BankModes)]; - }; - - } bank; - - struct - { - s32 counter; - char message[STUDIO_TEXT_BUFFER_WIDTH]; - } popup; - - struct - { - char text[STUDIO_TEXT_BUFFER_WIDTH]; - } tooltip; - - struct - { - bool record; - - u32* buffer; - s32 frames; - s32 frame; - - } video; - - Code* code; - - struct - { - Sprite* sprite[TIC_EDITOR_BANKS]; - Map* map[TIC_EDITOR_BANKS]; - Sfx* sfx[TIC_EDITOR_BANKS]; - Music* music[TIC_EDITOR_BANKS]; - } banks; - - Console* console; - World* world; - Surf* surf; - - tic_net* net; #endif - struct - { - tic_mapping mapping; - s32 index; - s32 key; - } gamepads; - - Start* start; - Run* run; - Menu* menu; - Config* config; - - struct - { - MenuItem* items; - s32 count; - } gameMenu; - - tic_fs* fs; - - s32 samplerate; - tic_font systemFont; -} impl = +StudioImplementation impl = { .tic80local = NULL, @@ -1045,18 +906,6 @@ void gotoCode() #endif -static void exitGame() -{ - if(impl.prevMode == TIC_SURF_MODE) - { - setStudioMode(TIC_SURF_MODE); - } - else - { - setStudioMode(TIC_CONSOLE_MODE); - } -} - void setStudioMode(EditorMode mode) { if(mode != impl.mode) @@ -1125,7 +974,7 @@ static void changeStudioMode(s32 dir) } #endif -static void resetGame() +void resetGame() { tic_api_reset(impl.studio.tic); setStudioMode(TIC_RUN_MODE); @@ -1137,333 +986,6 @@ void resumeGame() impl.mode = TIC_RUN_MODE; } -static s32 optionFullscreenGet() -{ - return tic_sys_fullscreen_get() ? 1 : 0; -} - -static void optionFullscreenSet(s32 pos) -{ - tic_sys_fullscreen_set(impl.config->data.options.fullscreen = (pos == 1)); -} - -static const char OffValue[] = "OFF"; -static const char OnValue[] = "ON"; - -static MenuOption FullscreenOption = -{ - OPTION_VALUES({OffValue, OnValue}), - optionFullscreenGet, - optionFullscreenSet, -}; - -#if defined(CRT_SHADER_SUPPORT) -static s32 optionCrtMonitorGet() -{ - return impl.config->data.options.crt ? 1 : 0; -} - -static void optionCrtMonitorSet(s32 pos) -{ - impl.config->data.options.crt = pos == 1; -} - -static MenuOption CrtMonitorOption = -{ - OPTION_VALUES({OffValue, OnValue}), - optionCrtMonitorGet, - optionCrtMonitorSet, -}; - -#endif - -static s32 optionVSyncGet() -{ - return getConfig()->options.vsync ? 1 : 0; -} - -static void optionVSyncSet(s32 pos) -{ - impl.config->data.options.vsync = pos == 1; -} - -static MenuOption VSyncOption = -{ - OPTION_VALUES({OffValue, OnValue}), - optionVSyncGet, - optionVSyncSet, -}; - -static s32 optionVolumeGet() -{ - return impl.config->data.options.volume; -} - -static void optionVolumeSet(s32 pos) -{ - impl.config->data.options.volume = pos; -} - -static MenuOption VolumeOption = -{ - OPTION_VALUES( - { - "00", "01", "02", "03", - "04", "05", "06", "07", - "08", "09", "10", "11", - "12", "13", "14", "15", - }), - optionVolumeGet, - optionVolumeSet, -}; - -static void showGamepadMenu(); -static void showMainMenu(); - -static const MenuItem OptionMenu[] = -{ -#if defined(CRT_SHADER_SUPPORT) - {"CRT MONITOR", NULL, &CrtMonitorOption}, -#endif - {"VSYNC", NULL, &VSyncOption, "VSYNC needs restart!"}, - {"FULLSCREEN", NULL, &FullscreenOption}, - {"VOLUME", NULL, &VolumeOption}, - {"SETUP GAMEPAD", showGamepadMenu}, - {""}, - {"BACK", showMainMenu, .back = true}, -}; - -static void showOptionsMenu(); -static void gameMenuHandler(void* data) -{ - tic_mem* tic = impl.studio.tic; - tic_core_script_config(tic)->callback.gamemenu(tic, *(s32*)data, NULL); - resumeGame(); -} - -static void freeGameMenu() -{ - if(impl.gameMenu.items) - { - for(MenuItem *it = impl.gameMenu.items, *end = it + impl.gameMenu.count; it != end; ++it) - free((void*)it->label); - - free(impl.gameMenu.items); - impl.gameMenu.count = 0; - impl.gameMenu.items = NULL; - } -} - -static void initGameMenu() -{ - tic_mem* tic = impl.studio.tic; - - freeGameMenu(); - - char* menu = tic_tool_metatag(tic->cart.code.data, "menu", tic_core_script_config(tic)->singleComment); - - if(menu) SCOPE(free(menu)) - { - MenuItem *items = NULL; - s32 count = 0; - - char* label = strtok(menu, " "); - while(label) - { - items = realloc(items, sizeof(MenuItem) * ++count); - items[count - 1] = (MenuItem){strdup(label), gameMenuHandler}; - - label = strtok(NULL, " "); - } - - count += 2; - items = realloc(items, sizeof(MenuItem) * count); - items[count - 2] = (MenuItem){strdup("")}; - items[count - 1] = (MenuItem){strdup("BACK"), showMainMenu, .back = true}; - - impl.gameMenu.items = items; - impl.gameMenu.count = count; - } -} - -static void showGameMenu() -{ - studio_menu_init(impl.menu, impl.gameMenu.items, impl.gameMenu.count, 0, 0, showMainMenu, NULL); -} - -static inline s32 mainMenuStart() -{ - return impl.gameMenu.count ? 0 : 1; -} - -static const MenuItem MainMenu[] = -{ - {"GAME MENU", showGameMenu}, - {"RESUME GAME", resumeGame}, - {"RESET GAME", resetGame}, -#if defined(BUILD_EDITORS) - {"CLOSE GAME", exitGame}, -#endif - {"OPTIONS", showOptionsMenu}, - {""}, - {"QUIT TIC-80", exitStudio}, -}; - -static void showMainMenu() -{ - if(impl.mode != TIC_MENU_MODE) - { - tic_core_pause(impl.studio.tic); - tic_api_reset(impl.studio.tic); - impl.mode = TIC_MENU_MODE; - } - - initGameMenu(); - - s32 start = mainMenuStart(); - - studio_menu_init(impl.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); -} - -static void showOptionsMenuPos(s32 pos) -{ - studio_menu_init(impl.menu, OptionMenu, - COUNT_OF(OptionMenu), pos, COUNT_OF(MainMenu) - 3 - mainMenuStart(), showMainMenu, NULL); -} - -static void showOptionsMenu() -{ - showOptionsMenuPos(COUNT_OF(OptionMenu) - 4); -} - -static void saveGamepadMenu() -{ - impl.config->data.options.mapping = impl.gamepads.mapping; - showOptionsMenuPos(COUNT_OF(OptionMenu) - 3); -} - -static void resetGamepadMenu(); - -static char MappingItems[TIC_BUTTONS][sizeof "RIGHT - RIGHT"]; - -static const char* const ButtonLabels[] = -{ - "UP", - "DOWN", - "LEFT", - "RIGHT", - "A", - "B", - "X", - "Y", -}; - -enum{KeyMappingStart = 2}; - -static void assignMapping(void* data) -{ - impl.gamepads.key = *(s32*)data - KeyMappingStart; - - static const char Fmt[] = "to assign to (%s) button..."; - static char str[sizeof Fmt + STRLEN("RIGHT")]; - - static const MenuItem AssignKeyMenu[] = - { - {"Please, press a key you want"}, - {str}, - }; - - sprintf(str, Fmt, ButtonLabels[impl.gamepads.key]); - - studio_menu_init(impl.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); -} - -static void initGamepadButtons() -{ - static const char* const KeysList[] = - { - "...", - "A", "B", "C", "D", "E", "F", "G", "H", - "I", "J", "K", "L", "M", "N", "O", "P", - "Q", "R", "S", "T", "U", "V", "W", "X", - "Y", "Z", "0", "1", "2", "3", "4", "5", - "6", "7", "8", "9", "-", "=", "[", "]", - "\\", ";", "'", "`", ",", ".", "/", "SPCE", - "TAB", "RET", "BACKS","DEL", "INS", "PGUP", "PGDN", "HOME", - "END", "UP", "DOWN", "LEFT", "RIGHT","CAPS", "CTRL", "SHIFT", - "ALT", "ESC", "F1", "F2", "F3", "F4", "F5", "F6", - "F7", "F8", "F9", "F10", "F11", "F12", - }; - - for(s32 i = 0, index = impl.gamepads.index * TIC_BUTTONS; i != TIC_BUTTONS; ++i) - sprintf(MappingItems[i], "%-5s - %-5s", ButtonLabels[i], KeysList[impl.gamepads.mapping.data[index++]]); -} - -static s32 optionGamepadGet() -{ - return impl.gamepads.index; -} - -static void optionGamepadSet(s32 pos) -{ - impl.gamepads.index = pos; - initGamepadButtons(); -} - -static MenuOption GamepadOption = -{ - OPTION_VALUES({"1", "2", "3", "4"}), - optionGamepadGet, - optionGamepadSet, -}; - -static void initGamepadMenu() -{ - static const MenuItem GamepadMenu[] = - { - {"GAMEPAD", NULL, &GamepadOption}, - {""}, - - {MappingItems[0], assignMapping}, - {MappingItems[1], assignMapping}, - {MappingItems[2], assignMapping}, - {MappingItems[3], assignMapping}, - {MappingItems[4], assignMapping}, - {MappingItems[5], assignMapping}, - {MappingItems[6], assignMapping}, - {MappingItems[7], assignMapping}, - - {""}, - {"SAVE MAPPING", saveGamepadMenu}, - {"RESET TO DEFAULTS", resetGamepadMenu}, - {"BACK", showOptionsMenu, .back = true}, - }; - - initGamepadButtons(); - - studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), - impl.gamepads.key < 0 ? KeyMappingStart : impl.gamepads.key + KeyMappingStart, - COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); - - impl.gamepads.key = -1; -} - -static void resetGamepadMenu() -{ - impl.gamepads.index = 0; - ZEROMEM(impl.gamepads.mapping); - tic_sys_default_mapping(&impl.gamepads.mapping); - initGamepadMenu(); -} - -static void showGamepadMenu() -{ - impl.gamepads.index = 0; - impl.gamepads.mapping = getConfig()->options.mapping; - - initGamepadMenu(); -} - static inline bool pointInRect(const tic_point* pt, const tic_rect* rect) { return (pt->x >= rect->x) diff --git a/src/studio/studio_impl.h b/src/studio/studio_impl.h new file mode 100644 index 000000000..16cd57611 --- /dev/null +++ b/src/studio/studio_impl.h @@ -0,0 +1,199 @@ +// MIT License + +// Copyright (c) 2017 Vadim Grigoruk @nesbox // grigoruk@gmail.com + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + + +#pragma once + +#if defined(BUILD_EDITORS) + +#include "editors/code.h" +#include "editors/sprite.h" +#include "editors/map.h" +#include "editors/world.h" +#include "editors/sfx.h" +#include "editors/music.h" +#include "screens/console.h" +#include "screens/surf.h" +#include "net.h" + +#endif + +#include "screens/start.h" +#include "screens/run.h" +#include "screens/menu.h" +#include "config.h" + +#include "fs.h" + +#define MD5_HASHSIZE 16 + +#if defined(TIC80_PRO) +#define TIC_EDITOR_BANKS (TIC_BANKS) +#else +#define TIC_EDITOR_BANKS 1 +#endif + +#ifdef BUILD_EDITORS +typedef struct +{ + u8 data[MD5_HASHSIZE]; +} CartHash; + +static const EditorMode Modes[] = +{ + TIC_CODE_MODE, + TIC_SPRITE_MODE, + TIC_MAP_MODE, + TIC_SFX_MODE, + TIC_MUSIC_MODE, +}; + +static const EditorMode BankModes[] = +{ + TIC_SPRITE_MODE, + TIC_MAP_MODE, + TIC_SFX_MODE, + TIC_MUSIC_MODE, +}; + +#endif + +typedef struct +{ + bool down; + bool click; + + tic_point start; + tic_point end; + +} MouseState; + +typedef struct _StudioImplementation +{ + Studio studio; + + tic80_local* tic80local; + + EditorMode mode; + EditorMode prevMode; + EditorMode toolbarMode; + + struct + { + MouseState state[3]; + } mouse; + +#if defined(BUILD_EDITORS) + EditorMode menuMode; + + struct + { + CartHash hash; + u64 mdate; + }cart; + + struct + { + bool show; + bool chained; + + union + { + struct + { + s8 sprites; + s8 map; + s8 sfx; + s8 music; + } index; + + s8 indexes[COUNT_OF(BankModes)]; + }; + + } bank; + + struct + { + s32 counter; + char message[STUDIO_TEXT_BUFFER_WIDTH]; + } popup; + + struct + { + char text[STUDIO_TEXT_BUFFER_WIDTH]; + } tooltip; + + struct + { + bool record; + + u32* buffer; + s32 frames; + s32 frame; + + } video; + + Code* code; + + struct + { + Sprite* sprite[TIC_EDITOR_BANKS]; + Map* map[TIC_EDITOR_BANKS]; + Sfx* sfx[TIC_EDITOR_BANKS]; + Music* music[TIC_EDITOR_BANKS]; + } banks; + + Console* console; + World* world; + Surf* surf; + + tic_net* net; +#endif + + struct + { + tic_mapping mapping; + s32 index; + s32 key; + } gamepads; + + Start* start; + Run* run; + Menu* menu; + Config* config; + + struct + { + MenuItem* items; + s32 count; + } gameMenu; + + tic_fs* fs; + + s32 samplerate; + + tic_font systemFont; + +} StudioImplementation; + +void resetGame(); +void resumeGame(); \ No newline at end of file From 89394cadc2a826d10e31135fda5e577320e13109 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 16 Jan 2022 08:35:57 -0500 Subject: [PATCH 244/379] isolate menu menu from studio a bit more --- src/studio/screens/game_menu.c | 92 ++++++++++++++++++---------------- src/studio/screens/game_menu.h | 3 +- src/studio/studio.c | 26 +++++++++- src/studio/studio.h | 1 + 4 files changed, 77 insertions(+), 45 deletions(-) diff --git a/src/studio/screens/game_menu.c b/src/studio/screens/game_menu.c index e2d4b9d8f..bd6aa1112 100644 --- a/src/studio/screens/game_menu.c +++ b/src/studio/screens/game_menu.c @@ -25,15 +25,40 @@ #include "menu.h" #include "game_menu.h" -typedef struct _StudioImplementation StudioImplementation; - // TODO: we should be able to shrink this access +// currently this is only used for impl.gamepad extern StudioImplementation impl; +struct MenuImpl { + Menu* menu; + struct + { + MenuItem* items; + s32 count; + }* gameMenu; + Config* config; + tic_mem* mem; +} state; + #define OPTION_VALUES(...) \ .values = (const char*[])__VA_ARGS__, \ .count = COUNT_OF(((const char*[])__VA_ARGS__)) +// TODO: do we need to lock this down further? +static StudioConfig* rwConfig() { + return &state.config->data; +} + + +void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem* mem) { + state = (struct MenuImpl){ + .menu = menu, + .gameMenu = gameMenu, + .config = config, + .mem = mem + }; +} + static s32 optionFullscreenGet() { return tic_sys_fullscreen_get() ? 1 : 0; @@ -41,7 +66,7 @@ static s32 optionFullscreenGet() static void optionFullscreenSet(s32 pos) { - tic_sys_fullscreen_set(impl.config->data.options.fullscreen = (pos == 1)); + tic_sys_fullscreen_set(rwConfig()->options.fullscreen = (pos == 1)); } static const char OffValue[] = "OFF"; @@ -57,12 +82,12 @@ static MenuOption FullscreenOption = #if defined(CRT_SHADER_SUPPORT) static s32 optionCrtMonitorGet() { - return impl.config->data.options.crt ? 1 : 0; + return getConfig()->options.crt ? 1 : 0; } static void optionCrtMonitorSet(s32 pos) { - impl.config->data.options.crt = pos == 1; + rwConfig()->options.crt = pos == 1; } static MenuOption CrtMonitorOption = @@ -81,7 +106,7 @@ static s32 optionVSyncGet() static void optionVSyncSet(s32 pos) { - impl.config->data.options.vsync = pos == 1; + rwConfig()->options.vsync = pos == 1; } static MenuOption VSyncOption = @@ -93,12 +118,12 @@ static MenuOption VSyncOption = static s32 optionVolumeGet() { - return impl.config->data.options.volume; + return getConfig()->options.volume; } static void optionVolumeSet(s32 pos) { - impl.config->data.options.volume = pos; + rwConfig()->options.volume = pos; } static MenuOption VolumeOption = @@ -131,27 +156,27 @@ static const MenuItem OptionMenu[] = static void showOptionsMenu(); static void gameMenuHandler(void* data) { - tic_mem* tic = impl.studio.tic; + tic_mem* tic = state.mem; tic_core_script_config(tic)->callback.gamemenu(tic, *(s32*)data, NULL); resumeGame(); } void freeGameMenu() { - if(impl.gameMenu.items) + if(state.gameMenu->items) { - for(MenuItem *it = impl.gameMenu.items, *end = it + impl.gameMenu.count; it != end; ++it) + for(MenuItem *it = state.gameMenu->items, *end = it + state.gameMenu->count; it != end; ++it) free((void*)it->label); - free(impl.gameMenu.items); - impl.gameMenu.count = 0; - impl.gameMenu.items = NULL; + free(state.gameMenu->items); + state.gameMenu->count = 0; + state.gameMenu->items = NULL; } } void initGameMenu() { - tic_mem* tic = impl.studio.tic; + tic_mem* tic = state.mem; freeGameMenu(); @@ -176,31 +201,19 @@ void initGameMenu() items[count - 2] = (MenuItem){strdup("")}; items[count - 1] = (MenuItem){strdup("BACK"), showMainMenu, .back = true}; - impl.gameMenu.items = items; - impl.gameMenu.count = count; + state.gameMenu->items = items; + state.gameMenu->count = count; } } void showGameMenu() { - studio_menu_init(impl.menu, impl.gameMenu.items, impl.gameMenu.count, 0, 0, showMainMenu, NULL); + studio_menu_init(state.menu, state.gameMenu->items, state.gameMenu->count, 0, 0, showMainMenu, NULL); } static inline s32 mainMenuStart() { - return impl.gameMenu.count ? 0 : 1; -} - -static void exitGame() -{ - if(impl.prevMode == TIC_SURF_MODE) - { - setStudioMode(TIC_SURF_MODE); - } - else - { - setStudioMode(TIC_CONSOLE_MODE); - } + return state.gameMenu->count ? 0 : 1; } static const MenuItem MainMenu[] = @@ -218,23 +231,16 @@ static const MenuItem MainMenu[] = void showMainMenu() { - if(impl.mode != TIC_MENU_MODE) - { - tic_core_pause(impl.studio.tic); - tic_api_reset(impl.studio.tic); - impl.mode = TIC_MENU_MODE; - } - initGameMenu(); s32 start = mainMenuStart(); - studio_menu_init(impl.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); + studio_menu_init(state.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); } static void showOptionsMenuPos(s32 pos) { - studio_menu_init(impl.menu, OptionMenu, + studio_menu_init(state.menu, OptionMenu, COUNT_OF(OptionMenu), pos, COUNT_OF(MainMenu) - 3 - mainMenuStart(), showMainMenu, NULL); } @@ -245,7 +251,7 @@ static void showOptionsMenu() static void saveGamepadMenu() { - impl.config->data.options.mapping = impl.gamepads.mapping; + rwConfig()->options.mapping = impl.gamepads.mapping; showOptionsMenuPos(COUNT_OF(OptionMenu) - 3); } @@ -282,7 +288,7 @@ static void assignMapping(void* data) sprintf(str, Fmt, ButtonLabels[impl.gamepads.key]); - studio_menu_init(impl.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); + studio_menu_init(state.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); } static void initGamepadButtons() @@ -348,7 +354,7 @@ void initGamepadMenu() initGamepadButtons(); - studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), + studio_menu_init(state.menu, GamepadMenu, COUNT_OF(GamepadMenu), impl.gamepads.key < 0 ? KeyMappingStart : impl.gamepads.key + KeyMappingStart, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); diff --git a/src/studio/screens/game_menu.h b/src/studio/screens/game_menu.h index 85eb9f03d..0a27577b6 100644 --- a/src/studio/screens/game_menu.h +++ b/src/studio/screens/game_menu.h @@ -25,4 +25,5 @@ void showGamepadMenu(); void showMainMenu(); void freeGameMenu(); -void initGamepadMenu(); \ No newline at end of file +void initGamepadMenu(); +void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem* mem); \ No newline at end of file diff --git a/src/studio/studio.c b/src/studio/studio.c index b12b90158..4162bb1a8 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1374,6 +1374,18 @@ static void switchBank(s32 bank) #endif +static void enterMainMenu() { + if(impl.mode != TIC_MENU_MODE) + { + tic_core_pause(impl.studio.tic); + tic_api_reset(impl.studio.tic); + impl.mode = TIC_MENU_MODE; + } + + initMainMenu(impl.menu, &impl.gameMenu, impl.config, impl.studio.tic); + showMainMenu(); +} + static void processStudioShortcuts() { tic_mem* tic = impl.studio.tic; @@ -1435,7 +1447,7 @@ static void processStudioShortcuts() switch(impl.mode) { case TIC_MENU_MODE: studio_menu_back(impl.menu); break; - case TIC_RUN_MODE: showMainMenu(); break; + case TIC_RUN_MODE: enterMainMenu(); break; #if defined(BUILD_EDITORS) case TIC_CONSOLE_MODE: setStudioMode(impl.prevMode); break; case TIC_CODE_MODE: @@ -1881,6 +1893,18 @@ static void studioLoad(const char* file) #endif } +void exitGame() +{ + if(impl.prevMode == TIC_SURF_MODE) + { + setStudioMode(TIC_SURF_MODE); + } + else + { + setStudioMode(TIC_CONSOLE_MODE); + } +} + static void studioClose() { { diff --git a/src/studio/studio.h b/src/studio/studio.h index 5e9ef926a..547d3e3bb 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -228,6 +228,7 @@ void gotoCode(); void gotoSurf(); void runGame(); +void exitGame(); void resumeGame(); tic_tiles* getBankTiles(); From 02548a2c5e2bd92b9c49765e045ba9d247df42f5 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 16 Jan 2022 08:38:03 -0500 Subject: [PATCH 245/379] it is main menu really, not game menu --- CMakeLists.txt | 4 +- .../screens/{game_menu.c => main_menu.c} | 38 +++++++++---------- .../screens/{game_menu.h => main_menu.h} | 0 src/studio/studio.c | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) rename src/studio/screens/{game_menu.c => main_menu.c} (89%) rename src/studio/screens/{game_menu.h => main_menu.h} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d3fabf65..e8aa1add3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -812,7 +812,7 @@ set(TIC80STUDIO_SRC ${TIC80LIB_DIR}/studio/screens/console.c ${TIC80LIB_DIR}/studio/screens/run.c ${TIC80LIB_DIR}/studio/screens/menu.c - ${TIC80LIB_DIR}/studio/screens/game_menu.c + ${TIC80LIB_DIR}/studio/screens/main_menu.c ${TIC80LIB_DIR}/studio/screens/surf.c ${TIC80LIB_DIR}/studio/screens/start.c ${TIC80LIB_DIR}/studio/editors/code.c @@ -1099,7 +1099,7 @@ if(BUILD_STUB) src/system/sdl/main.c src/studio/screens/run.c src/studio/screens/menu.c - src/studio/screens/game_menu.c + src/studio/screens/main_menu.c src/studio/screens/start.c src/studio/config.c src/studio/studio.c diff --git a/src/studio/screens/game_menu.c b/src/studio/screens/main_menu.c similarity index 89% rename from src/studio/screens/game_menu.c rename to src/studio/screens/main_menu.c index bd6aa1112..bf22dc42c 100644 --- a/src/studio/screens/game_menu.c +++ b/src/studio/screens/main_menu.c @@ -23,7 +23,7 @@ #include "../studio.h" #include "../studio_impl.h" #include "menu.h" -#include "game_menu.h" +#include "main_menu.h" // TODO: we should be able to shrink this access // currently this is only used for impl.gamepad @@ -38,7 +38,7 @@ struct MenuImpl { }* gameMenu; Config* config; tic_mem* mem; -} state; +} menu_impl; #define OPTION_VALUES(...) \ .values = (const char*[])__VA_ARGS__, \ @@ -46,12 +46,12 @@ struct MenuImpl { // TODO: do we need to lock this down further? static StudioConfig* rwConfig() { - return &state.config->data; + return &menu_impl.config->data; } void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem* mem) { - state = (struct MenuImpl){ + menu_impl = (struct MenuImpl){ .menu = menu, .gameMenu = gameMenu, .config = config, @@ -156,27 +156,27 @@ static const MenuItem OptionMenu[] = static void showOptionsMenu(); static void gameMenuHandler(void* data) { - tic_mem* tic = state.mem; + tic_mem* tic = menu_impl.mem; tic_core_script_config(tic)->callback.gamemenu(tic, *(s32*)data, NULL); resumeGame(); } void freeGameMenu() { - if(state.gameMenu->items) + if(menu_impl.gameMenu->items) { - for(MenuItem *it = state.gameMenu->items, *end = it + state.gameMenu->count; it != end; ++it) + for(MenuItem *it = menu_impl.gameMenu->items, *end = it + menu_impl.gameMenu->count; it != end; ++it) free((void*)it->label); - free(state.gameMenu->items); - state.gameMenu->count = 0; - state.gameMenu->items = NULL; + free(menu_impl.gameMenu->items); + menu_impl.gameMenu->count = 0; + menu_impl.gameMenu->items = NULL; } } void initGameMenu() { - tic_mem* tic = state.mem; + tic_mem* tic = menu_impl.mem; freeGameMenu(); @@ -201,19 +201,19 @@ void initGameMenu() items[count - 2] = (MenuItem){strdup("")}; items[count - 1] = (MenuItem){strdup("BACK"), showMainMenu, .back = true}; - state.gameMenu->items = items; - state.gameMenu->count = count; + menu_impl.gameMenu->items = items; + menu_impl.gameMenu->count = count; } } void showGameMenu() { - studio_menu_init(state.menu, state.gameMenu->items, state.gameMenu->count, 0, 0, showMainMenu, NULL); + studio_menu_init(menu_impl.menu, menu_impl.gameMenu->items, menu_impl.gameMenu->count, 0, 0, showMainMenu, NULL); } static inline s32 mainMenuStart() { - return state.gameMenu->count ? 0 : 1; + return menu_impl.gameMenu->count ? 0 : 1; } static const MenuItem MainMenu[] = @@ -235,12 +235,12 @@ void showMainMenu() s32 start = mainMenuStart(); - studio_menu_init(state.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); + studio_menu_init(menu_impl.menu, MainMenu + start, COUNT_OF(MainMenu) - start, 0, 0, resumeGame, NULL); } static void showOptionsMenuPos(s32 pos) { - studio_menu_init(state.menu, OptionMenu, + studio_menu_init(menu_impl.menu, OptionMenu, COUNT_OF(OptionMenu), pos, COUNT_OF(MainMenu) - 3 - mainMenuStart(), showMainMenu, NULL); } @@ -288,7 +288,7 @@ static void assignMapping(void* data) sprintf(str, Fmt, ButtonLabels[impl.gamepads.key]); - studio_menu_init(state.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); + studio_menu_init(menu_impl.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); } static void initGamepadButtons() @@ -354,7 +354,7 @@ void initGamepadMenu() initGamepadButtons(); - studio_menu_init(state.menu, GamepadMenu, COUNT_OF(GamepadMenu), + studio_menu_init(menu_impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), impl.gamepads.key < 0 ? KeyMappingStart : impl.gamepads.key + KeyMappingStart, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); diff --git a/src/studio/screens/game_menu.h b/src/studio/screens/main_menu.h similarity index 100% rename from src/studio/screens/game_menu.h rename to src/studio/screens/main_menu.h diff --git a/src/studio/studio.c b/src/studio/studio.c index 4162bb1a8..5fde73d86 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -44,7 +44,7 @@ #include "screens/start.h" #include "screens/run.h" #include "screens/menu.h" -#include "screens/game_menu.h" +#include "screens/main_menu.h" #include "config.h" #include "cart.h" From 0cb42e9aa8946e00bbacbc860d606c08cb31bc00 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 16 Jan 2022 13:56:16 -0500 Subject: [PATCH 246/379] no need to free if we have never opened menu --- src/studio/screens/main_menu.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/studio/screens/main_menu.c b/src/studio/screens/main_menu.c index bf22dc42c..0b914e557 100644 --- a/src/studio/screens/main_menu.c +++ b/src/studio/screens/main_menu.c @@ -163,6 +163,9 @@ static void gameMenuHandler(void* data) void freeGameMenu() { + // we may never have opened the menu + if (!menu_impl.gameMenu) return; + if(menu_impl.gameMenu->items) { for(MenuItem *it = menu_impl.gameMenu->items, *end = it + menu_impl.gameMenu->count; it != end; ++it) From 83f44341ff795089b07447369b298b37c08c9827 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Mon, 17 Jan 2022 09:38:00 -0500 Subject: [PATCH 247/379] pass Gamepads struct pointer to main menu --- src/studio/screens/main_menu.c | 40 ++++++++++++++++------------------ src/studio/screens/main_menu.h | 2 +- src/studio/studio.c | 2 +- src/studio/studio_impl.h | 14 +++++++----- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/studio/screens/main_menu.c b/src/studio/screens/main_menu.c index 0b914e557..173934c36 100644 --- a/src/studio/screens/main_menu.c +++ b/src/studio/screens/main_menu.c @@ -25,10 +25,6 @@ #include "menu.h" #include "main_menu.h" -// TODO: we should be able to shrink this access -// currently this is only used for impl.gamepad -extern StudioImplementation impl; - struct MenuImpl { Menu* menu; struct @@ -36,8 +32,9 @@ struct MenuImpl { MenuItem* items; s32 count; }* gameMenu; + Gamepads* gamepads; Config* config; - tic_mem* mem; + tic_mem* mem; } menu_impl; #define OPTION_VALUES(...) \ @@ -50,12 +47,13 @@ static StudioConfig* rwConfig() { } -void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem* mem) { +void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem *mem, Gamepads *gamepads) { menu_impl = (struct MenuImpl){ .menu = menu, .gameMenu = gameMenu, .config = config, - .mem = mem + .mem = mem, + .gamepads = gamepads }; } @@ -254,7 +252,7 @@ static void showOptionsMenu() static void saveGamepadMenu() { - rwConfig()->options.mapping = impl.gamepads.mapping; + rwConfig()->options.mapping = menu_impl.gamepads->mapping; showOptionsMenuPos(COUNT_OF(OptionMenu) - 3); } @@ -278,7 +276,7 @@ enum{KeyMappingStart = 2}; static void assignMapping(void* data) { - impl.gamepads.key = *(s32*)data - KeyMappingStart; + menu_impl.gamepads->key = *(s32*)data - KeyMappingStart; static const char Fmt[] = "to assign to (%s) button..."; static char str[sizeof Fmt + STRLEN("RIGHT")]; @@ -289,7 +287,7 @@ static void assignMapping(void* data) {str}, }; - sprintf(str, Fmt, ButtonLabels[impl.gamepads.key]); + sprintf(str, Fmt, ButtonLabels[menu_impl.gamepads->key]); studio_menu_init(menu_impl.menu, AssignKeyMenu, COUNT_OF(AssignKeyMenu), 1, 0, NULL, NULL); } @@ -311,18 +309,18 @@ static void initGamepadButtons() "F7", "F8", "F9", "F10", "F11", "F12", }; - for(s32 i = 0, index = impl.gamepads.index * TIC_BUTTONS; i != TIC_BUTTONS; ++i) - sprintf(MappingItems[i], "%-5s - %-5s", ButtonLabels[i], KeysList[impl.gamepads.mapping.data[index++]]); + for(s32 i = 0, index = menu_impl.gamepads->index * TIC_BUTTONS; i != TIC_BUTTONS; ++i) + sprintf(MappingItems[i], "%-5s - %-5s", ButtonLabels[i], KeysList[menu_impl.gamepads->mapping.data[index++]]); } static s32 optionGamepadGet() { - return impl.gamepads.index; + return menu_impl.gamepads->index; } static void optionGamepadSet(s32 pos) { - impl.gamepads.index = pos; + menu_impl.gamepads->index = pos; initGamepadButtons(); } @@ -358,24 +356,24 @@ void initGamepadMenu() initGamepadButtons(); studio_menu_init(menu_impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), - impl.gamepads.key < 0 ? KeyMappingStart : impl.gamepads.key + KeyMappingStart, + menu_impl.gamepads->key < 0 ? KeyMappingStart : menu_impl.gamepads->key + KeyMappingStart, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); - impl.gamepads.key = -1; + menu_impl.gamepads->key = -1; } static void resetGamepadMenu() { - impl.gamepads.index = 0; - ZEROMEM(impl.gamepads.mapping); - tic_sys_default_mapping(&impl.gamepads.mapping); + menu_impl.gamepads->index = 0; + ZEROMEM(menu_impl.gamepads->mapping); + tic_sys_default_mapping(&menu_impl.gamepads->mapping); initGamepadMenu(); } void showGamepadMenu() { - impl.gamepads.index = 0; - impl.gamepads.mapping = getConfig()->options.mapping; + menu_impl.gamepads->index = 0; + menu_impl.gamepads->mapping = getConfig()->options.mapping; initGamepadMenu(); } \ No newline at end of file diff --git a/src/studio/screens/main_menu.h b/src/studio/screens/main_menu.h index 0a27577b6..8b7b921b5 100644 --- a/src/studio/screens/main_menu.h +++ b/src/studio/screens/main_menu.h @@ -26,4 +26,4 @@ void showGamepadMenu(); void showMainMenu(); void freeGameMenu(); void initGamepadMenu(); -void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem* mem); \ No newline at end of file +void initMainMenu(Menu *menu, void *gameMenu, Config *config, tic_mem* mem, Gamepads *gamepads); \ No newline at end of file diff --git a/src/studio/studio.c b/src/studio/studio.c index 5fde73d86..b85d2d372 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1382,7 +1382,7 @@ static void enterMainMenu() { impl.mode = TIC_MENU_MODE; } - initMainMenu(impl.menu, &impl.gameMenu, impl.config, impl.studio.tic); + initMainMenu(impl.menu, &impl.gameMenu, impl.config, impl.studio.tic, &impl.gamepads); showMainMenu(); } diff --git a/src/studio/studio_impl.h b/src/studio/studio_impl.h index 16cd57611..8c6450af5 100644 --- a/src/studio/studio_impl.h +++ b/src/studio/studio_impl.h @@ -87,6 +87,13 @@ typedef struct } MouseState; +typedef struct +{ + tic_mapping mapping; + s32 index; + s32 key; +} Gamepads; + typedef struct _StudioImplementation { Studio studio; @@ -169,12 +176,7 @@ typedef struct _StudioImplementation tic_net* net; #endif - struct - { - tic_mapping mapping; - s32 index; - s32 key; - } gamepads; + Gamepads gamepads; Start* start; Run* run; From 15940de9f07925b16d69e639d17fc430928ae0ef Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sat, 22 Jan 2022 11:23:37 +0100 Subject: [PATCH 248/379] Fix compilation for emscripten libretro --- CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8aa1add3..d04fa65a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -568,10 +568,15 @@ if(BUILD_LIBRETRO) add_library(tic80_libretro STATIC ${LIBRETRO_SRC} ) + if(EMSCRIPTEN) + set(LIBRETRO_EXTENSION "bc") + else() + set(LIBRETRO_EXTENSION "a") + endif() set_target_properties(tic80_libretro PROPERTIES SUFFIX "_partial.a") add_custom_command(TARGET tic80_libretro POST_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.a ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIB}) + COMMAND ${CMAKE_SOURCE_DIR}/build/libretro/merge_static.sh $(AR) ${CMAKE_BINARY_DIR}/lib/tic80_libretro${LIBRETRO_SUFFIX}.${LIBRETRO_EXTENSION} ${CMAKE_BINARY_DIR}/lib/tic80_libretro_partial.a ${CMAKE_BINARY_DIR}/lib/libtic80core.a ${CMAKE_BINARY_DIR}/lib/liblua.a ${CMAKE_BINARY_DIR}/lib/libblipbuf.a ${CMAKE_BINARY_DIR}/lib/libduktape.a ${CMAKE_BINARY_DIR}/lib/libwren.a ${CMAKE_BINARY_DIR}/lib/libsquirrel.a ${CMAKE_BINARY_DIR}/lib/libgiflib.a ${CMAKE_BINARY_DIR}/lib/liblpeg.a ${MRUBY_LIB}) else() add_library(tic80_libretro SHARED ${LIBRETRO_SRC} @@ -590,10 +595,6 @@ if(BUILD_LIBRETRO) set_target_properties(tic80_libretro PROPERTIES SUFFIX "_android.so") endif() - if(EMSCRIPTEN) - set_target_properties(tic80_libretro PROPERTIES SUFFIX "_emscripten.bc") - endif() - # MSYS2 builds libretro to ./bin, despite it being a DLL. This forces it to ./lib. set_target_properties(tic80_libretro PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib From 66c97236e3aa79cca8760c8fb1b203573e69d159 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 20:25:47 -0500 Subject: [PATCH 249/379] mruby: Initial commit for optional Ruby --- .gitignore | 1 + CMakeLists.txt | 106 ++++++++++++++++++++++------------------- include/tic80_config.h | 8 ++-- src/api/mruby.c | 2 +- src/core/languages.c | 4 +- src/studio/demos.c | 2 +- 6 files changed, 66 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index 63d35244e..a6eff525b 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ build/uwp/code8/AppPackages/ build/uwp/code8/_pkginfo.txt build/uwp/tic/tic.VC.db build/uwp/tic/_pkginfo.txt +build/mruby_vendor-prefix tests/history.exe build/uwp/lua/x64/ build/uwp/lua/ARM/ diff --git a/CMakeLists.txt b/CMakeLists.txt index d04fa65a2..9c48a8ddd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,62 +243,65 @@ target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) find_program(RUBY ruby) find_program(RAKE rake) if(NOT RAKE) - message(FATAL_ERROR "Program `rake' not found! Ruby \"rake\" is required to build mruby support.") -endif() - -set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby) -set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) -if(ANDROID) - set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_android.rb) + message(WARNING "mruby: Program `rake' not found! Ruby \"rake\" is required to build mruby support.") + add_library(mruby INTERFACE) + set(TIC_BUILD_WITH_MRUBY FALSE) else() - set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_default.rb) -endif() -set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) + set(TIC_BUILD_WITH_MRUBY TRUE) + set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby) + set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) + if(ANDROID) + set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_android.rb) + else() + set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_default.rb) + endif() + set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) -if(MSVC) - set(MRUBY_TOOLCHAIN visualcpp) -elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(MRUBY_TOOLCHAIN clang) -else() - set(MRUBY_TOOLCHAIN gcc) -endif() + if(MSVC) + set(MRUBY_TOOLCHAIN visualcpp) + elseif(APPLE OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(MRUBY_TOOLCHAIN clang) + else() + set(MRUBY_TOOLCHAIN gcc) + endif() -if(APPLE) - exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE MRUBY_SYSROOT) -endif() + if(APPLE) + exec_program(xcrun ARGS --sdk macosx --show-sdk-path OUTPUT_VARIABLE MRUBY_SYSROOT) + endif() -if(ANDROID_NDK_HOME) - set(MRUBY_RAKE_EXTRA_OPTS "${MRUBY_RAKE_EXTRA_OPTS} ANDROID_NDK_HOME=${ANDROID_NDK_HOME}") -endif() + if(ANDROID_NDK_HOME) + set(MRUBY_RAKE_EXTRA_OPTS "${MRUBY_RAKE_EXTRA_OPTS} ANDROID_NDK_HOME=${ANDROID_NDK_HOME}") + endif() -ExternalProject_Add(mruby_vendor - SOURCE_DIR ${MRUBY_DIR} - CONFIGURE_COMMAND "" - BUILD_IN_SOURCE TRUE - BUILD_COMMAND - ${RAKE} clean all "MRUBY_CONFIG=${MRUBY_CONFIG}" - "TARGET_CC=\"${CMAKE_C_COMPILER}\"" - "TARGET_AR=\"${CMAKE_AR}\"" - "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" - "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" - "BUILD_TYPE=${BUILD_TYPE_UC}" - "MRUBY_SYSROOT=${MRUBY_SYSROOT}" - "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" - "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" - "ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}" - ${MRUBY_RAKE_EXTRA_OPTS} - INSTALL_COMMAND "" - BUILD_BYPRODUCTS ${MRUBY_LIB} -) + ExternalProject_Add(mruby_vendor + SOURCE_DIR ${MRUBY_DIR} + CONFIGURE_COMMAND "" + BUILD_IN_SOURCE TRUE + BUILD_COMMAND + ${RAKE} clean all "MRUBY_CONFIG=${MRUBY_CONFIG}" + "TARGET_CC=\"${CMAKE_C_COMPILER}\"" + "TARGET_AR=\"${CMAKE_AR}\"" + "TARGET_CFLAGS=${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BUILD_TYPE_UC}}" + "TARGET_LDFLAGS=${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LINKER_FLAGS_${BUILD_TYPE_UC}}" + "BUILD_TYPE=${BUILD_TYPE_UC}" + "MRUBY_SYSROOT=${MRUBY_SYSROOT}" + "MRUBY_TOOLCHAIN=${MRUBY_TOOLCHAIN}" + "ANDROID_ARCH=${CMAKE_ANDROID_ARCH_ABI}" + "ANDROID_PLATFORM=android-${CMAKE_SYSTEM_VERSION}" + ${MRUBY_RAKE_EXTRA_OPTS} + INSTALL_COMMAND "" + BUILD_BYPRODUCTS ${MRUBY_LIB} + ) -add_library(mruby STATIC IMPORTED GLOBAL) -set_property(TARGET mruby APPEND - PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} -) -set_property(TARGET mruby APPEND - PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include -) -add_dependencies(mruby mruby_vendor) + add_library(mruby STATIC IMPORTED GLOBAL) + set_property(TARGET mruby APPEND + PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} + ) + set_property(TARGET mruby APPEND + PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include + ) + add_dependencies(mruby mruby_vendor) +endif() ################################ # SQUIRREL @@ -418,6 +421,9 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) mruby ) + target_compile_definitions(tic80core${SCRIPT} PRIVATE TIC_BUILD_WITH_MRUBY=${TIC_BUILD_WITH_MRUBY}) + + if(${BUILD_DEPRECATED}) target_compile_definitions(tic80core${SCRIPT} PRIVATE DEPRECATED_CHUNKS) target_link_libraries(tic80core${SCRIPT} giflib) diff --git a/include/tic80_config.h b/include/tic80_config.h index 1a884d19b..5540aaabd 100644 --- a/include/tic80_config.h +++ b/include/tic80_config.h @@ -27,8 +27,7 @@ !defined(TIC_BUILD_WITH_FENNEL) && \ !defined(TIC_BUILD_WITH_JS) && \ !defined(TIC_BUILD_WITH_WREN) && \ - !defined(TIC_BUILD_WITH_SQUIRREL) && \ - !defined(TIC_BUILD_WITH_MRUBY) + !defined(TIC_BUILD_WITH_SQUIRREL) # define TIC_BUILD_WITH_LUA 1 # define TIC_BUILD_WITH_MOON 1 @@ -36,10 +35,13 @@ # define TIC_BUILD_WITH_JS 1 # define TIC_BUILD_WITH_WREN 1 # define TIC_BUILD_WITH_SQUIRREL 1 -# define TIC_BUILD_WITH_MRUBY 1 #endif +#if !defined(TIC_BUILD_WITH_MRUBY) +# define TIC_BUILD_WITH_MRUBY 1 +#endif + #if defined(TIC_BUILD_WITH_FENNEL) || defined(TIC_BUILD_WITH_MOON) # define TIC_BUILD_WITH_LUA 1 #endif diff --git a/src/api/mruby.c b/src/api/mruby.c index bead1d97a..842e822b6 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -23,7 +23,7 @@ #include "core/core.h" -#if defined(TIC_BUILD_WITH_MRUBY) +#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY #include #include diff --git a/src/core/languages.c b/src/core/languages.c index 06dcd96e8..ddb63da0a 100644 --- a/src/core/languages.c +++ b/src/core/languages.c @@ -1,7 +1,7 @@ #include #include "api.h" -#if defined(TIC_BUILD_WITH_MRUBY) +#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY extern tic_script_config MRubySyntaxConfig; #endif @@ -35,7 +35,7 @@ tic_script_config* Languages[] = { &LuaSyntaxConfig, #endif - #if defined(TIC_BUILD_WITH_MRUBY) + #if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY &MRubySyntaxConfig, #endif diff --git a/src/studio/demos.c b/src/studio/demos.c index 6c87b86b1..69bd8fd37 100644 --- a/src/studio/demos.c +++ b/src/studio/demos.c @@ -88,7 +88,7 @@ tic_script_config_extra JsSyntaxConfigExtra = #endif -#if defined(TIC_BUILD_WITH_MRUBY) +#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY static const u8 RubyDemoRom[] = { From 7d97e6b713da1f01bf90ef7e9dc4b0918e8bffb4 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 20:59:02 -0500 Subject: [PATCH 250/379] mruby: Only build the Ruby demos if building with mruby --- src/studio/demos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/studio/demos.c b/src/studio/demos.c index 69bd8fd37..c15190232 100644 --- a/src/studio/demos.c +++ b/src/studio/demos.c @@ -187,7 +187,7 @@ tic_script_config_extra* LanguagesExtra[] = { #if defined(TIC_BUILD_WITH_JS) &JsSyntaxConfigExtra, #endif -#if defined(TIC_BUILD_WITH_MRUBY) +#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY &MRubySyntaxConfigExtra, #endif NULL From 29480caa0cbb9681f66b3596ebbc652a046f6fc9 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 21:20:12 -0500 Subject: [PATCH 251/379] mruby: Fix whitespace --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c48a8ddd..f34040b9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -423,7 +423,6 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) target_compile_definitions(tic80core${SCRIPT} PRIVATE TIC_BUILD_WITH_MRUBY=${TIC_BUILD_WITH_MRUBY}) - if(${BUILD_DEPRECATED}) target_compile_definitions(tic80core${SCRIPT} PRIVATE DEPRECATED_CHUNKS) target_link_libraries(tic80core${SCRIPT} giflib) From 9f754bae8bf29cc685fc1eb19ce11e9bb1039abb Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 21:44:48 -0500 Subject: [PATCH 252/379] mruby: Tweak the mruby option --- CMakeLists.txt | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f34040b9c..5bad167a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,11 +243,14 @@ target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) find_program(RUBY ruby) find_program(RAKE rake) if(NOT RAKE) - message(WARNING "mruby: Program `rake' not found! Ruby \"rake\" is required to build mruby support.") - add_library(mruby INTERFACE) - set(TIC_BUILD_WITH_MRUBY FALSE) + set(BUILD_WITH_MRUBY_DEFAULT FALSE) else() - set(TIC_BUILD_WITH_MRUBY TRUE) + set(BUILD_WITH_MRUBY_DEFAULT TRUE) +endif() +option(BUILD_WITH_MRUBY "mruby Enabled" ${BUILD_WITH_MRUBY_DEFAULT}) +message("BUILD_WITH_MRUBY: " ${BUILD_WITH_MRUBY}) + +if(BUILD_WITH_MRUBY) set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby) set(MRUBY_DIR ${THIRDPARTY_DIR}/mruby) if(ANDROID) @@ -418,10 +421,11 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) duktape blipbuf zlib - mruby ) - target_compile_definitions(tic80core${SCRIPT} PRIVATE TIC_BUILD_WITH_MRUBY=${TIC_BUILD_WITH_MRUBY}) + if(BUILD_WITH_MRUBY) + target_link_libraries(tic80core${SCRIPT} mruby) + endif() if(${BUILD_DEPRECATED}) target_compile_definitions(tic80core${SCRIPT} PRIVATE DEPRECATED_CHUNKS) @@ -446,7 +450,9 @@ if(BUILD_STUB) MACRO_CORE(js TIC_BUILD_WITH_JS FALSE) MACRO_CORE(wren TIC_BUILD_WITH_WREN FALSE) MACRO_CORE(squirrel TIC_BUILD_WITH_SQUIRREL FALSE) - MACRO_CORE(ruby TIC_BUILD_WITH_MRUBY FALSE) + if(BUILD_WITH_MRUBY) + MACRO_CORE(ruby TIC_BUILD_WITH_MRUBY FALSE) + endif() endif() From 3feb050a65dce8ef27297177c9ce0583c221fdae Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 21:52:35 -0500 Subject: [PATCH 253/379] mruby: Fix the MRUBY define --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5bad167a2..d590486b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -437,6 +437,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) endif() target_compile_definitions(tic80core${SCRIPT} PUBLIC ${DEFINE}) + target_compile_definitions(tic80core PRIVATE TIC_BUILD_WITH_MRUBY=${BUILD_WITH_MRUBY}) endmacro() From 4f3c3ecf10c3526f0773613ddb68493123cb643b Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 22:29:14 -0500 Subject: [PATCH 254/379] mruby: Fix the option checks --- CMakeLists.txt | 7 +++++-- include/tic80_config.h | 4 ---- src/api/mruby.c | 3 +-- src/core/languages.c | 4 ++-- src/studio/demos.c | 4 ++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d590486b2..69ad1effa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -248,7 +248,7 @@ else() set(BUILD_WITH_MRUBY_DEFAULT TRUE) endif() option(BUILD_WITH_MRUBY "mruby Enabled" ${BUILD_WITH_MRUBY_DEFAULT}) -message("BUILD_WITH_MRUBY: " ${BUILD_WITH_MRUBY}) +message("BUILD_WITH_MRUBY: ${BUILD_WITH_MRUBY}") if(BUILD_WITH_MRUBY) set(MRUBY_BUILDDIR ${CMAKE_SOURCE_DIR}/build/mruby) @@ -437,7 +437,6 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) endif() target_compile_definitions(tic80core${SCRIPT} PUBLIC ${DEFINE}) - target_compile_definitions(tic80core PRIVATE TIC_BUILD_WITH_MRUBY=${BUILD_WITH_MRUBY}) endmacro() @@ -457,6 +456,10 @@ if(BUILD_STUB) endif() +if(BUILD_WITH_MRUBY) + target_compile_definitions(tic80core PUBLIC TIC_BUILD_WITH_MRUBY=1) +endif() + ################################ # SDL2 ################################ diff --git a/include/tic80_config.h b/include/tic80_config.h index 5540aaabd..222981dab 100644 --- a/include/tic80_config.h +++ b/include/tic80_config.h @@ -38,10 +38,6 @@ #endif -#if !defined(TIC_BUILD_WITH_MRUBY) -# define TIC_BUILD_WITH_MRUBY 1 -#endif - #if defined(TIC_BUILD_WITH_FENNEL) || defined(TIC_BUILD_WITH_MOON) # define TIC_BUILD_WITH_LUA 1 #endif diff --git a/src/api/mruby.c b/src/api/mruby.c index 842e822b6..c178a3244 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -22,8 +22,7 @@ // SOFTWARE. #include "core/core.h" - -#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY +#if defined(TIC_BUILD_WITH_MRUBY) #include #include diff --git a/src/core/languages.c b/src/core/languages.c index ddb63da0a..06dcd96e8 100644 --- a/src/core/languages.c +++ b/src/core/languages.c @@ -1,7 +1,7 @@ #include #include "api.h" -#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY +#if defined(TIC_BUILD_WITH_MRUBY) extern tic_script_config MRubySyntaxConfig; #endif @@ -35,7 +35,7 @@ tic_script_config* Languages[] = { &LuaSyntaxConfig, #endif - #if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY + #if defined(TIC_BUILD_WITH_MRUBY) &MRubySyntaxConfig, #endif diff --git a/src/studio/demos.c b/src/studio/demos.c index c15190232..6c87b86b1 100644 --- a/src/studio/demos.c +++ b/src/studio/demos.c @@ -88,7 +88,7 @@ tic_script_config_extra JsSyntaxConfigExtra = #endif -#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY +#if defined(TIC_BUILD_WITH_MRUBY) static const u8 RubyDemoRom[] = { @@ -187,7 +187,7 @@ tic_script_config_extra* LanguagesExtra[] = { #if defined(TIC_BUILD_WITH_JS) &JsSyntaxConfigExtra, #endif -#if defined(TIC_BUILD_WITH_MRUBY) && TIC_BUILD_WITH_MRUBY +#if defined(TIC_BUILD_WITH_MRUBY) &MRubySyntaxConfigExtra, #endif NULL From 79cc81a81404f0c10abdb0fcbaafc8553cf0bf67 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sun, 23 Jan 2022 22:34:30 -0500 Subject: [PATCH 255/379] mruby: Fix whitespace --- src/api/mruby.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/api/mruby.c b/src/api/mruby.c index c178a3244..bead1d97a 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -22,6 +22,7 @@ // SOFTWARE. #include "core/core.h" + #if defined(TIC_BUILD_WITH_MRUBY) #include From 593d695aead40156f3ce783032069b001ef83a26 Mon Sep 17 00:00:00 2001 From: nesbox Date: Sun, 23 Jan 2022 12:41:50 +0300 Subject: [PATCH 256/379] take screenshot/video shortcut fix --- src/studio/studio.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/studio/studio.c b/src/studio/studio.c index b85d2d372..62f39d088 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1463,16 +1463,19 @@ static void processStudioShortcuts() } #if defined(BUILD_EDITORS) - else if(impl.mode != TIC_RUN_MODE) + else if(keyWasPressedOnce(tic_key_f8)) takeScreenshot(); + else if(keyWasPressedOnce(tic_key_f9)) startVideoRecord(); + else if(impl.mode == TIC_RUN_MODE) + { + if(keyWasPressedOnce(tic_key_f7)) setCoverImage(); + } + else { if(keyWasPressedOnce(tic_key_f1)) setStudioMode(TIC_CODE_MODE); else if(keyWasPressedOnce(tic_key_f2)) setStudioMode(TIC_SPRITE_MODE); else if(keyWasPressedOnce(tic_key_f3)) setStudioMode(TIC_MAP_MODE); else if(keyWasPressedOnce(tic_key_f4)) setStudioMode(TIC_SFX_MODE); else if(keyWasPressedOnce(tic_key_f5)) setStudioMode(TIC_MUSIC_MODE); - else if(keyWasPressedOnce(tic_key_f7)) setCoverImage(); - else if(keyWasPressedOnce(tic_key_f8)) takeScreenshot(); - else if(keyWasPressedOnce(tic_key_f9)) startVideoRecord(); } #endif } From 46b590eca9e85bfeba965aa5fe1a638b3e56c692 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 26 Jan 2022 19:18:39 +0300 Subject: [PATCH 257/379] CI build fix --- .github/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0f652276f..187ab3d3e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,7 +9,7 @@ jobs: # === Windows XP === winxp: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v2 @@ -42,7 +42,7 @@ jobs: # === Windows XP PRO === winxp-pro: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v2 @@ -69,7 +69,7 @@ jobs: # === Windows === windows: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v2 @@ -102,7 +102,7 @@ jobs: # === Windows PRO === windows-pro: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v2 @@ -129,7 +129,7 @@ jobs: # === Windows Sokol === windows-sokol: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v2 From e463cc68527df10153107d84a762ef30a8f11c29 Mon Sep 17 00:00:00 2001 From: nesbox Date: Thu, 27 Jan 2022 09:08:19 +0300 Subject: [PATCH 258/379] new accurate triangle and line rasterizer #1644 --- src/api.h | 6 +- src/api/js.c | 16 +-- src/api/lua.c | 16 +-- src/api/mruby.c | 20 +-- src/api/squirrel.c | 36 +++-- src/api/wren.c | 20 +-- src/core/core.h | 2 +- src/core/draw.c | 350 ++++++++++++++++++++------------------------- src/defines.h | 2 + 9 files changed, 219 insertions(+), 249 deletions(-) diff --git a/src/api.h b/src/api.h index 9f6f42e82..f175985e5 100644 --- a/src/api.h +++ b/src/api.h @@ -213,7 +213,7 @@ enum 5, \ 0, \ void, \ - tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, u8 color) \ + tic_mem*, float x1, float y1, float x2, float y2, u8 color) \ \ \ macro(rect, \ @@ -662,7 +662,7 @@ enum 7, \ 0, \ void, \ - tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) \ + tic_mem*, float x1, float y1, float x2, float y2, float x3, float y3, u8 color) \ \ macro(trib, \ "trib(x1 y1 x2 y2 x3 y3 color)", \ @@ -672,7 +672,7 @@ enum 7, \ 0, \ void, \ - tic_mem*, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) \ + tic_mem*, float x1, float y1, float x2, float y2, float x3, float y3, u8 color) \ \ \ macro(textri, \ diff --git a/src/api/js.c b/src/api/js.c index c7ad8b96b..146a0c49b 100644 --- a/src/api/js.c +++ b/src/api/js.c @@ -104,10 +104,10 @@ static duk_ret_t duk_pix(duk_context* duk) static duk_ret_t duk_line(duk_context* duk) { - s32 x0 = duk_to_int(duk, 0); - s32 y0 = duk_to_int(duk, 1); - s32 x1 = duk_to_int(duk, 2); - s32 y1 = duk_to_int(duk, 3); + float x0 = duk_to_number(duk, 0); + float y0 = duk_to_number(duk, 1); + float x1 = duk_to_number(duk, 2); + float y1 = duk_to_number(duk, 3); s32 color = duk_to_int(duk, 4); tic_mem* tic = (tic_mem*)getDukCore(duk); @@ -777,10 +777,10 @@ static duk_ret_t duk_ellib(duk_context* duk) static duk_ret_t duk_tri(duk_context* duk) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) - pt[i] = duk_to_int(duk, i); + pt[i] = duk_to_number(duk, i); s32 color = duk_to_int(duk, 6); @@ -793,10 +793,10 @@ static duk_ret_t duk_tri(duk_context* duk) static duk_ret_t duk_trib(duk_context* duk) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) - pt[i] = duk_to_int(duk, i); + pt[i] = duk_to_number(duk, i); s32 color = duk_to_int(duk, 6); diff --git a/src/api/lua.c b/src/api/lua.c index 025cee6b7..f586c1b56 100644 --- a/src/api/lua.c +++ b/src/api/lua.c @@ -237,10 +237,10 @@ static s32 lua_line(lua_State* lua) if(top == 5) { - s32 x0 = getLuaNumber(lua, 1); - s32 y0 = getLuaNumber(lua, 2); - s32 x1 = getLuaNumber(lua, 3); - s32 y1 = getLuaNumber(lua, 4); + float x0 = lua_tonumber(lua, 1); + float y0 = lua_tonumber(lua, 2); + float x1 = lua_tonumber(lua, 3); + float y1 = lua_tonumber(lua, 4); s32 color = getLuaNumber(lua, 5); tic_mem* tic = (tic_mem*)getLuaCore(lua); @@ -382,10 +382,10 @@ static s32 lua_tri(lua_State* lua) if(top == 7) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) - pt[i] = getLuaNumber(lua, i+1); + pt[i] = lua_tonumber(lua, i+1); s32 color = getLuaNumber(lua, 7); @@ -404,10 +404,10 @@ static s32 lua_trib(lua_State* lua) if(top == 7) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) - pt[i] = getLuaNumber(lua, i+1); + pt[i] = lua_tonumber(lua, i+1); s32 color = getLuaNumber(lua, 7); diff --git a/src/api/mruby.c b/src/api/mruby.c index bead1d97a..a6a4ecf7c 100644 --- a/src/api/mruby.c +++ b/src/api/mruby.c @@ -180,8 +180,9 @@ static mrb_value mrb_pix(mrb_state* mrb, mrb_value self) static mrb_value mrb_line(mrb_state* mrb, mrb_value self) { - mrb_int x0, y0, x1, y1, color; - mrb_get_args(mrb, "iiiii", &x0, &y0, &x1, &y1, &color); + mrb_float x0, y0, x1, y1; + mrb_int color; + mrb_get_args(mrb, "ffffi", &x0, &y0, &x1, &y1, &color); tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); @@ -272,8 +273,9 @@ static mrb_value mrb_ellib(mrb_state* mrb, mrb_value self) static mrb_value mrb_tri(mrb_state* mrb, mrb_value self) { - mrb_int x1, y1, x2, y2, x3, y3, color; - mrb_get_args(mrb, "iiiiiii", &x1, &y1, &x2, &y2, &x3, &y3, &color); + mrb_float x1, y1, x2, y2, x3, y3; + mrb_int color; + mrb_get_args(mrb, "ffffffi", &x1, &y1, &x2, &y2, &x3, &y3, &color); tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); @@ -284,8 +286,9 @@ static mrb_value mrb_tri(mrb_state* mrb, mrb_value self) static mrb_value mrb_trib(mrb_state* mrb, mrb_value self) { - mrb_int x1, y1, x2, y2, x3, y3, color; - mrb_get_args(mrb, "iiiiiii", &x1, &y1, &x2, &y2, &x3, &y3, &color); + mrb_float x1, y1, x2, y2, x3, y3; + mrb_int color; + mrb_get_args(mrb, "ffffffi", &x1, &y1, &x2, &y2, &x3, &y3, &color); tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); @@ -298,8 +301,9 @@ static mrb_value mrb_textri(mrb_state* mrb, mrb_value self) { mrb_value chroma = mrb_fixnum_value(0xff); mrb_bool use_map = false; - mrb_int x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3; - mrb_int argc = mrb_get_args(mrb, "iiiiiiiiiiii|bo", + + mrb_float x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3; + mrb_int argc = mrb_get_args(mrb, "ffffffffffff|bo", &x1, &y1, &x2, &y2, &x3, &y3, &u1, &v1, &u2, &v2, &u3, &v3, &use_map, &chroma); diff --git a/src/api/squirrel.c b/src/api/squirrel.c index e927a07b7..e6afb4479 100644 --- a/src/api/squirrel.c +++ b/src/api/squirrel.c @@ -37,6 +37,12 @@ static const char TicCore[] = "_TIC80"; +static float getSquirrelFloat(HSQUIRRELVM vm, s32 index) +{ + SQFloat f = 0.0; + sq_getfloat(vm, index, &f); + return f; +} // !TODO: get rid of this wrap static s32 getSquirrelNumber(HSQUIRRELVM vm, s32 index) @@ -45,11 +51,7 @@ static s32 getSquirrelNumber(HSQUIRRELVM vm, s32 index) if (SQ_SUCCEEDED(sq_getinteger(vm, index, &i))) return (s32)i; - SQFloat f; - if (SQ_SUCCEEDED(sq_getfloat(vm, index, &f))) - return (s32)f; - - return 0; + return (s32)getSquirrelFloat(vm, index); } static void registerSquirrelFunction(tic_core* core, SQFUNCTION func, const char *name) @@ -278,18 +280,16 @@ static SQInteger squirrel_pix(HSQUIRRELVM vm) return 0; } - - static SQInteger squirrel_line(HSQUIRRELVM vm) { SQInteger top = sq_gettop(vm); if(top == 6) { - s32 x0 = getSquirrelNumber(vm, 2); - s32 y0 = getSquirrelNumber(vm, 3); - s32 x1 = getSquirrelNumber(vm, 4); - s32 y1 = getSquirrelNumber(vm, 5); + float x0 = getSquirrelFloat(vm, 2); + float y0 = getSquirrelFloat(vm, 3); + float x1 = getSquirrelFloat(vm, 4); + float y1 = getSquirrelFloat(vm, 5); s32 color = getSquirrelNumber(vm, 6); tic_mem* tic = (tic_mem*)getSquirrelCore(vm); @@ -431,10 +431,10 @@ static SQInteger squirrel_tri(HSQUIRRELVM vm) if(top == 8) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) - pt[i] = getSquirrelNumber(vm, i+2); + pt[i] = getSquirrelFloat(vm, i + 2); s32 color = getSquirrelNumber(vm, 8); @@ -453,10 +453,10 @@ static SQInteger squirrel_trib(HSQUIRRELVM vm) if(top == 8) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) - pt[i] = getSquirrelNumber(vm, i+2); + pt[i] = getSquirrelFloat(vm, i + 2); s32 color = getSquirrelNumber(vm, 8); @@ -478,11 +478,7 @@ static SQInteger squirrel_textri(HSQUIRRELVM vm) float pt[12]; for (s32 i = 0; i < COUNT_OF(pt); i++) - { - SQFloat f = 0.0; - sq_getfloat(vm, i + 2, &f); - pt[i] = (float)f; - } + pt[i] = getSquirrelFloat(vm, i + 2); tic_mem* tic = (tic_mem*)getSquirrelCore(vm); static u8 colors[TIC_PALETTE_SIZE]; diff --git a/src/api/wren.c b/src/api/wren.c index 0c54c95f1..aa92aa0ad 100644 --- a/src/api/wren.c +++ b/src/api/wren.c @@ -84,6 +84,7 @@ class TIC {\n\ foreign static rect(x, y, w, h, color)\n\ foreign static rectb(x, y, w, h, color)\n\ foreign static tri(x1, y1, x2, y2, x3, y3, color)\n\ + foreign static trib(x1, y1, x2, y2, x3, y3, color)\n\ foreign static cls()\n\ foreign static cls(color)\n\ foreign static clip()\n\ @@ -734,7 +735,7 @@ static void wren_textri(WrenVM* vm) for (s32 i = 0; i < COUNT_OF(pt); i++) { - pt[i] = (float)getWrenNumber(vm, i + 1); + pt[i] = (float)wrenGetSlotDouble(vm, i + 1); } tic_mem* tic = (tic_mem*)getWrenCore(vm); @@ -805,10 +806,10 @@ static void wren_pix(WrenVM* vm) static void wren_line(WrenVM* vm) { - s32 x0 = getWrenNumber(vm, 1); - s32 y0 = getWrenNumber(vm, 2); - s32 x1 = getWrenNumber(vm, 3); - s32 y1 = getWrenNumber(vm, 4); + float x0 = (float)wrenGetSlotDouble(vm, 1); + float y0 = (float)wrenGetSlotDouble(vm, 2); + float x1 = (float)wrenGetSlotDouble(vm, 3); + float y1 = (float)wrenGetSlotDouble(vm, 4); s32 color = getWrenNumber(vm, 5); tic_mem* tic = (tic_mem*)getWrenCore(vm); @@ -894,11 +895,11 @@ static void wren_rectb(WrenVM* vm) static void wren_tri(WrenVM* vm) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) { - pt[i] = getWrenNumber(vm, i+1); + pt[i] = (float)wrenGetSlotDouble(vm, i + 1); } s32 color = getWrenNumber(vm, 7); @@ -910,11 +911,11 @@ static void wren_tri(WrenVM* vm) static void wren_trib(WrenVM* vm) { - s32 pt[6]; + float pt[6]; for(s32 i = 0; i < COUNT_OF(pt); i++) { - pt[i] = getWrenNumber(vm, i+1); + pt[i] = (float)wrenGetSlotDouble(vm, i + 1); } s32 color = getWrenNumber(vm, 7); @@ -1378,6 +1379,7 @@ static WrenForeignMethodFn foreignTicMethods(const char* signature) if (strcmp(signature, "static TIC.rect(_,_,_,_,_)" ) == 0) return wren_rect; if (strcmp(signature, "static TIC.rectb(_,_,_,_,_)" ) == 0) return wren_rectb; if (strcmp(signature, "static TIC.tri(_,_,_,_,_,_,_)" ) == 0) return wren_tri; + if (strcmp(signature, "static TIC.trib(_,_,_,_,_,_,_)" ) == 0) return wren_trib; if (strcmp(signature, "static TIC.cls()" ) == 0) return wren_cls; if (strcmp(signature, "static TIC.cls(_)" ) == 0) return wren_cls; diff --git a/src/core/core.h b/src/core/core.h index 27dae14e2..feda1aacd 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -156,7 +156,7 @@ typedef struct tic_vram mem; } vbank; - struct + struct ClipRect { u8 l, t, r, b; } clip; diff --git a/src/core/draw.c b/src/core/draw.c index b5fb5e747..ad10a9c99 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -26,6 +26,7 @@ #include #include +#include #define TRANSPARENT_COLOR 255 @@ -67,7 +68,7 @@ static void setPixel(tic_core* core, s32 x, s32 y, u8 color) tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } -static void setPixelFast(tic_core* core, s32 x, s32 y, u8 color) +static inline void setPixelFast(tic_core* core, s32 x, s32 y, u8 color) { const tic_vram* vram = &core->memory.ram.vram; @@ -467,8 +468,6 @@ static struct { s16 Left[TIC80_HEIGHT]; s16 Right[TIC80_HEIGHT]; - s32 ULeft[TIC80_HEIGHT]; - s32 VLeft[TIC80_HEIGHT]; } SidesBuffer; static void initSidesBuffer() @@ -486,24 +485,6 @@ static void setSidePixel(s32 x, s32 y) } } -static void setSideTexPixel(s32 x, s32 y, float u, float v) -{ - s32 yy = y; - if (yy >= 0 && yy < TIC80_HEIGHT) - { - if (x < SidesBuffer.Left[yy]) - { - SidesBuffer.Left[yy] = x; - SidesBuffer.ULeft[yy] = (s32)(u * 65536.0f); - SidesBuffer.VLeft[yy] = (s32)(v * 65536.0f); - } - if (x > SidesBuffer.Right[yy]) - { - SidesBuffer.Right[yy] = x; - } - } -} - static void drawEllipse(tic_mem* memory, s64 x0, s64 y0, s64 a, s64 b, u8 color, PixelFunc pix) { if(a <= 0) return; @@ -600,225 +581,210 @@ void tic_api_ellib(tic_mem* memory, s32 x, s32 y, s32 a, s32 b, u8 color) drawEllipse(memory, x, y, a, b, mapColor(memory, color), setElliPixel); } -static void ticLine(tic_mem* memory, s32 x0, s32 y0, s32 x1, s32 y1, u8 color, PixelFunc func) +static void drawLine(tic_mem* tic, float x0, float y0, float x1, float y1, u8 color) { - if (y0 > y1) + bool inv = false; + + if (fabs(x0 - x1) < fabs(y0 - y1)) { - SWAP(x0, x1, s32); - SWAP(y0, y1, s32); + SWAP(x0, y0, float); + SWAP(x1, y1, float); + inv = true; } - s32 dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; - s32 dy = y1 - y0; - s32 err = (dx > dy ? dx : -dy) / 2, e2; + if (x0 > x1) + { + SWAP(x0, x1, float); + SWAP(y0, y1, float); + } - for (;;) + for (float x = x0, t = (y1 - y0) / (x1 - x0); x <= x1; x++) { - func(memory, x0, y0, color); - if (x0 == x1 && y0 == y1) break; - e2 = err; - if (e2 > -dx) { err -= dy; x0 += sx; } - if (e2 < dy) { err += dx; y0++; } + float y = y0 + (x - x0) * t; + setPixel((tic_core*)tic, inv ? y : x, inv ? x : y, color); } } -static void triPixelFunc(tic_mem* memory, s32 x, s32 y, u8 color) +typedef struct { - setSidePixel(x, y); -} + double x, y; +} Vec2; -static void setLinePixel(tic_mem* tic, s32 x, s32 y, u8 color) +typedef struct { - setPixel((tic_core*)tic, x, y, color); -} + void* data; + const Vec2* v[3]; + double w[3]; +} ShaderAttr; -void tic_api_tri(tic_mem* memory, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) -{ - tic_core* core = (tic_core*)memory; +typedef tic_color(*PixelShader)(const ShaderAttr* a); - initSidesBuffer(); - - ticLine(memory, x1, y1, x2, y2, color, triPixelFunc); - ticLine(memory, x2, y2, x3, y3, color, triPixelFunc); - ticLine(memory, x3, y3, x1, y1, color, triPixelFunc); - - drawSidesBuffer(memory, MIN(y1, MIN(y2, y3)), MAX(y1, MAX(y2, y3)) + 1, color); +static inline double edgeFn(const Vec2* a, const Vec2* b, const Vec2* c) +{ + return (b->x-a->x)*(c->y-a->y) - (b->y-a->y)*(c->x-a->x); } -void tic_api_trib(tic_mem* memory, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32 y3, u8 color) +static void drawTri(tic_mem* tic, const Vec2* v0, const Vec2* v1, const Vec2* v2, PixelShader shader, void* data) { - tic_core* core = (tic_core*)memory; + ShaderAttr a = {data, v0, v1, v2}; - u8 finalColor = mapColor(memory, color); + tic_core* core = (tic_core*)tic; + const struct ClipRect* clip = &core->state.clip; - ticLine(memory, x1, y1, x2, y2, finalColor, setLinePixel); - ticLine(memory, x2, y2, x3, y3, finalColor, setLinePixel); - ticLine(memory, x3, y3, x1, y1, finalColor, setLinePixel); -} + tic_point min = {floor(MIN3(a.v[0]->x, a.v[1]->x, a.v[2]->x)), floor(MIN3(a.v[0]->y, a.v[1]->y, a.v[2]->y))}; + tic_point max = {ceil(MAX3(a.v[0]->x, a.v[1]->x, a.v[2]->x)), ceil(MAX3(a.v[0]->y, a.v[1]->y, a.v[2]->y))}; -typedef struct -{ - float x, y, u, v; -} TexVert; + min.x = MAX(min.x, clip->l); + min.y = MAX(min.y, clip->t); + max.x = MIN(max.x, clip->r); + max.y = MIN(max.y, clip->b); -static void ticTexLine(tic_mem* memory, TexVert* v0, TexVert* v1) -{ - TexVert* top = v0; - TexVert* bot = v1; + if(min.x >= max.x || min.y >= max.y) return; - if (bot->y < top->y) + double area = edgeFn(a.v[0], a.v[1], a.v[2]); + if((s32)floor(area) == 0) return; + if(edgeFn(a.v[0], a.v[1], a.v[2]) < 0.0) { - top = v1; - bot = v0; + SWAP(a.v[1], a.v[2], const Vec2*); + area = -area; } - float dy = bot->y - top->y; - float step_x = (bot->x - top->x); - float step_u = (bot->u - top->u); - float step_v = (bot->v - top->v); + Vec2 d[3]; + double s[3]; - if ((s32)dy != 0) + for(s32 i = 0; i != 3; ++i) { - step_x /= dy; - step_u /= dy; - step_v /= dy; + // pixel center + const double Center = 0.5 - 1e-07; + Vec2 p = {min.x + Center, min.y + Center}; + + s32 c = (i + 1) % 3, n = (i + 2) % 3; + + d[i].x = (a.v[c]->y - a.v[n]->y) / area; + d[i].y = (a.v[n]->x - a.v[c]->x) / area; + s[i] = edgeFn(a.v[c], a.v[n], &p) / area; } - float x = top->x + 0.5f; - float y = top->y; - float u = top->u; - float v = top->v; - - if (y < .0f) + for(s32 y = min.y; y < max.y; ++y) { - y = .0f - y; + for(s32 i = 0; i != 3; ++i) + a.w[i] = s[i]; - x += step_x * y; - u += step_u * y; - v += step_v * y; + for(s32 x = min.x; x < max.x; ++x) + { + if(a.w[0] >= 0.0 && a.w[1] >= 0.0 && a.w[2] >= 0.0) + { + u8 color = shader(&a); + if(color != TRANSPARENT_COLOR) + setPixelFast(core, x, y, color); + } - y = .0f; + for(s32 i = 0; i != 3; ++i) + a.w[i] += d[i].x; + } + + for(s32 i = 0; i != 3; ++i) + s[i] += d[i].y; } +} - s32 botY = (s32)bot->y; - if (botY > TIC80_HEIGHT) - botY = TIC80_HEIGHT; +static tic_color triColorShader(const ShaderAttr* a) { return *(u8*)a->data; } - for (; y < botY; ++y) - { - setSideTexPixel((s32)x, (s32)y, u, v); - x += step_x; - u += step_u; - v += step_v; - } +void tic_api_tri(tic_mem* tic, float x1, float y1, float x2, float y2, float x3, float y3, u8 color) +{ + color = mapColor(tic, color); + drawTri(tic, + &(Vec2){x1, y1}, + &(Vec2){x2, y2}, + &(Vec2){x3, y3}, + triColorShader, &color); } -static void drawTexturedTriangle(tic_core* core, float x1, float y1, float x2, float y2, float x3, float y3, float u1, float v1, float u2, float v2, float u3, float v3, bool use_map, u8* colors, s32 count) +void tic_api_trib(tic_mem* tic, float x1, float y1, float x2, float y2, float x3, float y3, u8 color) { - tic_mem* memory = &core->memory; - tic_vram* vram = &memory->ram.vram; + tic_core* core = (tic_core*)tic; - u8* mapping = getPalette(memory, colors, count); - TexVert V0, V1, V2; + u8 finalColor = mapColor(tic, color); - const u8* map = memory->ram.map.data; - tic_tilesheet sheet = getTileSheetFromSegment(memory, memory->ram.vram.blit.segment); + drawLine(tic, x1, y1, x2, y2, finalColor); + drawLine(tic, x2, y2, x3, y3, finalColor); + drawLine(tic, x3, y3, x1, y1, finalColor); +} - V0.x = x1; V0.y = y1; V0.u = u1; V0.v = v1; - V1.x = x2; V1.y = y2; V1.u = u2; V1.v = v2; - V2.x = x3; V2.y = y3; V2.u = u3; V2.v = v3; +typedef struct +{ + Vec2 _; + double u, v; +}TexVert; + +typedef struct +{ + tic_tilesheet sheet; + u8* mapping; + const u8* map; +} TexData; - // calculate the slope of the surface - // use floats here - float denom = (V0.x - V2.x) * (V1.y - V2.y) - (V1.x - V2.x) * (V0.y - V2.y); - if (denom == 0.0) +static inline void calcUV(const ShaderAttr* a, s32* u, s32* v) +{ + Vec2 p = {0}; + for(s32 i = 0; i != 3; ++i) { - return; + const TexVert* t = (TexVert*)a->v[i]; + p.x += a->w[i] * t->u; + p.y += a->w[i] * t->v; } - float id = 1.0f / denom; - float dudx, dvdx; - // this is the UV slope across the surface - dudx = ((V0.u - V2.u) * (V1.y - V2.y) - (V1.u - V2.u) * (V0.y - V2.y)) * id; - dvdx = ((V0.v - V2.v) * (V1.y - V2.y) - (V1.v - V2.v) * (V0.y - V2.y)) * id; - // convert to fixed - s32 dudxs = (s32)(dudx * 65536.0f); - s32 dvdxs = (s32)(dvdx * 65536.0f); - // fill the buffer - initSidesBuffer(); - // parse each line and decide where in the buffer to store them ( left or right ) - ticTexLine(memory, &V0, &V1); - ticTexLine(memory, &V1, &V2); - ticTexLine(memory, &V2, &V0); - for (s32 y = 0; y < TIC80_HEIGHT; y++) - { - // if it's backwards skip it - s32 width = SidesBuffer.Right[y] - SidesBuffer.Left[y]; - // if it's off top or bottom , skip this line - if ((y < core->state.clip.t) || (y > core->state.clip.b)) - width = 0; - if (width > 0) - { - s32 u = SidesBuffer.ULeft[y]; - s32 v = SidesBuffer.VLeft[y]; - s32 left = SidesBuffer.Left[y]; - s32 right = SidesBuffer.Right[y]; - // check right edge, and CLAMP it - if (right > core->state.clip.r) - right = core->state.clip.r; - // check left edge and offset UV's if we are off the left - if (left < core->state.clip.l) - { - s32 dist = core->state.clip.l - SidesBuffer.Left[y]; - u += dudxs * dist; - v += dvdxs * dist; - left = core->state.clip.l; - } - // are we drawing from the map . ok then at least check before the inner loop - if (use_map == true) - { - for (s32 x = left; x < right; ++x) - { - enum { MapWidth = TIC_MAP_WIDTH * TIC_SPRITESIZE, MapHeight = TIC_MAP_HEIGHT * TIC_SPRITESIZE }; - s32 iu = (u >> 16) % MapWidth; - s32 iv = (v >> 16) % MapHeight; + *u = p.x, *v = p.y; +} - while (iu < 0) iu += MapWidth; - while (iv < 0) iv += MapHeight; +static tic_color triTexMapShader(const ShaderAttr* a) +{ + TexData* data = a->data; - u8 tileindex = map[(iv >> 3) * TIC_MAP_WIDTH + (iu >> 3)]; - tic_tileptr tile = tic_tilesheet_gettile(&sheet, tileindex, true); + s32 u, v; + calcUV(a, &u, &v); - u8 color = mapping[tic_tilesheet_gettilepix(&tile, iu & 7, iv & 7)]; - if (color != TRANSPARENT_COLOR) - setPixel(core, x, y, color); - u += dudxs; - v += dvdxs; - } - } - else - { - // direct from tile ram - for (s32 x = left; x < right; ++x) - { - enum { SheetWidth = TIC_SPRITESHEET_SIZE, SheetHeight = TIC_SPRITESHEET_SIZE * TIC_SPRITE_BANKS }; - s32 iu = (u >> 16) & (SheetWidth - 1); - s32 iv = (v >> 16) & (SheetHeight - 1); - - u8 color = mapping[tic_tilesheet_getpix(&sheet, iu, iv)]; - if (color != TRANSPARENT_COLOR) - setPixel(core, x, y, color); - u += dudxs; - v += dvdxs; - } - } - } - } + enum { MapWidth = TIC_MAP_WIDTH * TIC_SPRITESIZE, MapHeight = TIC_MAP_HEIGHT * TIC_SPRITESIZE, + WMask = TIC_SPRITESIZE - 1, HMask = TIC_SPRITESIZE - 1 }; + + while (u < 0) u += MapWidth; + while (v < 0) v += MapHeight; + + if(u >= MapWidth) u %= MapWidth; + if(v >= MapHeight) v %= MapHeight; + + u8 idx = data->map[(v >> 3) * TIC_MAP_WIDTH + (u >> 3)]; + tic_tileptr tile = tic_tilesheet_gettile(&data->sheet, idx, true); + + return data->mapping[tic_tilesheet_gettilepix(&tile, u & WMask, v & HMask)]; } -void tic_api_textri(tic_mem* memory, float x1, float y1, float x2, float y2, float x3, float y3, float u1, float v1, float u2, float v2, float u3, float v3, bool use_map, u8* colors, s32 count) +static tic_color triTexTileShader(const ShaderAttr* a) { - drawTexturedTriangle((tic_core*)memory, x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3, use_map, colors, count); + TexData* data = a->data; + + s32 u, v; + calcUV(a, &u, &v); + + enum { WMask = TIC_SPRITESHEET_SIZE - 1, HMask = TIC_SPRITESHEET_SIZE * TIC_SPRITE_BANKS - 1 }; + + return data->mapping[tic_tilesheet_getpix(&data->sheet, u & WMask, v & HMask)]; +} + +void tic_api_textri(tic_mem* tic, float x1, float y1, float x2, float y2, float x3, float y3, float u1, float v1, float u2, float v2, float u3, float v3, bool use_map, u8* colors, s32 count) +{ + TexData texData = + { + .sheet = getTileSheetFromSegment(tic, tic->ram.vram.blit.segment), + .mapping = getPalette(tic, colors, count), + .map = tic->ram.map.data, + }; + + drawTri(tic, + (const Vec2*)&(TexVert){x1, y1, u1, v1}, + (const Vec2*)&(TexVert){x2, y2, u2, v2}, + (const Vec2*)&(TexVert){x3, y3, u3, v3}, + use_map ? triTexMapShader : triTexTileShader, &texData); } void tic_api_map(tic_mem* memory, s32 x, s32 y, s32 width, s32 height, s32 sx, s32 sy, u8* colors, s32 count, s32 scale, RemapFunc remap, void* data) @@ -842,7 +808,7 @@ u8 tic_api_mget(tic_mem* memory, s32 x, s32 y) return *(src->data + y * TIC_MAP_WIDTH + x); } -void tic_api_line(tic_mem* memory, s32 x0, s32 y0, s32 x1, s32 y1, u8 color) +void tic_api_line(tic_mem* memory, float x0, float y0, float x1, float y1, u8 color) { - ticLine(memory, x0, y0, x1, y1, mapColor(memory, color), setLinePixel); -} + drawLine(memory, x0, y0, x1, y1, mapColor(memory, color)); +} \ No newline at end of file diff --git a/src/defines.h b/src/defines.h index 3b076f2d3..7011990e2 100644 --- a/src/defines.h +++ b/src/defines.h @@ -25,6 +25,8 @@ #define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) +#define MIN3(a,b,c) MIN(MIN(a, b), c) +#define MAX3(a,b,c) MAX(MAX(a, b), c) #define CLAMP(v,a,b) (MIN(MAX(v,a),b)) #define SWAP(a, b, type) do { type temp = a; a = b; b = temp; } while (0) #define ZEROMEM(p) memset(&p, 0, sizeof p) From e3beaa59c34cfc5662c4c95c6f02654af8e684c8 Mon Sep 17 00:00:00 2001 From: nesbox Date: Fri, 28 Jan 2022 08:41:53 +0300 Subject: [PATCH 259/379] tiny tri drawing fix #1644 --- src/core/draw.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/core/draw.c b/src/core/draw.c index ad10a9c99..40971f94d 100644 --- a/src/core/draw.c +++ b/src/core/draw.c @@ -70,10 +70,7 @@ static void setPixel(tic_core* core, s32 x, s32 y, u8 color) static inline void setPixelFast(tic_core* core, s32 x, s32 y, u8 color) { - const tic_vram* vram = &core->memory.ram.vram; - // does not do any CLIP checking, the caller needs to do that first - tic_api_poke4((tic_mem*)core, y * TIC80_WIDTH + x, color); } @@ -621,7 +618,7 @@ typedef tic_color(*PixelShader)(const ShaderAttr* a); static inline double edgeFn(const Vec2* a, const Vec2* b, const Vec2* c) { - return (b->x-a->x)*(c->y-a->y) - (b->y-a->y)*(c->x-a->x); + return (b->x - a->x) * (c->y - a->y) - (b->y - a->y) * (c->x - a->x); } static void drawTri(tic_mem* tic, const Vec2* v0, const Vec2* v1, const Vec2* v2, PixelShader shader, void* data) @@ -643,7 +640,7 @@ static void drawTri(tic_mem* tic, const Vec2* v0, const Vec2* v1, const Vec2* v2 double area = edgeFn(a.v[0], a.v[1], a.v[2]); if((s32)floor(area) == 0) return; - if(edgeFn(a.v[0], a.v[1], a.v[2]) < 0.0) + if(area < 0.0) { SWAP(a.v[1], a.v[2], const Vec2*); area = -area; From eec44dbfa38c677fb86c787e34e98a07c642551f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20F=2E=20A=2E=20de=20Pr=C3=A1?= Date: Tue, 1 Feb 2022 10:10:31 -0300 Subject: [PATCH 260/379] Update sdl2 to release-2.0.20 --- vendor/sdl2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl2 b/vendor/sdl2 index 4cd981609..b424665e0 160000 --- a/vendor/sdl2 +++ b/vendor/sdl2 @@ -1 +1 @@ -Subproject commit 4cd981609b50ed273d80c635c1ca4c1e5518fb21 +Subproject commit b424665e0899769b200231ba943353a5fee1b6b6 From 3f04bcf6d3557dcdefae52f442e58bc9c0de5d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20F=2E=20A=2E=20de=20Pr=C3=A1?= Date: Tue, 1 Feb 2022 12:35:12 -0300 Subject: [PATCH 261/379] Remove hidapi from android build --- CMakeLists.txt | 101 +++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69ad1effa..c37bbadcd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,7 +131,7 @@ if(MSVC) string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_${OUTPUTCONFIG} "${CMAKE_CXX_FLAGS_${OUTPUTCONFIG}}") endif() endforeach() - + else() set(CMAKE_C_STANDARD 11) @@ -154,7 +154,7 @@ include(ExternalProject) ################################ set(LUA_DIR ${THIRDPARTY_DIR}/lua) -set(LUA_SRC +set(LUA_SRC ${LUA_DIR}/lapi.c ${LUA_DIR}/lcode.c ${LUA_DIR}/lctype.c @@ -203,7 +203,7 @@ endif() ################################ set(LPEG_DIR ${THIRDPARTY_DIR}/lpeg) -set(LPEG_SRC +set(LPEG_SRC ${LPEG_DIR}/lpcap.c ${LPEG_DIR}/lpcode.c ${LPEG_DIR}/lpprint.c @@ -219,7 +219,7 @@ target_include_directories(lpeg PRIVATE ${LUA_DIR}) ################################ set(WREN_DIR ${THIRDPARTY_DIR}/wren/src) -set(WREN_SRC +set(WREN_SRC ${WREN_DIR}/optional/wren_opt_meta.c ${WREN_DIR}/optional/wren_opt_random.c ${WREN_DIR}/vm/wren_compiler.c @@ -355,7 +355,7 @@ set(GIFLIB_SRC ${GIFLIB_DIR}/openbsd-reallocarray.c ) add_library(giflib STATIC ${GIFLIB_SRC}) -target_include_directories(giflib +target_include_directories(giflib PRIVATE ${GIFLIB_DIR} INTERFACE ${THIRDPARTY_DIR}/giflib) @@ -387,16 +387,16 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${TIC80CORE_DIR}/core/io.c ${TIC80CORE_DIR}/core/sound.c ${TIC80CORE_DIR}/api/js.c - ${TIC80CORE_DIR}/api/lua.c - ${TIC80CORE_DIR}/api/moonscript.c - ${TIC80CORE_DIR}/api/fennel.c - ${TIC80CORE_DIR}/api/wren.c + ${TIC80CORE_DIR}/api/lua.c + ${TIC80CORE_DIR}/api/moonscript.c + ${TIC80CORE_DIR}/api/fennel.c + ${TIC80CORE_DIR}/api/wren.c ${TIC80CORE_DIR}/api/squirrel.c ${TIC80CORE_DIR}/api/mruby.c ${TIC80CORE_DIR}/tic.c ${TIC80CORE_DIR}/cart.c - ${TIC80CORE_DIR}/tools.c - ${TIC80CORE_DIR}/tilesheet.c + ${TIC80CORE_DIR}/tools.c + ${TIC80CORE_DIR}/tilesheet.c ) if(${BUILD_DEPRECATED}) @@ -406,7 +406,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) add_library(tic80core${SCRIPT} STATIC ${TIC80CORE_SRC}) target_include_directories(tic80core${SCRIPT} - PRIVATE + PRIVATE ${THIRDPARTY_DIR}/moonscript ${THIRDPARTY_DIR}/fennel PUBLIC @@ -414,12 +414,12 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) ${CMAKE_SOURCE_DIR}/src) target_link_libraries(tic80core${SCRIPT} - lua - lpeg - wren - squirrel - duktape - blipbuf + lua + lpeg + wren + squirrel + duktape + blipbuf zlib ) @@ -471,8 +471,9 @@ if(BUILD_SDL AND NOT EMSCRIPTEN AND NOT RPI) if(ANDROID) include_directories(${ANDROID_NDK}/sources/android/cpufeatures) + set(SDL_STATIC_PIC ON CACHE BOOL "" FORCE) endif() - + set(SDL_SHARED OFF CACHE BOOL "" FORCE) add_subdirectory(${THIRDPARTY_DIR}/sdl2) @@ -487,9 +488,9 @@ if(BUILD_SDL AND BUILD_PLAYER AND NOT RPI) add_executable(player-sdl WIN32 ${CMAKE_SOURCE_DIR}/src/system/sdl/player.c) - target_include_directories(player-sdl PRIVATE - ${THIRDPARTY_DIR}/sdl2/include - ${CMAKE_SOURCE_DIR}/include + target_include_directories(player-sdl PRIVATE + ${THIRDPARTY_DIR}/sdl2/include + ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src) if(MINGW) @@ -524,11 +525,11 @@ elseif(LINUX) endif() if(APPLE) - set_property (TARGET sokol APPEND_STRING PROPERTY + set_property (TARGET sokol APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc") - target_link_libraries(sokol - "-framework Cocoa" + target_link_libraries(sokol + "-framework Cocoa" "-framework QuartzCore" "-framework Metal" "-framework MetalKit" @@ -561,9 +562,9 @@ if(BUILD_PLAYER AND BUILD_SOKOL) target_link_options(player-sokol PRIVATE -static) endif() - target_include_directories(player-sokol PRIVATE - ${CMAKE_SOURCE_DIR}/include - ${THIRDPARTY_DIR}/sokol + target_include_directories(player-sokol PRIVATE + ${CMAKE_SOURCE_DIR}/include + ${THIRDPARTY_DIR}/sokol ${CMAKE_SOURCE_DIR}/src) target_link_libraries(player-sokol tic80core sokol) @@ -598,7 +599,7 @@ if(BUILD_LIBRETRO) ) endif() - target_include_directories(tic80_libretro PRIVATE + target_include_directories(tic80_libretro PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${TIC80CORE_DIR}) @@ -626,7 +627,7 @@ endif() if (NOT N3DS) set(ZLIB_DIR ${THIRDPARTY_DIR}/zlib) -set(ZLIB_SRC +set(ZLIB_SRC ${ZLIB_DIR}/adler32.c ${ZLIB_DIR}/compress.c ${ZLIB_DIR}/crc32.c @@ -677,8 +678,8 @@ if(BUILD_DEMO_CARTS) add_executable(bin2txt ${TOOLS_DIR}/bin2txt.c) target_link_libraries(bin2txt zlib) - add_executable(xplode - ${TOOLS_DIR}/xplode.c + add_executable(xplode + ${TOOLS_DIR}/xplode.c ${CMAKE_SOURCE_DIR}/src/ext/gif.c ${CMAKE_SOURCE_DIR}/src/ext/png.c ${CMAKE_SOURCE_DIR}/src/studio/project.c) @@ -690,11 +691,11 @@ if(BUILD_DEMO_CARTS) target_link_libraries(xplode m) endif() - file(GLOB DEMO_CARTS - ${CMAKE_SOURCE_DIR}/demos/*.* + file(GLOB DEMO_CARTS + ${CMAKE_SOURCE_DIR}/demos/*.* ${CMAKE_SOURCE_DIR}/demos/bunny/*.*) - list(APPEND DEMO_CARTS + list(APPEND DEMO_CARTS ${CMAKE_SOURCE_DIR}/config.lua ) @@ -790,7 +791,7 @@ endif() ################################ set(LIBPNG_DIR ${THIRDPARTY_DIR}/libpng) -set(LIBPNG_SRC +set(LIBPNG_SRC ${LIBPNG_DIR}/png.c ${LIBPNG_DIR}/pngerror.c ${LIBPNG_DIR}/pngget.c @@ -814,8 +815,8 @@ add_library(png STATIC ${LIBPNG_SRC}) target_compile_definitions(png PRIVATE PNG_ARM_NEON_OPT=0) -target_include_directories(png - PUBLIC ${CMAKE_CURRENT_BINARY_DIR} +target_include_directories(png + PUBLIC ${CMAKE_CURRENT_BINARY_DIR} PRIVATE ${THIRDPARTY_DIR}/zlib INTERFACE ${THIRDPARTY_DIR}/libpng) @@ -854,9 +855,9 @@ endif() set(TIC80_OUTPUT tic80) -add_library(tic80studio STATIC - ${TIC80STUDIO_SRC} - ${DEMO_CARTS_OUT} +add_library(tic80studio STATIC + ${TIC80STUDIO_SRC} + ${DEMO_CARTS_OUT} ${CMAKE_SOURCE_DIR}/build/assets/cart.png.dat) if(WIN32) @@ -903,7 +904,7 @@ set(SDLGPU_SRC ) if(NOT ANDROID) - list(APPEND SDLGPU_SRC + list(APPEND SDLGPU_SRC ${SDLGPU_DIR}/renderer_GLES_1.c ${SDLGPU_DIR}/renderer_GLES_3.c ${SDLGPU_DIR}/renderer_OpenGL_1.c @@ -911,7 +912,7 @@ if(NOT ANDROID) ${SDLGPU_DIR}/renderer_OpenGL_2.c ${SDLGPU_DIR}/renderer_OpenGL_3.c ${SDLGPU_DIR}/renderer_OpenGL_4.c - ${SDLGPU_DIR}/SDL_gpu_shapes.c + ${SDLGPU_DIR}/SDL_gpu_shapes.c ${SDLGPU_DIR}/externals/glew/glew.c ) endif() @@ -969,7 +970,7 @@ if(BUILD_SDL) set(TIC80_SRC src/system/sdl/main.c) if(WIN32) - + configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc") set(TIC80_SRC ${TIC80_SRC} "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc") @@ -981,7 +982,7 @@ if(BUILD_SDL) add_library(tic80 SHARED ${TIC80_SRC}) - target_link_libraries(tic80 hidapi) + target_link_libraries(tic80) else() add_executable(tic80 ${TIC80_SRC}) @@ -1055,13 +1056,13 @@ if(BUILD_SOKOL) configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc") set(TIC80_SRC ${TIC80_SRC} "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc") - - add_executable(tic80-sokol WIN32 ${TIC80_SRC}) + + add_executable(tic80-sokol WIN32 ${TIC80_SRC}) else() add_executable(tic80-sokol ${TIC80_SRC}) endif() - target_include_directories(tic80-sokol PRIVATE + target_include_directories(tic80-sokol PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src ${THIRDPARTY_DIR}/sokol) @@ -1111,7 +1112,7 @@ if(BUILD_STUB) macro(MACRO_STUB SCRIPT) - set(TIC80_SRC + set(TIC80_SRC src/system/sdl/main.c src/studio/screens/run.c src/studio/screens/menu.c @@ -1123,7 +1124,7 @@ if(BUILD_STUB) src/ext/md5.c) if(WIN32) - + configure_file("${PROJECT_SOURCE_DIR}/build/windows/tic80.rc.in" "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc") set(TIC80_SRC ${TIC80_SRC} "${PROJECT_SOURCE_DIR}/build/windows/tic80.rc") From f27b4bf89456e9607c698cacbc045e3169e1fb3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20F=2E=20A=2E=20de=20Pr=C3=A1?= Date: Tue, 1 Feb 2022 15:03:58 -0300 Subject: [PATCH 262/379] Add GH Actions for PRs --- .github/workflows/build.yml | 1073 +++++++++++++++++------------------ 1 file changed, 536 insertions(+), 537 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 187ab3d3e..2b96fe10d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,612 +1,611 @@ name: Build -on: [push] +on: [push, pull_request] env: BUILD_TYPE: MinSizeRel jobs: - -# === Windows XP === + # === Windows XP === winxp: runs-on: windows-2019 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Build - shell: cmd - run: | - cd build - cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. - cmake --build . --config %BUILD_TYPE% --parallel - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-winxp' - path: build/bin/tic80.exe - - - name: Deploy stubs - uses: actions/upload-artifact@v2 - with: - name: 'tic80-winxp-stub' - path: build/bin/tic80*.exe - -# === Windows XP PRO === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build + shell: cmd + run: | + cd build + cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. + cmake --build . --config %BUILD_TYPE% --parallel + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-winxp" + path: build/bin/tic80.exe + + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: "tic80-winxp-stub" + path: build/bin/tic80*.exe + + # === Windows XP PRO === winxp-pro: runs-on: windows-2019 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Build - shell: cmd - run: | - cd build - cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_PRO=On .. - cmake --build . --config %BUILD_TYPE% --parallel - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-winxp-pro' - path: build/bin/tic80.exe - -# === Windows === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build + shell: cmd + run: | + cd build + cmake -G "Visual Studio 16 2019" -A Win32 -T v141_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_PRO=On .. + cmake --build . --config %BUILD_TYPE% --parallel + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-winxp-pro" + path: build/bin/tic80.exe + + # === Windows === windows: runs-on: windows-2019 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Build - shell: cmd - run: | - cd build - cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. - cmake --build . --config %BUILD_TYPE% --parallel - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-windows' - path: build/bin/tic80.exe - - - name: Deploy stubs - uses: actions/upload-artifact@v2 - with: - name: 'tic80-windows-stub' - path: build/bin/tic80*.exe - -# === Windows PRO === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build + shell: cmd + run: | + cd build + cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_STUB=On .. + cmake --build . --config %BUILD_TYPE% --parallel + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-windows" + path: build/bin/tic80.exe + + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: "tic80-windows-stub" + path: build/bin/tic80*.exe + + # === Windows PRO === windows-pro: runs-on: windows-2019 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Build - shell: cmd - run: | - cd build - cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_PRO=On .. - cmake --build . --config %BUILD_TYPE% --parallel - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-windows-pro' - path: build/bin/tic80.exe - -# === Windows Sokol === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build + shell: cmd + run: | + cd build + cmake -G "Visual Studio 16 2019" -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DBUILD_PRO=On .. + cmake --build . --config %BUILD_TYPE% --parallel + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-windows-pro" + path: build/bin/tic80.exe + + # === Windows Sokol === windows-sokol: runs-on: windows-2019 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Build - shell: cmd - run: | - cd build - cmake -G "Visual Studio 16 2019" -DBUILD_SDL=Off -DBUILD_SOKOL=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% .. - cmake --build . --config %BUILD_TYPE% --parallel - cp bin/tic80-sokol.exe bin/tic80.exe - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-windows-sokol' - path: build/bin/tic80.exe - -# === Ubuntu PRO === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build + shell: cmd + run: | + cd build + cmake -G "Visual Studio 16 2019" -DBUILD_SDL=Off -DBUILD_SOKOL=On -DCMAKE_BUILD_TYPE=%BUILD_TYPE% .. + cmake --build . --config %BUILD_TYPE% --parallel + cp bin/tic80-sokol.exe bin/tic80.exe + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-windows-sokol" + path: build/bin/tic80.exe + + # === Ubuntu PRO === linux-pro: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Install - run: | - sudo apt-get update - sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SDLGPU=On -DBUILD_PRO=On .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - - - name: Deploy DEB - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux-deb-pro' - path: build/tic80.deb - - - name: Deploy ZIP - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux-pro' - path: build/bin/tic80 - -# === Ubuntu === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Install + run: | + sudo apt-get update + sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SDLGPU=On -DBUILD_PRO=On .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + + - name: Deploy DEB + uses: actions/upload-artifact@v2 + with: + name: "tic80-linux-deb-pro" + path: build/tic80.deb + + - name: Deploy ZIP + uses: actions/upload-artifact@v2 + with: + name: "tic80-linux-pro" + path: build/bin/tic80 + + # === Ubuntu === linux: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Install - run: | - sudo apt-get update - sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE DBUILD_SDLGPU=On -DBUILD_STUB=On .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - - - name: Deploy DEB - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux-deb' - path: build/tic80.deb - - - name: Deploy ZIP - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux' - path: build/bin/tic80 - - - name: Deploy stubs - uses: actions/upload-artifact@v2 - with: - name: 'tic80-linux-stub' - path: build/bin/tic80* - -# === Raspberry PI === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Install + run: | + sudo apt-get update + sudo apt-get install libglu1-mesa-dev libasound2-dev libpulse-dev libaudio-dev libsamplerate0-dev -y + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE DBUILD_SDLGPU=On -DBUILD_STUB=On .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + + - name: Deploy DEB + uses: actions/upload-artifact@v2 + with: + name: "tic80-linux-deb" + path: build/tic80.deb + + - name: Deploy ZIP + uses: actions/upload-artifact@v2 + with: + name: "tic80-linux" + path: build/bin/tic80 + + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: "tic80-linux-stub" + path: build/bin/tic80* + + # === Raspberry PI === rpi: runs-on: ubuntu-latest container: nesbox/rpi-tic80:latest steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install Host toolchain - run: | - apt-get update - apt-get install --assume-yes build-essential ruby-full - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_STUB=On -DCMAKE_TOOLCHAIN_FILE=rpi/toolchain.cmake .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - - - name: Deploy DEB - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi-dep' - path: build/tic80.deb - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi' - path: build/bin/tic80 - - - name: Deploy stubs - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi-stub' - path: build/bin/tic80* - -# === Raspberry PI PRO === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_STUB=On -DCMAKE_TOOLCHAIN_FILE=rpi/toolchain.cmake .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + + - name: Deploy DEB + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi-dep" + path: build/tic80.deb + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi" + path: build/bin/tic80 + + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi-stub" + path: build/bin/tic80* + + # === Raspberry PI PRO === rpi-pro: runs-on: ubuntu-latest container: nesbox/rpi-tic80:latest steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install Host toolchain - run: | - apt-get update - apt-get install --assume-yes build-essential ruby-full - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_PRO=On -DCMAKE_TOOLCHAIN_FILE=rpi/toolchain.cmake .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - - - name: Deploy DEB - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi-deb-pro' - path: build/tic80.deb - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi-pro' - path: build/bin/tic80 - -# === Raspberry PI 1-3 Bare Metal === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_PRO=On -DCMAKE_TOOLCHAIN_FILE=rpi/toolchain.cmake .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + + - name: Deploy DEB + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi-deb-pro" + path: build/tic80.deb + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi-pro" + path: build/bin/tic80 + + # === Raspberry PI 1-3 Bare Metal === rpi-baremetal: runs-on: ubuntu-latest container: nesbox/baremetalpi-tic80:latest steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install Host toolchain - run: | - apt-get update - apt-get install --assume-yes build-essential ruby-full - - - name: Prebuild - run: | - cd vendor/circle-stdlib - ./configure -r 3 - make -j$(nproc) - cd libs/circle/addon/vc4/sound/ - make -j$(nproc) - cd ../vchiq - make -j$(nproc) - cd ../../linux - make -j$(nproc) - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=baremetalpi/toolchain.cmake .. - make tic80studio -j$(nproc) - cd baremetalpi - make -j$(nproc) - cd ../../vendor/circle-stdlib/libs/circle/boot/ - make -j$(nproc) - - - name: Pack - run: | - cp build/baremetalpi/kernel8-32.img vendor/circle-stdlib/libs/circle/boot/kernel.img - cp build/baremetalpi/boot/config.txt vendor/circle-stdlib/libs/circle/boot/config.txt - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi-baremetal' - path: | - vendor/circle-stdlib/libs/circle/boot/config.txt - vendor/circle-stdlib/libs/circle/boot/kernel.img - vendor/circle-stdlib/libs/circle/boot/bootcode.bin - vendor/circle-stdlib/libs/circle/boot/start.elf - vendor/circle-stdlib/libs/circle/boot/fixup.dat - vendor/circle-stdlib/libs/circle/boot/LICENCE.broadcom - -# === Raspberry PI 4 Bare Metal === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + + - name: Prebuild + run: | + cd vendor/circle-stdlib + ./configure -r 3 + make -j$(nproc) + cd libs/circle/addon/vc4/sound/ + make -j$(nproc) + cd ../vchiq + make -j$(nproc) + cd ../../linux + make -j$(nproc) + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=baremetalpi/toolchain.cmake .. + make tic80studio -j$(nproc) + cd baremetalpi + make -j$(nproc) + cd ../../vendor/circle-stdlib/libs/circle/boot/ + make -j$(nproc) + + - name: Pack + run: | + cp build/baremetalpi/kernel8-32.img vendor/circle-stdlib/libs/circle/boot/kernel.img + cp build/baremetalpi/boot/config.txt vendor/circle-stdlib/libs/circle/boot/config.txt + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi-baremetal" + path: | + vendor/circle-stdlib/libs/circle/boot/config.txt + vendor/circle-stdlib/libs/circle/boot/kernel.img + vendor/circle-stdlib/libs/circle/boot/bootcode.bin + vendor/circle-stdlib/libs/circle/boot/start.elf + vendor/circle-stdlib/libs/circle/boot/fixup.dat + vendor/circle-stdlib/libs/circle/boot/LICENCE.broadcom + + # === Raspberry PI 4 Bare Metal === rpi4-baremetal: runs-on: ubuntu-latest container: nesbox/baremetalpi-tic80:latest steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install Host toolchain - run: | - apt-get update - apt-get install --assume-yes build-essential ruby-full - - - name: Prebuild - run: | - cd vendor/circle-stdlib - ./configure -r 4 - make -j$(nproc) - cd libs/circle/addon/vc4/sound/ - make -j$(nproc) - cd ../vchiq - make -j$(nproc) - cd ../../linux - make -j$(nproc) - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=baremetalpi/toolchain.cmake .. - make tic80studio -j$(nproc) - cd baremetalpi - make -j$(nproc) - cd ../../vendor/circle-stdlib/libs/circle/boot/ - make -j$(nproc) - - - name: Pack - run: | - cp build/baremetalpi/kernel7l.img vendor/circle-stdlib/libs/circle/boot/kernel.img - cp build/baremetalpi/boot/config.txt vendor/circle-stdlib/libs/circle/boot/config.txt - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-rpi4-baremetal' - path: | - vendor/circle-stdlib/libs/circle/boot/bcm2711-rpi-4-b.dtb - vendor/circle-stdlib/libs/circle/boot/bcm2711-rpi-cm4.dtb - vendor/circle-stdlib/libs/circle/boot/bootcode.bin - vendor/circle-stdlib/libs/circle/boot/config.txt - vendor/circle-stdlib/libs/circle/boot/COPYING.linux - vendor/circle-stdlib/libs/circle/boot/fixup4.dat - vendor/circle-stdlib/libs/circle/boot/kernel.img - vendor/circle-stdlib/libs/circle/boot/LICENCE.broadcom - vendor/circle-stdlib/libs/circle/boot/start4.elf - -# === Nintendo 3DS build === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + + - name: Prebuild + run: | + cd vendor/circle-stdlib + ./configure -r 4 + make -j$(nproc) + cd libs/circle/addon/vc4/sound/ + make -j$(nproc) + cd ../vchiq + make -j$(nproc) + cd ../../linux + make -j$(nproc) + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_TOOLCHAIN_FILE=baremetalpi/toolchain.cmake .. + make tic80studio -j$(nproc) + cd baremetalpi + make -j$(nproc) + cd ../../vendor/circle-stdlib/libs/circle/boot/ + make -j$(nproc) + + - name: Pack + run: | + cp build/baremetalpi/kernel7l.img vendor/circle-stdlib/libs/circle/boot/kernel.img + cp build/baremetalpi/boot/config.txt vendor/circle-stdlib/libs/circle/boot/config.txt + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-rpi4-baremetal" + path: | + vendor/circle-stdlib/libs/circle/boot/bcm2711-rpi-4-b.dtb + vendor/circle-stdlib/libs/circle/boot/bcm2711-rpi-cm4.dtb + vendor/circle-stdlib/libs/circle/boot/bootcode.bin + vendor/circle-stdlib/libs/circle/boot/config.txt + vendor/circle-stdlib/libs/circle/boot/COPYING.linux + vendor/circle-stdlib/libs/circle/boot/fixup4.dat + vendor/circle-stdlib/libs/circle/boot/kernel.img + vendor/circle-stdlib/libs/circle/boot/LICENCE.broadcom + vendor/circle-stdlib/libs/circle/boot/start4.elf + + # === Nintendo 3DS build === nintendo-3ds: runs-on: ubuntu-latest container: nesbox/devkitpro-tic80:latest steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install Host toolchain - run: | - apt-get update - apt-get install --assume-yes build-essential ruby-full - - - name: Build - run: | - cd build - cmake -DCMAKE_TOOLCHAIN_FILE=$DEVKITPRO/3ds.cmake -DN3DS=TRUE -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. - make -j$(nproc) - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-nintendo-3ds' - path: build/bin/tic80.3dsx - -# === MacOS 10.15 === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Host toolchain + run: | + apt-get update + apt-get install --assume-yes build-essential ruby-full + + - name: Build + run: | + cd build + cmake -DCMAKE_TOOLCHAIN_FILE=$DEVKITPRO/3ds.cmake -DN3DS=TRUE -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. + make -j$(nproc) + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-nintendo-3ds" + path: build/bin/tic80.3dsx + + # === MacOS 10.15 === macos: runs-on: macos-10.15 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install - run: brew uninstall --ignore-dependencies libidn2 - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE DBUILD_SDLGPU=On -DBUILD_STUB=On .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - cp *.dmg tic80.dmg - - - name: Deploy DMG - uses: actions/upload-artifact@v2 - with: - name: 'tic80-macos-dmg' - path: build/tic80.dmg - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-macos' - path: build/bin/tic80 - - - name: Deploy stubs - uses: actions/upload-artifact@v2 - with: - name: 'tic80-macos-stub' - path: build/bin/tic80* - -# === MacOS 10.15 PRO === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install + run: brew uninstall --ignore-dependencies libidn2 + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE DBUILD_SDLGPU=On -DBUILD_STUB=On .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + cp *.dmg tic80.dmg + + - name: Deploy DMG + uses: actions/upload-artifact@v2 + with: + name: "tic80-macos-dmg" + path: build/tic80.dmg + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-macos" + path: build/bin/tic80 + + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: "tic80-macos-stub" + path: build/bin/tic80* + + # === MacOS 10.15 PRO === macos-pro: runs-on: macos-10.15 steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install - run: brew uninstall --ignore-dependencies libidn2 - - - name: Build - run: | - cd build - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SDLGPU=On -DBUILD_PRO=On .. - cmake --build . --config $BUILD_TYPE --parallel - cpack - cp *.dmg tic80.dmg - - - name: Deploy DMG - uses: actions/upload-artifact@v2 - with: - name: 'tic80-macos-dmg-pro' - path: build/tic80.dmg - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-macos-pro' - path: build/bin/tic80 - -# === Android === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install + run: brew uninstall --ignore-dependencies libidn2 + + - name: Build + run: | + cd build + cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SDLGPU=On -DBUILD_PRO=On .. + cmake --build . --config $BUILD_TYPE --parallel + cpack + cp *.dmg tic80.dmg + + - name: Deploy DMG + uses: actions/upload-artifact@v2 + with: + name: "tic80-macos-dmg-pro" + path: build/tic80.dmg + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-macos-pro" + path: build/bin/tic80 + + # === Android === android: runs-on: ubuntu-latest container: nesbox/android-tic80:latest steps: - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: Build - run: | - cd build/android - ./gradlew assembleRelease - cp app/build/outputs/apk/release/app-release.apk tic80.apk - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-android' - path: build/android/tic80.apk - -# === Web Assembly === + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Build + run: | + cd build/android + ./gradlew assembleRelease + cp app/build/outputs/apk/release/app-release.apk tic80.apk + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-android" + path: build/android/tic80.apk + + # === Web Assembly === wasm: runs-on: ubuntu-latest steps: - - uses: mymindstorm/setup-emsdk@v7 - - - uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.6 - - - name: Build - run: | - cd build - emcmake cmake -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_STUB=On .. - cmake --build . --config $BUILD_TYPE --parallel - cp html/export.html bin/index.html - cp bin/tic80.js webapp/tic80.js - cp bin/tic80.wasm webapp/tic80.wasm - - - name: Deploy - uses: actions/upload-artifact@v2 - with: - name: 'tic80-wasm' - path: | - build/bin/tic80.js - build/bin/tic80.wasm - build/bin/index.html - - - name: Deploy WebApp - uses: actions/upload-artifact@v2 - with: - name: 'tic80-webapp' - path: | - build/webapp/index.html - build/webapp/serviceworker.js - build/webapp/tic80-180.png - build/webapp/tic80-192.png - build/webapp/tic80-512.png - build/webapp/tic80.webmanifest - build/webapp/tic80.js - build/webapp/tic80.wasm - - - name: Deploy stubs - uses: actions/upload-artifact@v2 - with: - name: 'tic80-wasm-stub' - path: | - build/bin/tic80*.js - build/bin/tic80*.wasm - build/bin/index.html - -# === Export === + - uses: mymindstorm/setup-emsdk@v7 + + - uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + + - name: Build + run: | + cd build + emcmake cmake -DBUILD_SDLGPU=On -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_STUB=On .. + cmake --build . --config $BUILD_TYPE --parallel + cp html/export.html bin/index.html + cp bin/tic80.js webapp/tic80.js + cp bin/tic80.wasm webapp/tic80.wasm + + - name: Deploy + uses: actions/upload-artifact@v2 + with: + name: "tic80-wasm" + path: | + build/bin/tic80.js + build/bin/tic80.wasm + build/bin/index.html + + - name: Deploy WebApp + uses: actions/upload-artifact@v2 + with: + name: "tic80-webapp" + path: | + build/webapp/index.html + build/webapp/serviceworker.js + build/webapp/tic80-180.png + build/webapp/tic80-192.png + build/webapp/tic80-512.png + build/webapp/tic80.webmanifest + build/webapp/tic80.js + build/webapp/tic80.wasm + + - name: Deploy stubs + uses: actions/upload-artifact@v2 + with: + name: "tic80-wasm-stub" + path: | + build/bin/tic80*.js + build/bin/tic80*.wasm + build/bin/index.html + + # === Export === export: needs: [winxp, windows, linux, rpi, macos, wasm] runs-on: ubuntu-latest @@ -660,7 +659,7 @@ jobs: - name: Deploy uses: actions/upload-artifact@v2 with: - name: 'tic80-export' + name: "tic80-export" path: | winxp win @@ -669,7 +668,7 @@ jobs: rpi html -# === Export stub === + # === Export stub === export-stub: needs: [export] runs-on: ubuntu-latest @@ -727,7 +726,7 @@ jobs: - name: Deploy uses: actions/upload-artifact@v2 with: - name: 'tic80-export' + name: "tic80-export" path: | winxp${{ matrix.script }} win${{ matrix.script }} @@ -736,7 +735,7 @@ jobs: mac${{ matrix.script }} html${{ matrix.script }} -# === Delete stub artifacts === + # === Delete stub artifacts === delete-stub: needs: [export-stub] runs-on: ubuntu-latest @@ -753,7 +752,7 @@ jobs: tic80-macos-stub tic80-wasm-stub -# === Delete PRO artifacts === + # === Delete PRO artifacts === delete-pro: needs: [winxp-pro, windows-pro, linux-pro, macos-pro, rpi-pro] runs-on: ubuntu-latest From fc71c4bfa5ad33afd2af78c38a834bc8bbf4fd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20F=2E=20A=2E=20de=20Pr=C3=A1?= Date: Wed, 2 Feb 2022 09:46:28 -0300 Subject: [PATCH 263/379] Update Android project --- build/android/app/build.gradle | 13 +- .../android/app/src/main/AndroidManifest.xml | 20 ++- .../app/HIDDeviceBLESteamController.java | 6 +- .../java/org/libsdl/app/HIDDeviceManager.java | 67 ++++----- .../main/java/org/libsdl/app/SDLActivity.java | 142 +++++++++--------- .../java/org/libsdl/app/SDLAudioManager.java | 4 + 6 files changed, 133 insertions(+), 119 deletions(-) diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 63c0fc8bd..d4000877b 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -8,18 +8,18 @@ else { } android { - compileSdkVersion 29 + compileSdkVersion 31 defaultConfig { if (buildAsApplication) { applicationId "com.nesbox.tic" } minSdkVersion 24 - targetSdkVersion 29 + targetSdkVersion 31 versionCode 10000 versionName "1.00.00" externalNativeBuild { ndkBuild { - arguments "APP_PLATFORM=android-29" + arguments "APP_PLATFORM=android-31" abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } cmake { @@ -51,17 +51,20 @@ android { } } if (!project.hasProperty('EXCLUDE_NATIVE_LIBS')) { + sourceSets.main { + jniLibs.srcDir 'libs' + } externalNativeBuild { cmake { path '../../../CMakeLists.txt' } - } + } } lintOptions { abortOnError false } - + if (buildAsLibrary) { libraryVariants.all { variant -> variant.outputs.each { output -> diff --git a/build/android/app/src/main/AndroidManifest.xml b/build/android/app/src/main/AndroidManifest.xml index f41157775..0f16ef499 100644 --- a/build/android/app/src/main/AndroidManifest.xml +++ b/build/android/app/src/main/AndroidManifest.xml @@ -38,10 +38,14 @@ android:name="android.hardware.microphone" android:required="false" /> --> - - + + + - + + + + @@ -52,7 +56,7 @@ + + +

", + " ", " ", " ", " ", " ", " ", " ", " ", + " ", " ", "<0> ", "<1> ", "<2> ", "<3> ", "<4> ", "<5> ", + "<6> ", "<7> ", "<8> ", "<9> ", "<-> ", "<=> ", "<[> ", "<]> ", + "<\\> ","<;> ", "<'> ", "<`> ", "<,> ", "<.> ", " ", "< > ", + " ", " ", "", " ", " ", " ", " ", " ", + " ", " ", " ", " ", "", " ", " ", "", + " ", " ", " ", " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", " ", +}; + +static tic_mapping GamepadMapping; + +#define OPTION_KEY(KEY) \ + \ +enum{KEY ## KeyIndex = __COUNTER__}; \ + \ +static s32 option ## KEY ## KeyGet() \ +{ \ + return GamepadMapping.data[KEY ## KeyIndex] - 1; \ +} \ + \ +static void option ## KEY ## KeySet(s32 pos) \ +{ \ + GamepadMapping.data[KEY ## KeyIndex] = pos + 1; \ +} \ + \ +static MenuOption KEY ## KeyOption = \ +{ \ + .values = KeysList, \ + .count = COUNT_OF(KeysList), \ + option ## KEY ## KeyGet, \ + option ## KEY ## KeySet, \ +}; + +OPTION_KEY(Up) +OPTION_KEY(Down) +OPTION_KEY(Left) +OPTION_KEY(Right) +OPTION_KEY(A) +OPTION_KEY(B) +OPTION_KEY(X) +OPTION_KEY(Y) + +static void backGamepadMenu() +{ + impl.config->data.options.mapping = GamepadMapping; + showOptionsMenu(); +} + static void showGamepadMenu() { static const MenuItem GamepadMenu[] = { - {"UP <...>", NULL}, - {"DOWN <...>", NULL}, - {"LEFT <...>", NULL}, - {"RIGHT <...>", NULL}, - {"A <...>", NULL}, - {"B <...>", NULL}, - {"X <...>", NULL}, - {"Y <...>", NULL}, + {"UP ", NULL, &UpKeyOption}, + {"DOWN ", NULL, &DownKeyOption}, + {"LEFT ", NULL, &LeftKeyOption}, + {"RIGHT ", NULL, &RightKeyOption}, + {"A ", NULL, &AKeyOption}, + {"B ", NULL, &BKeyOption}, + {"X ", NULL, &XKeyOption}, + {"Y ", NULL, &YKeyOption}, {"", NULL}, - {"BACK", showOptionsMenu}, + {"BACK", backGamepadMenu}, }; + GamepadMapping = impl.studio.tic->ram.mapping; + studio_menu_init(impl.menu, GamepadMenu, COUNT_OF(GamepadMenu), - 0, COUNT_OF(OptionMenu) - 3, showOptionsMenu, NULL); + 0, COUNT_OF(OptionMenu) - 3, backGamepadMenu, NULL); } static inline bool pointInRect(const tic_point* pt, const tic_rect* rect) @@ -1536,20 +1565,6 @@ bool studioCartChanged() } #endif -tic_key* getKeymap() -{ - return impl.keycodes; -} - -static void processGamepadMapping() -{ - tic_mem* tic = impl.studio.tic; - - for(s32 i = 0; i < KEYMAP_COUNT; i++) - if(impl.keycodes[i] && tic_api_key(tic, impl.keycodes[i])) - tic->ram.input.gamepads.data |= 1 << i; -} - static inline bool isGameMenu() { return (impl.mode == TIC_RUN_MODE || impl.mode == TIC_MENU_MODE) @@ -1714,7 +1729,7 @@ static inline bool keyWasPressedOnce(s32 key) #if defined(CRT_SHADER_SUPPORT) static void switchCrtMonitor() { - impl.config->data.menu.crt = !impl.config->data.menu.crt; + impl.config->data.options.crt = !impl.config->data.options.crt; } #endif @@ -1969,6 +1984,10 @@ static void renderStudio() sfx2ram(&tic->ram, sfx); music2ram(&tic->ram, music); + // restore mapping in all the modes except Run mode + if(impl.mode != TIC_RUN_MODE) + impl.studio.tic->ram.mapping = getConfig()->options.mapping; + tic_core_tick_start(tic); } @@ -1980,7 +1999,7 @@ static void renderStudio() VBANK(tic, 1) { tic_api_cls(tic, 0); - } + } } switch(impl.mode) @@ -2084,22 +2103,6 @@ void studioConfigChanged() tic_sys_update_config(); } -static void initKeymap() -{ - tic_fs* fs = impl.fs; - - s32 size = 0; - u8* data = (u8*)tic_fs_load(fs, KEYMAP_DAT_PATH, &size); - - if(data) - { - if(size == KEYMAP_SIZE) - memcpy(getKeymap(), data, KEYMAP_SIZE); - - free(data); - } -} - static void processMouseStates() { for(s32 i = 0; i < COUNT_OF(impl.mouse.state); i++) @@ -2184,8 +2187,6 @@ static void studioTick() } processMouseStates(); - processGamepadMapping(); - renderStudio(); { @@ -2236,7 +2237,7 @@ static void studioSound() tic_mem* tic = impl.studio.tic; tic_core_synth_sound(tic); - s32 volume = getConfig()->menu.volume; + s32 volume = getConfig()->options.volume; if(volume != MAX_VOLUME) { @@ -2388,7 +2389,6 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) tic_fs_makedir(impl.fs, TIC_LOCAL_VERSION); initConfig(impl.config, impl.studio.tic, impl.fs); - initKeymap(); initStart(impl.start, impl.studio.tic, args.cart); initRunMode(); @@ -2402,14 +2402,14 @@ Studio* studioInit(s32 argc, char **argv, s32 samplerate, const char* folder) impl.config->data.uiScale = args.scale; if(args.volume >= 0) - impl.config->data.menu.volume = args.volume & 0x0f; + impl.config->data.options.volume = args.volume & 0x0f; #if defined(CRT_SHADER_SUPPORT) - impl.config->data.menu.crt |= args.crt; + impl.config->data.options.crt |= args.crt; #endif - impl.config->data.menu.fullscreen |= args.fullscreen; - impl.config->data.menu.vsync |= args.vsync; + impl.config->data.options.fullscreen |= args.fullscreen; + impl.config->data.options.vsync |= args.vsync; impl.config->data.soft |= args.soft; impl.config->data.cli |= args.cli; diff --git a/src/studio/studio.h b/src/studio/studio.h index 294ed7412..3eae6caa2 100644 --- a/src/studio/studio.h +++ b/src/studio/studio.h @@ -54,11 +54,6 @@ #define CONFIG_TIC "config.tic" #define CONFIG_TIC_PATH TIC_LOCAL_VERSION CONFIG_TIC -#define KEYMAP_COUNT (sizeof(tic80_gamepads) * BITS_IN_BYTE) -#define KEYMAP_SIZE (KEYMAP_COUNT) -#define KEYMAP_DAT "keymap.dat" -#define KEYMAP_DAT_PATH TIC_LOCAL_VERSION KEYMAP_DAT - #define CART_EXT ".tic" #define PNG_EXT ".png" @@ -221,8 +216,6 @@ typedef enum void setStudioEvent(StudioEvent event); void showTooltip(const char* text); -tic_key* getKeymap(); - void setSpritePixel(tic_tile* tiles, s32 x, s32 y, u8 color); u8 getSpritePixel(tic_tile* tiles, s32 x, s32 y); diff --git a/src/studio/system.h b/src/studio/system.h index 284bd8398..6f6a2918c 100644 --- a/src/studio/system.h +++ b/src/studio/system.h @@ -123,8 +123,9 @@ typedef struct bool fullscreen; bool vsync; - s32 volume; - } menu; + s32 volume; + tic_mapping mapping; + } options; const tic_cartridge* cart; diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index 4df2dcc1f..84eddded7 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -495,7 +495,7 @@ static void initTouchGamepad() static void initGPU() { - bool vsync = platform.studio->config()->menu.vsync; + bool vsync = platform.studio->config()->options.vsync; bool soft = platform.studio->config()->soft; #if defined(CRT_SHADER_SUPPORT) @@ -1498,7 +1498,7 @@ static void gpuTick() #if defined(CRT_SHADER_SUPPORT) - if(!platform.studio->config()->soft && platform.studio->config()->menu.crt) + if(!platform.studio->config()->soft && platform.studio->config()->options.crt) { if(platform.screen.shader == 0) loadCrtShader(); @@ -1612,14 +1612,14 @@ static s32 start(s32 argc, char **argv, const char* folder) setWindowIcon(); initGPU(); - if(platform.studio->config()->menu.fullscreen) + if(platform.studio->config()->options.fullscreen) tic_sys_fullscreen_set(true); } SDL_PauseAudioDevice(platform.audio.device, 0); #if defined(__EMSCRIPTEN__) - emscripten_set_main_loop(emsGpuTick, platform.studio->config()->menu.vsync ? 0 : TIC80_FRAMERATE, 1); + emscripten_set_main_loop(emsGpuTick, platform.studio->config()->options.vsync ? 0 : TIC80_FRAMERATE, 1); #else { const u64 Delta = SDL_GetPerformanceFrequency() / TIC80_FRAMERATE; diff --git a/src/tic.h b/src/tic.h index f9fd118f3..860ba4267 100644 --- a/src/tic.h +++ b/src/tic.h @@ -507,6 +507,11 @@ typedef struct u32 data[TIC_PERSISTENT_SIZE]; } tic_persistent; +typedef struct +{ + u8 data[sizeof(tic80_gamepads) * BITS_IN_BYTE]; +} tic_mapping; + typedef union { struct @@ -525,6 +530,7 @@ typedef union tic_persistent persistent; tic_flags flags; tic_font font; + tic_mapping mapping; u8 free; }; From 301ef24c0023b9bcebd46abaa964d8fdd9a4d604 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 29 Dec 2021 11:54:04 +0300 Subject: [PATCH 209/379] stub build fix --- CMakeLists.txt | 2 +- src/studio/config.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15373c438..85ce0405b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -427,7 +427,7 @@ macro(MACRO_CORE SCRIPT DEFINE BUILD_DEPRECATED) target_link_libraries(tic80core${SCRIPT} m) endif() - target_compile_definitions(tic80core${SCRIPT} PRIVATE ${DEFINE}) + target_compile_definitions(tic80core${SCRIPT} PUBLIC ${DEFINE}) endmacro() diff --git a/src/studio/config.c b/src/studio/config.c index bb83b58cd..2559687d9 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -211,7 +211,6 @@ static void readConfig(Config* config) { .uiScale = 4, .cart = config->cart, - .theme.cursor = {-1, -1, -1, false}, }; } From eab645cf8ff2892983ee8161e48f8ae797fa2fc3 Mon Sep 17 00:00:00 2001 From: nesbox Date: Wed, 29 Dec 2021 11:56:19 +0300 Subject: [PATCH 210/379] CI Linux changed to 18.04 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c053f5a70..0f652276f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -157,7 +157,7 @@ jobs: # === Ubuntu PRO === linux-pro: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 @@ -195,7 +195,7 @@ jobs: # === Ubuntu === linux: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 From 2a69a633f12d987f9ab5ef9e7f3bc2b7af766fef Mon Sep 17 00:00:00 2001 From: blinry Date: Sun, 19 Dec 2021 16:46:44 +0100 Subject: [PATCH 211/379] Add key/button IDs to exported help --- src/studio/screens/console.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/studio/screens/console.c b/src/studio/screens/console.c index 43c7ab65e..2f5e280e4 100644 --- a/src/studio/screens/console.c +++ b/src/studio/screens/console.c @@ -2922,6 +2922,16 @@ static void onExport_help(Console* console, const char* param, const char* name, FOR(const ApiItem*, api, Api) ptr += sprintf(ptr, "\n### %s\n`%s`\n%s\n", api->name, api->def, api->help); + ptr += sprintf(ptr, "\n## Button IDs\n"); + ptr += sprintf(ptr, "```"); + ptr += createButtonsTable(ptr); + ptr += sprintf(ptr, "```\n"); + + ptr += sprintf(ptr, "\n## Key IDs\n"); + ptr += sprintf(ptr, "```"); + ptr += createKeysTable(ptr); + ptr += sprintf(ptr, "```\n"); + ptr += sprintf(ptr, "\n## Startup options\n```\n"); FOR(const struct StartupOption*, opt, StartupOptions) ptr += sprintf(ptr, "--%-14s %s\n", opt->name, opt->help); From 80089c1097f4cae473f9ffd938979d99fd0f783d Mon Sep 17 00:00:00 2001 From: nesbox Date: Tue, 4 Jan 2022 17:19:33 +0300 Subject: [PATCH 212/379] detect default mapping for non US keyboard #1748 #1339 --- src/studio/config.c | 14 +- src/studio/studio.c | 112 +++---- src/studio/system.h | 1 + src/system/baremetalpi/kernel.cpp | 524 +++++++++++++++--------------- src/system/n3ds/main.c | 16 + src/system/sdl/main.c | 42 ++- src/system/sokol/sokol.c | 16 + 7 files changed, 390 insertions(+), 335 deletions(-) diff --git a/src/studio/config.c b/src/studio/config.c index 2559687d9..2af628898 100644 --- a/src/studio/config.c +++ b/src/studio/config.c @@ -237,21 +237,11 @@ static void setDefault(Config* config) .volume = MAX_VOLUME, .vsync = true, .fullscreen = false, - .mapping = (tic_mapping) - { - tic_key_up, - tic_key_down, - tic_key_left, - tic_key_right, - - tic_key_z, // a - tic_key_x, // b - tic_key_a, // x - tic_key_s, // y - }, }, }; + tic_sys_default_mapping(&config->data.options.mapping); + { static const u8 ConfigZip[] = { diff --git a/src/studio/studio.c b/src/studio/studio.c index c083dcf7c..834405a3a 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1137,8 +1137,8 @@ static void optionFullscreenSet(s32 pos) tic_sys_fullscreen_set(impl.config->data.options.fullscreen = (pos == 1)); } -static const char OffValue[] = " "; -static const char OnValue[] = " "; +static const char OffValue[] = ""; +static const char OnValue[] = " "; static MenuOption FullscreenOption = { @@ -1198,43 +1198,15 @@ static MenuOption VolumeOption = { OPTION_VALUES( { - "<00> ", "<01> ", "<02> ", "<03> ", - "<04> ", "<05> ", "<06> ", "<07> ", - "<08> ", "<09> ", "<10> ", "<11> ", - "<12> ", "<13> ", "<14> ", "<15> ", + "<00> ", "<01> ", "<02> ", "<03> ", + "<04> ", "<05> ", "<06> ", "<07> ", + "<08> ", "<09> ", "<10> ", "<11> ", + "<12> ", "<13> ", "<14> ", "<15> ", }), optionVolumeGet, optionVolumeSet, }; -// !TODO: temp var -static s32 KeyboardPos = 0; - -static s32 optionKeyboardGet() -{ - // !TODO: not impelemnted - return KeyboardPos; -} - -static void optionKeyboardSet(s32 pos) -{ - // !TODO: not impelemnted - KeyboardPos = pos; -} - -static MenuOption KeyboardOption = -{ - OPTION_VALUES( - { - "", - "", - "", - "", - }), - optionKeyboardGet, - optionKeyboardSet, -}; - static void showGamepadMenu(); static const MenuItem OptionMenu[] = @@ -1245,7 +1217,6 @@ static const MenuItem OptionMenu[] = {"VSYNC ", NULL, &VSyncOption, "VSYNC needs restart!"}, {"FULLSCREEN ", NULL, &FullscreenOption}, {"VOLUME ", NULL, &VolumeOption}, - {"KEYBOARD ", NULL, &KeyboardOption}, {"SETUP GAMEPAD", showGamepadMenu}, {"", NULL}, {"BACK", showGameMenu}, @@ -1287,12 +1258,13 @@ static void showOptionsMenu() static const char* KeysList[] = { + "<...> ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "